# Guia de Migração via Arquivo SQL

## Visão Geral

Este guia descreve como migrar dados do BoltDB para SQLite3 usando arquivos SQL com comandos INSERT. Esta abordagem oferece mais controle e transparência no processo de migração.

## Vantagens da Migração via SQL

1. **Transparência**: Você pode ver exatamente quais dados serão migrados
2. **Controle**: Pode editar o arquivo SQL antes de aplicar
3. **Reversibilidade**: Pode aplicar a migração múltiplas vezes
4. **Auditoria**: Arquivo SQL serve como log da migração
5. **Flexibilidade**: Pode aplicar em diferentes bancos

## Processo de Migração

### Passo 1: Gerar Arquivo SQL

#### Windows (PowerShell)
```powershell
# Executar script de migração
powershell -ExecutionPolicy Bypass -File scripts/migrate-to-sql.ps1
```

#### Linux/Mac (Bash)
```bash
# Tornar script executável
chmod +x scripts/migrate-to-sql.sh

# Executar script de migração
./scripts/migrate-to-sql.sh
```

#### Manual (Go)
```bash
# Compilar e executar manualmente
go build -o migrate-to-sql cmd/migrate-to-sql/main.go
./migrate-to-sql -bolt data/yasuc.db -output data/migration.sql
```

### Passo 2: Verificar Arquivo SQL

O arquivo gerado terá a estrutura:
```sql
-- Script de migração do BoltDB para SQLite3
-- Gerado automaticamente em 29/08/2025 09:34:37

-- Criar tabela se não existir
CREATE TABLE IF NOT EXISTS pastes (
    short_id TEXT PRIMARY KEY,
    content TEXT NOT NULL,
    content_hash TEXT NOT NULL,
    created_at INTEGER NOT NULL
);

-- Criar índices
CREATE INDEX IF NOT EXISTS idx_pastes_content_hash ON pastes(content_hash);
CREATE INDEX IF NOT EXISTS idx_pastes_created_at ON pastes(created_at);

-- Inserir dados migrados
INSERT OR IGNORE INTO pastes (short_id, content, content_hash, created_at) VALUES ('HNlNSpd', 'conteúdo do paste...', 'hash_sha256', 1756470877);

-- Resumo da migração:
-- Total de pastes processados: 80
-- Pastes únicos inseridos: 80
-- Duplicatas ignoradas: 0
-- Arquivo gerado em: 29/08/2025 09:34:37
```

### Passo 3: Aplicar Migração

#### Windows (PowerShell)
```powershell
# Aplicar migração automática (usa arquivo mais recente)
powershell -ExecutionPolicy Bypass -File scripts/apply-migration.ps1

# Ou especificar arquivo específico
powershell -ExecutionPolicy Bypass -File scripts/apply-migration.ps1 "data/migration_20250829_093437.sql"
```

#### Linux/Mac (Bash)
```bash
# Tornar script executável
chmod +x scripts/apply-migration.sh

# Aplicar migração automática
./scripts/apply-migration.sh

# Ou especificar arquivo específico
./scripts/apply-migration.sh data/migration_20250829_093437.sql
```

#### Manual (SQLite3)
```bash
# Aplicar diretamente com sqlite3
sqlite3 data/yasuc.sqlite3 < data/migration_20250829_093437.sql
```

## Estrutura do Arquivo SQL

### Cabeçalho
- Comentários com data/hora de geração
- Comandos CREATE TABLE e CREATE INDEX
- Instruções de uso

### Dados Migrados
- Comandos INSERT OR IGNORE para cada paste
- IDs curtos únicos gerados automaticamente
- Hash SHA-256 para detecção de duplicatas
- Timestamp de criação

### Resumo
- Estatísticas da migração
- Contadores de pastes processados
- Informações sobre duplicatas

## Características da Migração

### Geração de IDs Curtos
- **7 caracteres**: Letras maiúsculas, minúsculas e números
- **Únicos**: Verificação contra IDs já utilizados
- **Aleatórios**: Geração não sequencial

### Detecção de Duplicatas
- **Hash SHA-256**: Calculado do conteúdo de cada paste
- **Mapeamento**: Hash → ID curto para pastes idênticos
- **Ignorar**: Duplicatas não geram novos INSERTs

