package dal import ( "context" "database/sql" _ "modernc.org/sqlite" ) type DAL struct { db *sql.DB } func NewDAL(dsn string) (*DAL, error) { var err error dal := &DAL{} dal.db, err = sql.Open("sqlite", dsn) if err != nil { return nil, err } return dal, nil } func (p *DAL) Close() error { return p.db.Close() } func (p *DAL) InReadWriteTransaction(ctx context.Context, fn func(tx *sql.Tx) error) error { tx, err := p.db.BeginTx(ctx, &sql.TxOptions{}) if err != nil { return err } if err = fn(tx); err != nil { if err2 := tx.Rollback(); err2 != nil { return err2 } return err } if err = tx.Commit(); err != nil { return err } return nil } func (p *DAL) InReadOnlyTransaction(ctx context.Context, fn func(tx *sql.Tx) error) error { tx, err := p.db.BeginTx(ctx, &sql.TxOptions{ReadOnly: true}) if err != nil { return err } if err = fn(tx); err != nil { if err2 := tx.Rollback(); err2 != nil { return err2 } return err } if err = tx.Commit(); err != nil { return err } return nil }