package storage import ( "database/sql" "os" "path/filepath" _ "modernc.org/sqlite" ) type DB struct { *sql.DB } func Open(path string) (*DB, error) { dir := filepath.Dir(path) if err := os.MkdirAll(dir, 0755); err != nil { return nil, err } db, err := sql.Open("sqlite", path+"?_pragma=journal_mode(WAL)&_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)") if err != nil { return nil, err } if err := db.Ping(); err != nil { return nil, err } return &DB{db}, nil } func (db *DB) Migrate() error { for _, m := range migrations { if err := db.Exec(m); err != nil { return err } } return nil } func (db *DB) Exec(query string, args ...interface{}) error { _, err := db.DB.Exec(query, args...) return err } func (db *DB) Query(query string, args ...interface{}) (*sql.Rows, error) { return db.DB.Query(query, args...) } func (db *DB) QueryRow(query string, args ...interface{}) *sql.Row { return db.DB.QueryRow(query, args...) } func (db *DB) Close() error { return db.DB.Close() }