package database import ( "database/sql" "fmt" "os" "path/filepath" _ "modernc.org/sqlite" ) func Open(path string) (*sql.DB, error) { if dir := filepath.Dir(path); dir != "." && dir != "" { if err := os.MkdirAll(dir, 0755); err != nil { return nil, fmt.Errorf("create db directory %q: %w", dir, err) } } db, err := sql.Open("sqlite", path) if err != nil { return nil, fmt.Errorf("open sqlite %q: %w", path, err) } pragmas := []string{ "PRAGMA journal_mode=WAL", "PRAGMA foreign_keys=ON", "PRAGMA busy_timeout=5000", } for _, p := range pragmas { if _, err := db.Exec(p); err != nil { db.Close() return nil, fmt.Errorf("exec %q: %w", p, err) } } if err := db.Ping(); err != nil { db.Close() return nil, fmt.Errorf("ping sqlite %q: %w", path, err) } return db, nil }