package db import ( "database/sql" "fmt" "strings" _ "modernc.org/sqlite" ) // OpenSQLite opens (creating if needed) a SQLite database tuned for a single // writer with concurrent readers: WAL journalling, a busy timeout so writers // wait instead of failing, and enforced foreign keys. func OpenSQLite(path string) (*sql.DB, error) { if strings.TrimSpace(path) == "" { return nil, fmt.Errorf("sqlite path is required") } dsn := fmt.Sprintf( "file:%s?_pragma=journal_mode(WAL)&_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)&_pragma=synchronous(NORMAL)&_txlock=immediate", path, ) db, err := sql.Open("sqlite", dsn) if err != nil { return nil, fmt.Errorf("open sqlite: %w", err) } if err := db.Ping(); err != nil { _ = db.Close() return nil, fmt.Errorf("ping sqlite: %w", err) } return db, nil }