fncConvertGui/internal/database/database.go
2026-02-25 23:17:08 +01:00

48 lines
1005 B
Go

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)
}