$dbw = wfGetDB( DB_MASTER );
}
- /** @var DeferrableUpdate $update */
- foreach ( $updates as $update ) {
- try {
- $update->doUpdate();
+ while ( $updates ) {
+ self::clearPendingUpdates();
- if ( $doCommit && $dbw->trxLevel() ) {
- $dbw->commit( __METHOD__, 'flush' );
- }
- } catch ( MWException $e ) {
- // We don't want exceptions thrown during deferred updates to
- // be reported to the user since the output is already sent.
- // Instead we just log them.
- if ( !$e instanceof ErrorPageError ) {
- MWExceptionHandler::logException( $e );
+ /** @var DeferrableUpdate $update */
+ foreach ( $updates as $update ) {
+ try {
+ $update->doUpdate();
+
+ if ( $doCommit && $dbw->trxLevel() ) {
+ $dbw->commit( __METHOD__, 'flush' );
+ }
+ } catch ( MWException $e ) {
+ // We don't want exceptions thrown during deferred updates to
+ // be reported to the user since the output is already sent.
+ // Instead we just log them.
+ if ( !$e instanceof ErrorPageError ) {
+ MWExceptionHandler::logException( $e );
+ }
}
}
+ $updates = array_merge( $wgDeferredUpdateList, self::$updates );
}
- self::clearPendingUpdates();
wfProfileOut( __METHOD__ );
}
--- /dev/null
+<?php
+
+class DeferredUpdatesTest extends MediaWikiTestCase {
+
+ public function testDoUpdates() {
+ $updates = array (
+ '1' => 'deferred update 1',
+ '2' => 'deferred update 2',
+ '3' => 'deferred update 3',
+ '2-1' => 'deferred update 1 within deferred update 2',
+ );
+ DeferredUpdates::addCallableUpdate(
+ function () use ( $updates ) {
+ echo $updates['1'];
+ }
+ );
+ DeferredUpdates::addCallableUpdate(
+ function () use ( $updates ) {
+ echo $updates['2'];
+ DeferredUpdates::addCallableUpdate(
+ function() use ( $updates ) {
+ echo $updates['2-1'];
+ }
+ );
+ }
+ );
+ DeferredUpdates::addCallableUpdate(
+ function () use ( $updates ) {
+ echo $updates[3];
+ }
+ );
+
+ $this->expectOutputString( implode( '', $updates ) );
+
+ DeferredUpdates::doUpdates();
+ }
+
+}