package db import ( "context" "database/sql" "fmt" "os" "path/filepath" _ "modernc.org/sqlite" ) type DB struct { *sql.DB } func Open(path string) (*DB, error) { if dir := filepath.Dir(path); dir != "" && dir != "." { if err := os.MkdirAll(dir, 0o755); err != nil { return nil, fmt.Errorf("create db dir: %w", err) } } dsn := fmt.Sprintf("file:%s?_pragma=journal_mode(WAL)&_pragma=busy_timeout(5000)&_pragma=foreign_keys(ON)&_pragma=synchronous(NORMAL)", path) sqlDB, err := sql.Open("sqlite", dsn) if err != nil { return nil, fmt.Errorf("open sqlite: %w", err) } sqlDB.SetMaxOpenConns(1) if err := sqlDB.Ping(); err != nil { _ = sqlDB.Close() return nil, fmt.Errorf("ping sqlite: %w", err) } return &DB{DB: sqlDB}, nil } func (d *DB) Ping(ctx context.Context) error { return d.DB.PingContext(ctx) } func (d *DB) Close() error { return d.DB.Close() }