package sq import ( "context" "database/sql" "github.com/jmoiron/sqlx" "gogs.mikescher.com/BlackForestBytes/goext/langext" ) type Tx interface { Rollback() error Commit() error Exec(ctx context.Context, sql string, prep PP) (sql.Result, error) Query(ctx context.Context, sql string, prep PP) (*sqlx.Rows, error) } type transaction struct { tx *sqlx.Tx id uint16 lstr Listener } func NewTransaction(xtx *sqlx.Tx, txid uint16, lstr Listener) Tx { return &transaction{ tx: xtx, id: txid, lstr: lstr, } } func (tx *transaction) Rollback() error { if tx.lstr != nil { tx.lstr.OnTxRollback(tx.id) } return tx.tx.Rollback() } func (tx *transaction) Commit() error { if tx.lstr != nil { tx.lstr.OnTxCommit(tx.id) } return tx.tx.Commit() } func (tx *transaction) Exec(ctx context.Context, sql string, prep PP) (sql.Result, error) { if tx.lstr != nil { tx.lstr.OnExec(langext.Ptr(tx.id), &sql, &prep) } res, err := tx.tx.NamedExecContext(ctx, sql, prep) if err != nil { return nil, err } return res, nil } func (tx *transaction) Query(ctx context.Context, sql string, prep PP) (*sqlx.Rows, error) { if tx.lstr != nil { tx.lstr.OnQuery(langext.Ptr(tx.id), &sql, &prep) } rows, err := sqlx.NamedQueryContext(ctx, tx.tx, sql, prep) if err != nil { return nil, err } return rows, nil }