X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2Fdeferred%2FMWCallableUpdate.php;h=5247e97cf10682fcbb9fdaca787a750bb633d9de;hb=61adc1e146dbfc782af0a3fcc9ead094d1513706;hp=d63c292ba97b2c67f88e59163c273ab21d7c7524;hpb=52f5f388a40e08a76b6c4efc52fedd1c65cc166d;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/deferred/MWCallableUpdate.php b/includes/deferred/MWCallableUpdate.php index d63c292ba9..5247e97cf1 100644 --- a/includes/deferred/MWCallableUpdate.php +++ b/includes/deferred/MWCallableUpdate.php @@ -4,7 +4,7 @@ * Deferrable Update for closure/callback */ class MWCallableUpdate implements DeferrableUpdate, DeferrableCallback { - /** @var callable */ + /** @var callable|null */ private $callback; /** @var string */ private $fname; @@ -12,14 +12,27 @@ class MWCallableUpdate implements DeferrableUpdate, DeferrableCallback { /** * @param callable $callback * @param string $fname Calling method + * @param IDatabase|null $dbw Abort if this DB is rolled back [optional] (since 1.28) */ - public function __construct( callable $callback, $fname = 'unknown' ) { + public function __construct( callable $callback, $fname = 'unknown', IDatabase $dbw = null ) { $this->callback = $callback; $this->fname = $fname; + + if ( $dbw && $dbw->trxLevel() ) { + $dbw->onTransactionResolution( [ $this, 'cancelOnRollback' ], $fname ); + } } public function doUpdate() { - call_user_func( $this->callback ); + if ( $this->callback ) { + call_user_func( $this->callback ); + } + } + + public function cancelOnRollback( $trigger ) { + if ( $trigger === IDatabase::TRIGGER_ROLLBACK ) { + $this->callback = null; + } } public function getOrigin() {