53 lines
1.1 KiB
Go
53 lines
1.1 KiB
Go
package database
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
func Initialize(databaseUrl string) (*sql.DB, error) {
|
|
db, err := sql.Open("sqlite3", databaseUrl)
|
|
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to open database connection: %w", err)
|
|
}
|
|
|
|
_, err = db.Exec(`CREATE TABLE IF NOT EXISTS migrations (
|
|
id TEXT NOT NULL,
|
|
run_at INTEGER NOT NULL
|
|
);`)
|
|
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to initialize migrations table: %w", err)
|
|
}
|
|
|
|
pendingMigrations, err := getPendingMigrations(db)
|
|
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to get pending migrations: %w", err)
|
|
}
|
|
|
|
for _, migrationId := range pendingMigrations {
|
|
migrationSource, err := getMigrationContent(migrationId)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
_, err = db.Exec(migrationSource)
|
|
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to run migration %s: %w", migrationId, err)
|
|
}
|
|
|
|
_, err = db.Exec("INSERT INTO migrations (id, run_at) VALUES (?, ?)", migrationId, time.Now().Unix())
|
|
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to store run migration: %w", err)
|
|
}
|
|
}
|
|
|
|
return db, nil
|
|
}
|