graphicek/server/database/database.go

53 lines
1.1 KiB
Go
Raw Normal View History

2022-08-23 21:26:42 +02:00
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
}