package infra import ( "database/sql" "fmt" _ "github.com/mattn/go-sqlite3" ) // SQLiteOpen opens (or creates) a SQLite database file with WAL mode and // foreign key support enabled. Returns a ready-to-use *sql.DB or an error. // Pass ":memory:" for an in-memory database. func SQLiteOpen(path string) (*sql.DB, error) { if path == "" { return nil, fmt.Errorf("sqlite_open: path must not be empty (use ':memory:' for in-memory)") } dsn := fmt.Sprintf("file:%s?_journal_mode=WAL&_foreign_keys=on", path) db, err := sql.Open("sqlite3", dsn) if err != nil { return nil, fmt.Errorf("sqlite_open: open %q: %w", path, err) } if err := db.Ping(); err != nil { db.Close() return nil, fmt.Errorf("sqlite_open: ping %q: %w", path, err) } return db, nil }