# Migração para SQLite3 com IDs Curtos Este documento descreve como migrar o YASUC de BoltDB para SQLite3 com o novo sistema de IDs curtos. ## Por que migrar para SQLite3 com IDs Curtos? - **URLs mais amigáveis**: IDs de 7 caracteres em vez de hashes SHA-256 de 64 caracteres - **Melhor compatibilidade**: SQLite3 é mais amplamente suportado - **Ferramentas de administração**: Mais ferramentas disponíveis para gerenciar dados - **Consultas SQL**: Possibilidade de fazer consultas complexas - **Backup mais simples**: Arquivo único mais fácil de fazer backup - **Detecção de duplicatas**: Pastes idênticos recebem o mesmo ID curto ## Estrutura do Banco SQLite3 ```sql CREATE TABLE pastes ( short_id TEXT PRIMARY KEY, -- ID curto único (7 caracteres) content TEXT NOT NULL, -- Conteúdo do paste content_hash TEXT NOT NULL, -- Hash SHA-256 para detecção de duplicatas created_at INTEGER NOT NULL -- Timestamp de criação ); ``` ## Sistema de IDs Curtos ### Características: - **7 caracteres**: Combinação de letras maiúsculas, minúsculas e números (a-z, A-Z, 0-9) - **62^7 possibilidades**: Aproximadamente 3.5 trilhões de combinações únicas - **Detecção de duplicatas**: Pastes idênticos recebem o mesmo ID - **Geração aleatória**: IDs são gerados aleatoriamente para evitar previsibilidade ### Exemplo de URLs: - **Antes**: `http://localhost:8080/a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447` - **Agora**: `http://localhost:8080/Ly34kx3` ## Passos para Migração ### 1. Backup dos Dados Atuais ```bash # Fazer backup do banco BoltDB atual cp data/yasuc.db data/yasuc.db.backup.$(date +%Y%m%d_%H%M%S) ``` ### 2. Executar Script de Migração ```bash # Executar o script de migração automática chmod +x scripts/migrate.sh ./scripts/migrate.sh ``` ### 3. Migração Manual (Opcional) Se você quiser migrar dados existentes do BoltDB para SQLite3: ```bash # Compilar e executar o script de migração go run cmd/migrate/main.go -bolt data/yasuc.db -sqlite data/yasuc.sqlite3 ``` **Nota**: Durante a migração, cada paste do BoltDB receberá um novo ID curto. URLs antigas não funcionarão mais. ### 4. Testar a Aplicação ```bash # Reconstruir e executar o container docker-compose down docker-compose up --build ``` ## Verificação da Migração ### Verificar se o banco SQLite3 foi criado: ```bash sqlite3 data/yasuc.sqlite3 ".tables" ``` ### Verificar estrutura da tabela: ```bash sqlite3 data/yasuc.sqlite3 ".schema pastes" ``` ### Contar número de pastes: ```bash sqlite3 data/yasuc.sqlite3 "SELECT COUNT(*) FROM pastes;" ``` ### Verificar IDs curtos gerados: ```bash sqlite3 data/yasuc.sqlite3 "SELECT short_id, substr(content, 1, 50) FROM pastes LIMIT 5;" ``` ## Rollback (se necessário) Se algo der errado, você pode voltar ao BoltDB: 1. Restaurar o backup: `cp data/yasuc.db.backup.* data/yasuc.db` 2. Reverter o código para a versão anterior 3. Reconstruir o container ## Vantagens do SQLite3 com IDs Curtos 1. **URLs mais amigáveis**: Fáceis de compartilhar e digitar 2. **Consultas SQL**: Você pode fazer consultas como: ```sql -- Encontrar pastes criados hoje SELECT * FROM pastes WHERE date(created_at, 'unixepoch') = date('now'); -- Encontrar pastes maiores que 1KB SELECT short_id, length(content) as size FROM pastes WHERE length(content) > 1024; -- Verificar duplicatas SELECT content_hash, COUNT(*) as count FROM pastes GROUP BY content_hash HAVING count > 1; ``` 3. **Backup mais simples**: Um único arquivo 4. **Ferramentas de administração**: SQLite Browser, DBeaver, etc. 5. **Melhor performance**: Para consultas complexas ## Notas Importantes - **URLs antigas não funcionam**: Pastes migrados terão novos IDs curtos - **Detecção de duplicatas**: Pastes idênticos recebem o mesmo ID - **Tamanho máximo**: O tamanho máximo de paste (4MB) permanece inalterado - **Compatibilidade**: A API permanece a mesma, apenas os IDs mudaram ## Troubleshooting ### Erro: "database is locked" - Verifique se não há outro processo usando o banco - Reinicie o container: `docker-compose restart` ### Erro: "no such table" - Execute o script de migração novamente - Verifique se o arquivo SQLite3 foi criado corretamente ### Erro: "não foi possível gerar um ID único" - Extremamente raro, mas pode acontecer se houver muitas colisões - O sistema tenta 100 vezes antes de falhar - Considere aumentar o `maxAttempts` no código se necessário ### Performance lenta - Considere adicionar índices se necessário - Verifique se o volume Docker está configurado corretamente