Merge "SpecialPage: Hard deprecate getTitle, deprecated since 1.23"
[lhc/web/wiklou.git] / includes / SiteStats.php
index 6ce1aed..f10e6a2 100644 (file)
@@ -33,10 +33,6 @@ class SiteStats {
 
        /** @var bool */
        private static $loaded = false;
-
-       /** @var int */
-       private static $jobs;
-
        /** @var int[] */
        private static $pageCount = [];
 
@@ -58,14 +54,6 @@ class SiteStats {
 
                self::$row = self::loadAndLazyInit();
 
-               # This code is somewhat schema-agnostic, because I'm changing it in a minor release -- TS
-               if ( !isset( self::$row->ss_total_pages ) && self::$row->ss_total_pages == -1 ) {
-                       # Update schema
-                       $u = new SiteStatsUpdate( 0, 0, 0 );
-                       $u->doUpdate();
-                       self::$row = self::doLoad( wfGetDB( DB_REPLICA ) );
-               }
-
                self::$loaded = true;
        }
 
@@ -87,20 +75,27 @@ class SiteStats {
                        }
                }
 
-               if ( !$wgMiserMode && !self::isSane( $row ) ) {
-                       // Normally the site_stats table is initialized at install time.
-                       // Some manual construction scenarios may leave the table empty or
-                       // broken, however, for instance when importing from a dump into a
-                       // clean schema with mwdumper.
-                       wfDebug( __METHOD__ . ": initializing damaged or missing site_stats\n" );
-
-                       SiteStatsInit::doAllAndCommit( wfGetDB( DB_REPLICA ) );
+               if ( !self::isSane( $row ) ) {
+                       if ( $wgMiserMode ) {
+                               // Start off with all zeroes, assuming that this is a new wiki or any
+                               // repopulations where done manually via script.
+                               SiteStatsInit::doPlaceholderInit();
+                       } else {
+                               // Normally the site_stats table is initialized at install time.
+                               // Some manual construction scenarios may leave the table empty or
+                               // broken, however, for instance when importing from a dump into a
+                               // clean schema with mwdumper.
+                               wfDebug( __METHOD__ . ": initializing damaged or missing site_stats\n" );
+                               SiteStatsInit::doAllAndCommit( wfGetDB( DB_REPLICA ) );
+                       }
 
                        $row = self::doLoad( wfGetDB( DB_MASTER ) );
                }
 
                if ( !self::isSane( $row ) ) {
                        wfDebug( __METHOD__ . ": site_stats persistently nonsensical o_O\n" );
+
+                       $row = (object)array_fill_keys( self::selectFields(), 0 );
                }
 
                return $row;
@@ -111,15 +106,7 @@ class SiteStats {
         * @return bool|stdClass
         */
        static function doLoad( $db ) {
-               return $db->selectRow( 'site_stats', [
-                               'ss_row_id',
-                               'ss_total_edits',
-                               'ss_good_articles',
-                               'ss_total_pages',
-                               'ss_users',
-                               'ss_active_users',
-                               'ss_images',
-                       ], [], __METHOD__ );
+               return $db->selectRow( 'site_stats', self::selectFields(), [], __METHOD__ );
        }
 
        /**
@@ -213,24 +200,24 @@ class SiteStats {
        }
 
        /**
+        * Total number of jobs in the job queue.
         * @return int
         */
        static function jobs() {
-               if ( !isset( self::$jobs ) ) {
-                       try{
-                               self::$jobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
-                       } catch ( JobQueueError $e ) {
-                               self::$jobs = 0;
-                       }
-                       /**
-                        * Zero rows still do single row read for row that doesn't exist,
-                        * but people are annoyed by that
-                        */
-                       if ( self::$jobs == 1 ) {
-                               self::$jobs = 0;
-                       }
-               }
-               return self::$jobs;
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               return $cache->getWithSetCallback(
+                       $cache->makeKey( 'SiteStats', 'jobscount' ),
+                       $cache::TTL_MINUTE,
+                       function ( $oldValue, &$ttl, array &$setOpts ) {
+                               try{
+                                       $jobs = array_sum( JobQueueGroup::singleton()->getQueueSizes() );
+                               } catch ( JobQueueError $e ) {
+                                       $jobs = 0;
+                               }
+                               return $jobs;
+                       },
+                       [ 'pcTTL' => $cache::TTL_PROC_LONG ]
+               );
        }
 
        /**
@@ -251,6 +238,21 @@ class SiteStats {
                return self::$pageCount[$ns];
        }
 
+       /**
+        * @return array
+        */
+       public static function selectFields() {
+               return [
+                       'ss_row_id',
+                       'ss_total_edits',
+                       'ss_good_articles',
+                       'ss_total_pages',
+                       'ss_users',
+                       'ss_active_users',
+                       'ss_images',
+               ];
+       }
+
        /**
         * Is the provided row of site stats sane, or should it be regenerated?
         *
@@ -296,9 +298,8 @@ class SiteStatsInit {
        private $mUsers = null, $mFiles = null;
 
        /**
-        * Constructor
         * @param bool|IDatabase $database
-        * - boolean: Whether to use the master DB
+        * - bool: Whether to use the master DB
         * - IDatabase: Database connection to use
         */
        public function __construct( $database = false ) {
@@ -383,10 +384,10 @@ class SiteStatsInit {
         * for the original initStats, but without output.
         *
         * @param IDatabase|bool $database
-        * - boolean: Whether to use the master DB
+        * - bool: Whether to use the master DB
         * - IDatabase: Database connection to use
         * @param array $options Array of options, may contain the following values
-        * - activeUsers boolean: Whether to update the number of active users (default: false)
+        * - activeUsers bool: Whether to update the number of active users (default: false)
         */
        public static function doAllAndCommit( $database, array $options = [] ) {
                $options += [ 'update' => false, 'activeUsers' => false ];
@@ -408,6 +409,21 @@ class SiteStatsInit {
                }
        }
 
+       /**
+        * Insert a dummy row with all zeroes if no row is present
+        */
+       public static function doPlaceholderInit() {
+               $dbw = wfGetDB( DB_MASTER );
+               if ( $dbw->selectRow( 'site_stats', '1', [], __METHOD__ ) === false ) {
+                       $dbw->insert(
+                               'site_stats',
+                               array_fill_keys( SiteStats::selectFields(), 0 ),
+                               __METHOD__,
+                               [ 'IGNORE' ]
+                       );
+               }
+       }
+
        /**
         * Refresh site_stats
         */