* @since 1.19
*/
class DeferredUpdates {
- /**
- * @var array Updates to be deferred until the end of the request.
- */
+ /** @var DeferrableUpdate[] Updates to be deferred until the end of the request */
private static $updates = array();
+ /** @var bool Defer updates fully even in CLI mode */
+ private static $forceDeferral = false;
/**
* Add an update to the deferred list
global $wgCommandLineMode;
array_push( self::$updates, $update );
+ if ( self::$forceDeferral ) {
+ return;
+ }
// CLI scripts may forget to periodically flush these updates,
// so try to handle that rather than OOMing and losing them.
while ( count( $updates ) ) {
self::clearPendingUpdates();
-
- /** @var DeferrableUpdate $update */
+ /** @var DataUpdate[] $dataUpdates */
+ $dataUpdates = array();
+ /** @var DeferrableUpdate[] $otherUpdates */
+ $otherUpdates = array();
foreach ( $updates as $update ) {
+ if ( $update instanceof DataUpdate ) {
+ $dataUpdates[] = $update;
+ } else {
+ $otherUpdates[] = $update;
+ }
+ }
+
+ // Delegate DataUpdate execution to the DataUpdate class
+ DataUpdate::runUpdates( $dataUpdates, 'run' );
+ // Execute the non-DataUpdate tasks
+ foreach ( $otherUpdates as $update ) {
try {
$update->doUpdate();
public static function clearPendingUpdates() {
self::$updates = array();
}
+
+ /**
+ * @note This method is intended for testing purposes
+ * @param bool $value Whether to *always* defer updates, even in CLI mode
+ * @since 1.26
+ */
+ public static function forceDeferral( $value ) {
+ self::$forceDeferral = $value;
+ }
}