From: Aaron Schulz Date: Thu, 21 Jul 2016 02:32:55 +0000 (-0700) Subject: Provide onTransaction* callbacks with the transaction result X-Git-Tag: 1.31.0-rc.0~6319^2 X-Git-Url: https://git.cyclocoop.org/%7B%7B%20url_for%28%27admin_user_edit%27%2C%20iduser=user.userid%29%20%7D%7D?a=commitdiff_plain;h=144245268ddce82b3734281fd1a3fbc09793209e;p=lhc%2Fweb%2Fwiklou.git Provide onTransaction* callbacks with the transaction result This can later be used to cancel certain deferred updates. Change-Id: Ib6649b6ca400f15ff441531d0fd6aecc3e4619eb --- 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 */