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  }