fermentord/internal/dal/db.go

69 lines
1 KiB
Go
Raw Normal View History

2021-08-10 21:29:24 +00:00
package dal
import (
2021-11-16 05:19:24 +00:00
"context"
2021-08-10 21:29:24 +00:00
"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
}
2021-11-16 05:19:24 +00:00
func (p *DAL) Close() error {
return p.db.Close()
2021-08-10 21:29:24 +00:00
}
2021-11-16 05:19:24 +00:00
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
}
2021-08-10 21:29:24 +00:00
return nil
}
2021-11-16 05:19:24 +00:00
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
2021-08-10 21:29:24 +00:00
}