package main import ( "database/sql" "fmt" "log" _ "github.com/lib/pq" ) func main() { dsn := "host=localhost port=5432 user=postgres password=postgres dbname=trustlog sslmode=disable" db, err := sql.Open("postgres", dsn) if err != nil { log.Fatalf("Failed to connect: %v", err) } defer db.Close() if err := db.Ping(); err != nil { log.Fatalf("Failed to ping: %v", err) } fmt.Println("πŸ”„ Migrating PostgreSQL schema...") // εˆ ι™€ζ—§θ‘¨ fmt.Println(" Dropping old tables...") _, err = db.Exec("DROP TABLE IF EXISTS trustlog_retry") if err != nil { log.Printf("Warning: Failed to drop retry table: %v", err) } _, err = db.Exec("DROP TABLE IF EXISTS operation") if err != nil { log.Printf("Warning: Failed to drop operation table: %v", err) } _, err = db.Exec("DROP TABLE IF EXISTS trustlog_cursor") if err != nil { log.Printf("Warning: Failed to drop cursor table: %v", err) } // ι‡ζ–°εˆ›ε»Ίθ‘¨ fmt.Println(" Creating new tables...") _, err = db.Exec(` CREATE TABLE IF NOT EXISTS operation ( op_id VARCHAR(32) NOT NULL PRIMARY KEY, op_actor VARCHAR(64), doid VARCHAR(512), producer_id VARCHAR(32), request_body_hash VARCHAR(128), response_body_hash VARCHAR(128), op_hash VARCHAR(128), sign VARCHAR(512), op_source VARCHAR(10), op_type VARCHAR(30), do_prefix VARCHAR(128), do_repository VARCHAR(64), client_ip VARCHAR(32), server_ip VARCHAR(32), trustlog_status VARCHAR(32), timestamp TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )`) if err != nil { log.Fatalf("Failed to create operation table: %v", err) } _, err = db.Exec(` CREATE INDEX IF NOT EXISTS idx_operation_timestamp ON operation(timestamp)`) if err != nil { log.Printf("Warning: Failed to create timestamp index: %v", err) } _, err = db.Exec(` CREATE INDEX IF NOT EXISTS idx_operation_trustlog_status ON operation(trustlog_status)`) if err != nil { log.Printf("Warning: Failed to create status index: %v", err) } _, err = db.Exec(` CREATE INDEX IF NOT EXISTS idx_operation_created_at ON operation(created_at)`) if err != nil { log.Printf("Warning: Failed to create created_at index: %v", err) } _, err = db.Exec(` CREATE TABLE IF NOT EXISTS trustlog_cursor ( cursor_key VARCHAR(64) NOT NULL PRIMARY KEY, cursor_value TEXT NOT NULL, last_updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )`) if err != nil { log.Fatalf("Failed to create cursor table: %v", err) } _, err = db.Exec(` CREATE TABLE IF NOT EXISTS trustlog_retry ( op_id VARCHAR(32) NOT NULL PRIMARY KEY, retry_count INTEGER DEFAULT 0, retry_status VARCHAR(32) DEFAULT 'PENDING', last_retry_at TIMESTAMP, next_retry_at TIMESTAMP, error_message TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )`) if err != nil { log.Fatalf("Failed to create retry table: %v", err) } _, err = db.Exec(` CREATE INDEX IF NOT EXISTS idx_retry_next_retry_at ON trustlog_retry(next_retry_at)`) if err != nil { log.Printf("Warning: Failed to create retry time index: %v", err) } _, err = db.Exec(` CREATE INDEX IF NOT EXISTS idx_retry_retry_status ON trustlog_retry(retry_status)`) if err != nil { log.Printf("Warning: Failed to create retry status index: %v", err) } fmt.Println("βœ… Schema migration completed!") }