TinySkin/utils/tx.go
2023-09-02 17:39:58 +08:00

37 lines
658 B
Go

package utils
import (
"context"
"database/sql"
"fmt"
"github.com/xmdhs/authlib-skin/db/mysql"
)
func WithTx(ctx context.Context, opts *sql.TxOptions, q mysql.Querier, db *sql.DB, f func(mysql.Querier) error) error {
w, ok := q.(interface {
WithTx(tx *sql.Tx) *mysql.Queries
})
var tx *sql.Tx
if ok {
var err error
tx, err = db.BeginTx(ctx, opts)
if err != nil {
return fmt.Errorf("WithTx: %w", err)
}
defer tx.Rollback()
q = w.WithTx(tx)
}
err := f(q)
if err != nil {
return fmt.Errorf("WithTx: %w", err)
}
if tx != nil {
err := tx.Commit()
if err != nil {
return fmt.Errorf("WithTx: %w", err)
}
}
return nil
}