Make DeferredUpdates::doUpdates use DataUpdate::runUpdates
[lhc/web/wiklou.git] / includes / deferred / DeferredUpdates.php
index b7e5b0a..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.
@@ -78,17 +81,6 @@ class DeferredUpdates {
                }
        }
 
-       /**
-        * HTMLCacheUpdates are the most common deferred update people use. This
-        * is a shortcut method for that.
-        * @see HTMLCacheUpdate::__construct()
-        * @param Title $title
-        * @param string $table
-        */
-       public static function addHTMLCacheUpdate( $title, $table ) {
-               self::addUpdate( new HTMLCacheUpdate( $title, $table ) );
-       }
-
        /**
         * Add a callable update.  In a lot of cases, we just need a callback/closure,
         * defining a new DeferrableUpdate object is not necessary
@@ -106,15 +98,26 @@ class DeferredUpdates {
         *   prevent lock contention
         */
        public static function doUpdates( $commit = '' ) {
-               global $wgDeferredUpdateList;
-
-               $updates = array_merge( $wgDeferredUpdateList, self::$updates );
+               $updates = self::$updates;
 
                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();
 
@@ -131,7 +134,7 @@ class DeferredUpdates {
                                }
                        }
 
-                       $updates = array_merge( $wgDeferredUpdateList, self::$updates );
+                       $updates = self::$updates;
                }
        }
 
@@ -140,7 +143,15 @@ class DeferredUpdates {
         * want or need to call this. Unit tests need it though.
         */
        public static function clearPendingUpdates() {
-               global $wgDeferredUpdateList;
-               $wgDeferredUpdateList = self::$updates = array();
+               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;
        }
 }