connect.go

 1package db
 2
 3import (
 4	"context"
 5	"database/sql"
 6	"fmt"
 7	"log/slog"
 8	"path/filepath"
 9
10	"github.com/pressly/goose/v3"
11)
12
13// Connect opens a SQLite database connection and runs migrations.
14func Connect(ctx context.Context, dataDir string) (*sql.DB, error) {
15	if dataDir == "" {
16		return nil, fmt.Errorf("data.dir is not set")
17	}
18	dbPath := filepath.Join(dataDir, "crush.db")
19
20	db, err := openDB(dbPath)
21	if err != nil {
22		return nil, err
23	}
24
25	if err = db.PingContext(ctx); err != nil {
26		db.Close()
27		return nil, fmt.Errorf("failed to connect to database: %w", err)
28	}
29
30	goose.SetBaseFS(FS)
31
32	if err := goose.SetDialect("sqlite3"); err != nil {
33		slog.Error("Failed to set dialect", "error", err)
34		return nil, fmt.Errorf("failed to set dialect: %w", err)
35	}
36
37	if err := goose.Up(db, "migrations"); err != nil {
38		slog.Error("Failed to apply migrations", "error", err)
39		return nil, fmt.Errorf("failed to apply migrations: %w", err)
40	}
41
42	return db, nil
43}