dendrite.nvim/persistence/repositories/uow.go

54 lines
1.1 KiB
Go

package repositories
import (
"database/sql"
"github.com/KristianJBorgwarth/dendrite.daemon/persistence"
"github.com/KristianJBorgwarth/dendrite.daemon/persistence/store"
)
type UnitOfWork struct {
dbContext *sql.DB
Transaction *sql.Tx
FileStore *store.FileStore
}
func NewUnitOfWork() *UnitOfWork {
db, err := persistence.GetDBContext()
if err != nil {
panic("failed to get DB context: " + err.Error())
}
return &UnitOfWork{dbContext: db.DB, FileStore: store.NewFileStore()}
}
func (u *UnitOfWork) Begin() (tx *sql.Tx, err error) {
tx, err = u.dbContext.Begin()
if err != nil {
return nil, err
}
u.Transaction = tx
return tx, nil
}
func (u *UnitOfWork) Commit() error {
if err := u.FileStore.Flush(); err != nil {
u.Transaction.Rollback()
u.Transaction = nil
return err
}
if err := u.Transaction.Commit(); err != nil {
u.FileStore.Rollback()
u.Transaction = nil
return err
}
u.Transaction = nil
return nil
}
func (u *UnitOfWork) Rollback() {
if u.Transaction == nil {
return
}
u.Transaction.Rollback()
u.FileStore.Rollback()
}