github.com/oinume/lekcije@v0.0.0-20231017100347-5b4c5eb6ab24/backend/domain/repository/repository.go (about) 1 package repository 2 3 import ( 4 "context" 5 "database/sql" 6 ) 7 8 // Executor can perform SQL queries. It's for abstraction of database/sql.DB 9 type Executor interface { 10 Exec(query string, args ...interface{}) (sql.Result, error) 11 Query(query string, args ...interface{}) (*sql.Rows, error) 12 QueryRow(query string, args ...interface{}) *sql.Row 13 ExecContext(ctx context.Context, query string, args ...interface{}) (sql.Result, error) 14 QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) 15 QueryRowContext(ctx context.Context, query string, args ...interface{}) *sql.Row 16 } 17 18 type TxBeginner interface { 19 BeginTx(ctx context.Context, opts *sql.TxOptions) (*sql.Tx, error) 20 Begin() (*sql.Tx, error) 21 } 22 23 func Transaction(ctx context.Context, txb TxBeginner, f func(tx Executor) error) error { 24 return TransactionWithOptions(ctx, txb, &sql.TxOptions{}, f) 25 } 26 27 func TransactionWithOptions(ctx context.Context, txb TxBeginner, opts *sql.TxOptions, f func(tx Executor) error) error { 28 tx, err := txb.BeginTx(ctx, opts) 29 if err != nil { 30 return err 31 } 32 if err := f(tx); err != nil { 33 if err := tx.Rollback(); err != nil { 34 return err 35 } 36 return err 37 } 38 return tx.Commit() 39 } 40 41 type DB interface { 42 Transaction(ctx context.Context, f func(exec Executor) error) error 43 TransactionWithOptions(ctx context.Context, opts *sql.TxOptions, f func(exec Executor) error) error 44 }