68 lines
1 KiB
Go
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
|
|
}
|