/** @var bool */
private static $loaded = false;
-
/** @var int[] */
private static $pageCount = [];
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;
}
}
}
- 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;
* @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(),
+ [ 'ss_row_id' => 1 ],
+ __METHOD__
+ );
}
/**
return self::$pageCount[$ns];
}
+ /**
+ * @return array
+ */
+ public static function selectFields() {
+ return [
+ '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?
*
* Checks only fields which are filled by SiteStatsInit::refresh.
*
* @param bool|object $row
- *
* @return bool
*/
private static function isSane( $row ) {
return true;
}
}
-
-/**
- * Class designed for counting of stats.
- */
-class SiteStatsInit {
-
- // Database connection
- private $db;
-
- // Various stats
- private $mEdits = null, $mArticles = null, $mPages = null;
- private $mUsers = null, $mFiles = null;
-
- /**
- * @param bool|IDatabase $database
- * - boolean: Whether to use the master DB
- * - IDatabase: Database connection to use
- */
- public function __construct( $database = false ) {
- if ( $database instanceof IDatabase ) {
- $this->db = $database;
- } elseif ( $database ) {
- $this->db = wfGetDB( DB_MASTER );
- } else {
- $this->db = wfGetDB( DB_REPLICA, 'vslow' );
- }
- }
-
- /**
- * Count the total number of edits
- * @return int
- */
- public function edits() {
- $this->mEdits = $this->db->selectField( 'revision', 'COUNT(*)', '', __METHOD__ );
- $this->mEdits += $this->db->selectField( 'archive', 'COUNT(*)', '', __METHOD__ );
- return $this->mEdits;
- }
-
- /**
- * Count pages in article space(s)
- * @return int
- */
- public function articles() {
- global $wgArticleCountMethod;
-
- $tables = [ 'page' ];
- $conds = [
- 'page_namespace' => MWNamespace::getContentNamespaces(),
- 'page_is_redirect' => 0,
- ];
-
- if ( $wgArticleCountMethod == 'link' ) {
- $tables[] = 'pagelinks';
- $conds[] = 'pl_from=page_id';
- } elseif ( $wgArticleCountMethod == 'comma' ) {
- // To make a correct check for this, we would need, for each page,
- // to load the text, maybe uncompress it, maybe decode it and then
- // check if there's one comma.
- // But one thing we are sure is that if the page is empty, it can't
- // contain a comma :)
- $conds[] = 'page_len > 0';
- }
-
- $this->mArticles = $this->db->selectField( $tables, 'COUNT(DISTINCT page_id)',
- $conds, __METHOD__ );
- return $this->mArticles;
- }
-
- /**
- * Count total pages
- * @return int
- */
- public function pages() {
- $this->mPages = $this->db->selectField( 'page', 'COUNT(*)', '', __METHOD__ );
- return $this->mPages;
- }
-
- /**
- * Count total users
- * @return int
- */
- public function users() {
- $this->mUsers = $this->db->selectField( 'user', 'COUNT(*)', '', __METHOD__ );
- return $this->mUsers;
- }
-
- /**
- * Count total files
- * @return int
- */
- public function files() {
- $this->mFiles = $this->db->selectField( 'image', 'COUNT(*)', '', __METHOD__ );
- return $this->mFiles;
- }
-
- /**
- * Do all updates and commit them. More or less a replacement
- * for the original initStats, but without output.
- *
- * @param IDatabase|bool $database
- * - boolean: 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)
- */
- public static function doAllAndCommit( $database, array $options = [] ) {
- $options += [ 'update' => false, 'activeUsers' => false ];
-
- // Grab the object and count everything
- $counter = new SiteStatsInit( $database );
-
- $counter->edits();
- $counter->articles();
- $counter->pages();
- $counter->users();
- $counter->files();
-
- $counter->refresh();
-
- // Count active users if need be
- if ( $options['activeUsers'] ) {
- SiteStatsUpdate::cacheUpdate( wfGetDB( DB_MASTER ) );
- }
- }
-
- /**
- * Refresh site_stats
- */
- public function refresh() {
- $values = [
- 'ss_row_id' => 1,
- 'ss_total_edits' => ( $this->mEdits === null ? $this->edits() : $this->mEdits ),
- 'ss_good_articles' => ( $this->mArticles === null ? $this->articles() : $this->mArticles ),
- 'ss_total_pages' => ( $this->mPages === null ? $this->pages() : $this->mPages ),
- 'ss_users' => ( $this->mUsers === null ? $this->users() : $this->mUsers ),
- 'ss_images' => ( $this->mFiles === null ? $this->files() : $this->mFiles ),
- ];
-
- $dbw = wfGetDB( DB_MASTER );
- $dbw->upsert( 'site_stats', $values, [ 'ss_row_id' ], $values, __METHOD__ );
- }
-}