Atualiza a configuração do Docker para usar SQLite3, incluindo a criação de um novo banco de dados e a modificação do Dockerfile. O README foi atualizado para refletir as mudanças na estrutura do projeto e no uso do servidor. A lógica do código foi adaptada para suportar operações com SQLite3, substituindo o uso anterior do BoltDB.

This commit is contained in:
Luiz Costa
2025-08-29 08:51:44 -03:00
parent 1f53c3e841
commit 9abff0338b
15 changed files with 706 additions and 89 deletions
+109
View File
@@ -0,0 +1,109 @@
// migrate - Script para migrar dados do BoltDB para SQLite3
package main
import (
"crypto/sha256"
"encoding/hex"
"flag"
"fmt"
"log"
"os"
"time"
"database/sql"
"github.com/boltdb/bolt"
_ "modernc.org/sqlite"
)
func main() {
var boltPath, sqlitePath string
flag.StringVar(&boltPath, "bolt", "", "caminho para o arquivo BoltDB")
flag.StringVar(&sqlitePath, "sqlite", "", "caminho para o arquivo SQLite3 de destino")
flag.Parse()
if boltPath == "" || sqlitePath == "" {
fmt.Fprintf(os.Stderr, "Uso: %s -bolt <arquivo_bolt.db> -sqlite <arquivo_sqlite.db>\n", os.Args[0])
os.Exit(1)
}
// Abrir banco BoltDB
boltDB, err := bolt.Open(boltPath, 0600, &bolt.Options{Timeout: 1 * time.Second})
if err != nil {
log.Fatal("Erro ao abrir BoltDB:", err)
}
defer boltDB.Close()
// Abrir banco SQLite3
sqliteDB, err := sql.Open("sqlite", sqlitePath)
if err != nil {
log.Fatal("Erro ao abrir SQLite3:", err)
}
defer sqliteDB.Close()
// Criar tabela no SQLite3
_, err = sqliteDB.Exec(`
CREATE TABLE IF NOT EXISTS pastes (
hash TEXT PRIMARY KEY,
content TEXT NOT NULL,
created_at INTEGER NOT NULL
)
`)
if err != nil {
log.Fatal("Erro ao criar tabela:", err)
}
// Iniciar transação no SQLite3
tx, err := sqliteDB.Begin()
if err != nil {
log.Fatal("Erro ao iniciar transação:", err)
}
// Preparar statement de inserção
stmt, err := tx.Prepare("INSERT OR IGNORE INTO pastes (hash, content, created_at) VALUES (?, ?, ?)")
if err != nil {
log.Fatal("Erro ao preparar statement:", err)
}
defer stmt.Close()
// Migrar dados do BoltDB para SQLite3
count := 0
err = boltDB.View(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("pastes"))
if b == nil {
return fmt.Errorf("bucket 'pastes' não encontrado")
}
return b.ForEach(func(k, v []byte) error {
// Calcular hash SHA-256 do conteúdo
hash := sha256.Sum256(v)
hashStr := hex.EncodeToString(hash[:])
// Inserir no SQLite3
_, err := stmt.Exec(hashStr, string(v), time.Now().Unix())
if err != nil {
return fmt.Errorf("erro ao inserir paste %s: %v", hashStr, err)
}
count++
if count%100 == 0 {
fmt.Printf("Migrados %d pastes...\n", count)
}
return nil
})
})
if err != nil {
tx.Rollback()
log.Fatal("Erro durante migração:", err)
}
// Commit da transação
err = tx.Commit()
if err != nil {
log.Fatal("Erro ao fazer commit:", err)
}
fmt.Printf("Migração concluída! %d pastes migrados com sucesso.\n", count)
}