From 144245268ddce82b3734281fd1a3fbc09793209e Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Wed, 20 Jul 2016 19:32:55 -0700 Subject: [PATCH] Provide onTransaction* callbacks with the transaction result This can later be used to cancel certain deferred updates. Change-Id: Ib6649b6ca400f15ff441531d0fd6aecc3e4619eb --- includes/db/Database.php | 13 +++++++------ includes/db/IDatabase.php | 11 +++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/includes/db/Database.php b/includes/db/Database.php index 16ea219290..f23e24f39f 100644 --- a/includes/db/Database.php +++ b/includes/db/Database.php @@ -2460,7 +2460,7 @@ abstract class DatabaseBase implements IDatabase { final public function onTransactionIdle( callable $callback ) { $this->mTrxIdleCallbacks[] = [ $callback, wfGetCaller() ]; if ( !$this->mTrxLevel ) { - $this->runOnTransactionIdleCallbacks(); + $this->runOnTransactionIdleCallbacks( self::TRIGGER_IDLE ); } } @@ -2475,9 +2475,10 @@ abstract class DatabaseBase implements IDatabase { /** * Actually any "on transaction idle" callbacks. * + * @param integer $trigger IDatabase::TRIGGER_* constant * @since 1.20 */ - protected function runOnTransactionIdleCallbacks() { + protected function runOnTransactionIdleCallbacks( $trigger ) { $autoTrx = $this->getFlag( DBO_TRX ); // automatic begin() enabled? $e = $ePrior = null; // last exception @@ -2492,7 +2493,7 @@ abstract class DatabaseBase implements IDatabase { try { list( $phpCallback ) = $callback; $this->clearFlag( DBO_TRX ); // make each query its own transaction - call_user_func( $phpCallback ); + call_user_func_array( $phpCallback, [ $trigger ] ); if ( $autoTrx ) { $this->setFlag( DBO_TRX ); // restore automatic begin() } else { @@ -2623,7 +2624,7 @@ abstract class DatabaseBase implements IDatabase { $this->mServer, $this->mDBname, $this->mTrxShortId, $writeTime ); } - $this->runOnTransactionIdleCallbacks(); + $this->runOnTransactionIdleCallbacks( self::TRIGGER_COMMIT ); } // Avoid fatals if close() was called @@ -2699,7 +2700,7 @@ abstract class DatabaseBase implements IDatabase { $this->mServer, $this->mDBname, $this->mTrxShortId, $writeTime ); } - $this->runOnTransactionIdleCallbacks(); + $this->runOnTransactionIdleCallbacks( self::TRIGGER_COMMIT ); } /** @@ -2739,7 +2740,7 @@ abstract class DatabaseBase implements IDatabase { $this->mTrxIdleCallbacks = []; // clear $this->mTrxPreCommitCallbacks = []; // clear - $this->runOnTransactionIdleCallbacks(); + $this->runOnTransactionIdleCallbacks( self::TRIGGER_ROLLBACK ); } /** diff --git a/includes/db/IDatabase.php b/includes/db/IDatabase.php index 36772b8048..c024632edf 100644 --- a/includes/db/IDatabase.php +++ b/includes/db/IDatabase.php @@ -33,6 +33,11 @@ * @ingroup Database */ interface IDatabase { + /* Constants to onTransactionResolution() callbacks */ + const TRIGGER_IDLE = 1; + const TRIGGER_COMMIT = 2; + const TRIGGER_ROLLBACK = 3; + /** * A string describing the current software version, and possibly * other details in a user-friendly way. Will be listed on Special:Version, etc. @@ -1223,6 +1228,9 @@ interface IDatabase { * * This is useful for combining cooperative locks and DB transactions. * + * The callback takes one argument: + * How the transaction ended (IDatabase::TRIGGER_COMMIT or IDatabase::TRIGGER_ROLLBACK) + * * @param callable $callback * @return mixed * @since 1.28 @@ -1242,6 +1250,9 @@ interface IDatabase { * * Updates will execute in the order they were enqueued. * + * The callback takes one argument: + * How the transaction ended (IDatabase::TRIGGER_COMMIT or IDatabase::TRIGGER_IDLE) + * * @param callable $callback * @since 1.20 */ -- 2.20.1