2025-06-18 17:50:02 +08:00

50 lines
1.2 KiB
Go

package sqldb
import (
"fmt"
"github.com/jmoiron/sqlx"
)
// Beginner represents a value that can begin a transaction.
type Beginner interface {
Begin() (CommitRollbacker, error)
}
// CommitRollbacker represents a value that can commit or rollback a transaction.
type CommitRollbacker interface {
Commit() error
Rollback() error
}
// =============================================================================
// DBBeginner implements the Beginner interface,
type DBBeginner struct {
sqlxDB *sqlx.DB
}
// NewBeginner constructs a value that implements the beginner interface.
func NewBeginner(sqlxDB *sqlx.DB) *DBBeginner {
return &DBBeginner{
sqlxDB: sqlxDB,
}
}
// Begin implements the Beginner interface and returns a concrete value that
// implements the CommitRollbacker interface.
func (db *DBBeginner) Begin() (CommitRollbacker, error) {
return db.sqlxDB.Beginx()
}
// GetExtContext is a helper function that extracts the sqlx value
// from the domain transactor interface for transactional use.
func GetExtContext(tx CommitRollbacker) (sqlx.ExtContext, error) {
ec, ok := tx.(sqlx.ExtContext)
if !ok {
return nil, fmt.Errorf("Transactor(%T) not of a type *sql.Tx", tx)
}
return ec, nil
}