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:
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user