From f9bdf0302aeba0cd8ac0f40aeb00a85a5c3a2c76 Mon Sep 17 00:00:00 2001 From: MURAOKA Taro Date: Sat, 4 Jul 2020 13:56:52 +0900 Subject: [PATCH] add hooks for Commit and Rollback Related issue: https://gitea.com/xorm/xorm/issues/1732 --- core/tx.go | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/core/tx.go b/core/tx.go index 9b2988af..a85a6874 100644 --- a/core/tx.go +++ b/core/tx.go @@ -18,7 +18,8 @@ var ( // Tx represents a transaction type Tx struct { *sql.Tx - db *DB + db *DB + ctx context.Context } func (db *DB) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) { @@ -32,13 +33,41 @@ func (db *DB) BeginTx(ctx context.Context, opts *sql.TxOptions) (*Tx, error) { if err := db.afterProcess(hookCtx); err != nil { return nil, err } - return &Tx{tx, db}, nil + return &Tx{tx, db, ctx}, nil } func (db *DB) Begin() (*Tx, error) { return db.BeginTx(context.Background(), nil) } +func (tx *Tx) Commit() error { + hookCtx := contexts.NewContextHook(tx.ctx, "COMMIT", nil) + ctx, err := tx.db.beforeProcess(hookCtx) + if err != nil { + return err + } + err = tx.Tx.Commit() + hookCtx.End(ctx, nil, err) + if err := tx.db.afterProcess(hookCtx); err != nil { + return err + } + return nil +} + +func (tx *Tx) Rollback() error { + hookCtx := contexts.NewContextHook(tx.ctx, "ROLLBACK", nil) + ctx, err := tx.db.beforeProcess(hookCtx) + if err != nil { + return err + } + err = tx.Tx.Rollback() + hookCtx.End(ctx, nil, err) + if err := tx.db.afterProcess(hookCtx); err != nil { + return err + } + return nil +} + func (tx *Tx) PrepareContext(ctx context.Context, query string) (*Stmt, error) { names := make(map[string]int) var i int -- 2.40.1