### Tratamento de Conteúdo
- **Escape de aspas**: Aspas simples escapadas para SQL
- **Preservação**: Conteúdo original mantido intacto
- **Encoding**: Suporte a caracteres especiais

## Verificação da Migração

### Verificar Estatísticas
```sql
-- Contar total de pastes
SELECT COUNT(*) FROM pastes;

-- Verificar tamanho total
SELECT SUM(LENGTH(content)) FROM pastes;

-- Verificar alguns pastes
SELECT short_id, substr(content, 1, 50) FROM pastes LIMIT 5;
```

### Verificar Duplicatas
```sql
-- Verificar se há duplicatas por conteúdo
SELECT content_hash, COUNT(*) as count 
FROM pastes 
GROUP BY content_hash 
HAVING count > 1;
```

### Verificar Índices
```sql
-- Verificar índices criados
SELECT name, sql FROM sqlite_master WHERE type = 'index';
```

## Troubleshooting

### Problemas Comuns

#### Erro: "database is locked"
```bash
# Verificar se não há outro processo usando o banco
# Fechar aplicações que possam estar usando o SQLite3
```

#### Erro: "no such table"
```bash
# Verificar se o arquivo SQL contém CREATE TABLE
# Aplicar novamente o arquivo SQL
```

#### Erro: "disk full"
```bash
# Verificar espaço em disco
# Considerar limpar dados antigos antes da migração
```

#### Erro: "file too large"
```bash
# Dividir arquivo SQL em partes menores
# Usar streaming para arquivos muito grandes
```

### Logs e Debugging

#### Verificar Progresso
```bash
# Verificar tamanho do arquivo SQL
ls -lh data/migration_*.sql

# Verificar conteúdo do arquivo
head -20 data/migration_*.sql
tail -10 data/migration_*.sql
```

#### Verificar Banco SQLite3
```bash
# Verificar integridade do banco
sqlite3 data/yasuc.sqlite3 "PRAGMA integrity_check;"

# Verificar estatísticas
sqlite3 data/yasuc.sqlite3 "SELECT COUNT(*) as total FROM pastes;"
```

## Backup e Segurança

### Backup Automático
- Scripts fazem backup automático do banco existente
- Arquivo de backup com timestamp
- Preservação de dados originais

### Verificação de Integridade
```bash
# Verificar se backup foi criado
ls -la data/yasuc.sqlite3.backup.*

# Restaurar backup se necessário
cp data/yasuc.sqlite3.backup.* data/yasuc.sqlite3
```

## Exemplos de Uso

### Migração Completa
```bash
# 1. Gerar arquivo SQL
./scripts/migrate-to-sql.sh

# 2. Verificar arquivo gerado
head -20 data/migration_*.sql

# 3. Aplicar migração
./scripts/apply-migration.sh

# 4. Verificar resultado
sqlite3 data/yasuc.sqlite3 "SELECT COUNT(*) FROM pastes;"
```

### Migração com Verificação
```bash
# 1. Gerar SQL
./scripts/migrate-to-sql.sh

# 2. Editar arquivo SQL se necessário
nano data/migration_*.sql

# 3. Aplicar com backup
./scripts/apply-migration.sh

# 4. Testar aplicação
./yasuc -db data/yasuc.sqlite3 -port 8080
```

### Migração Incremental
```bash
# 1. Fazer backup do banco atual
cp data/yasuc.sqlite3 data/yasuc.sqlite3.backup

# 2. Gerar SQL apenas de novos dados
# (modificar script para filtrar por data)

# 3. Aplicar migração incremental
./scripts/apply-migration.sh
```

## Considerações de Performance

### Para Bancos Grandes
- **Memória**: Script usa memória proporcional ao número de pastes
- **Tempo**: Migração pode levar alguns minutos para bancos grandes
- **Arquivo**: Arquivo SQL pode ser muito grande

### Otimizações
- **Batch processing**: Processar em lotes para bancos muito grandes
- **Streaming**: Usar streaming para evitar carregar tudo na memória
- **Compression**: Comprimir arquivo SQL se necessário

## Próximos Passos

Após a migração bem-sucedida:
1. **Testar aplicação**: Verificar se tudo funciona corretamente
2. **Verificar dados**: Confirmar que todos os pastes foram migrados
3. **Limpar backups**: Remover arquivos temporários se necessário
4. **Documentar**: Registrar detalhes da migração 