graphicek/server/database/database.go

67 lines
1.2 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
}
2022-09-03 21:35:15 +02:00
tx, err := db.Begin()
if err != nil {
return nil, err
}
defer tx.Rollback()
_, err = tx.Exec(migrationSource)
2022-08-23 21:26:42 +02:00
if err != nil {
return nil, fmt.Errorf("failed to run migration %s: %w", migrationId, err)
}
2022-09-03 21:35:15 +02:00
_, err = tx.Exec("INSERT INTO migrations (id, run_at) VALUES (?, ?)", migrationId, time.Now().Unix())
2022-08-23 21:26:42 +02:00
if err != nil {
return nil, fmt.Errorf("failed to store run migration: %w", err)
}
2022-09-03 21:35:15 +02:00
err = tx.Commit()
if err != nil {
return nil, err
}
2022-08-23 21:26:42 +02:00
}
return db, nil
}