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}