package database import ( "database/sql" "fmt" "time" _ "modernc.org/sqlite" ) // Open creates a *sql.DB for a SQLite database file with sensible defaults. func Open(dbPath string) (*sql.DB, error) { db, err := sql.Open("sqlite", dbPath) if err != nil { return nil, fmt.Errorf("sql.Open: %w", err) } db.SetMaxOpenConns(1) db.SetMaxIdleConns(1) db.SetConnMaxLifetime(0) // Enable WAL mode and busy timeout for better concurrency. for _, pragma := range []string{ "PRAGMA journal_mode=WAL", "PRAGMA busy_timeout=5000", "PRAGMA foreign_keys=ON", } { if _, err := db.Exec(pragma); err != nil { db.Close() return nil, fmt.Errorf("%s: %w", pragma, err) } } if err := db.Ping(); err != nil { db.Close() return nil, fmt.Errorf("ping: %w", err) } return db, nil } // SetPoolForTest overrides pool settings (useful in tests with in-memory DBs). func SetPoolForTest(db *sql.DB) { db.SetMaxOpenConns(1) db.SetMaxIdleConns(1) db.SetConnMaxLifetime(10 * time.Minute) }