# 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 