package database import ( "context" "database/sql" "fmt" "os" "path/filepath" _ "modernc.org/sqlite" ) // Open configures the one SQLite connection used by the single-replica app and // migrates it before returning it to callers. func Open(ctx context.Context, path string) (*sql.DB, error) { dir := filepath.Dir(path) if dir != "." && dir != "" { if err := os.MkdirAll(dir, 0o755); err != nil { return nil, fmt.Errorf("create database directory: %w", err) } } db, err := sql.Open("sqlite", path) if err != nil { return nil, fmt.Errorf("open database: %w", err) } db.SetMaxOpenConns(1) db.SetMaxIdleConns(1) if _, err := db.ExecContext(ctx, "PRAGMA foreign_keys = ON; PRAGMA busy_timeout = 5000; PRAGMA journal_mode = WAL;"); err != nil { _ = db.Close() return nil, fmt.Errorf("configure database: %w", err) } if err := migrate(ctx, db); err != nil { _ = db.Close() return nil, err } return db, nil }