50 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			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
 | |
| }
 |