fermentord/internal/dal/db.go
2021-11-17 22:30:18 +01:00

68 lines
1 KiB
Go

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
}