Make DeferredUpdates::doUpdates use DataUpdate::runUpdates
[lhc/web/wiklou.git] / includes / deferred / DeferredUpdates.php
index cd0266f..8b3582d 100644 (file)
@@ -44,10 +44,10 @@ interface DeferrableUpdate {
  * @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
@@ -57,6 +57,9 @@ class DeferredUpdates {
                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.
@@ -99,9 +102,22 @@ class DeferredUpdates {
 
                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();
 
@@ -129,4 +145,13 @@ class DeferredUpdates {
        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;
+       }
 }