*/
class SiteStats {
static $row, $loaded = false;
- static $admins;
+ static $admins, $jobs;
static $pageCount = array();
static function recache() {
return;
}
- $dbr = wfGetDB( DB_SLAVE );
- self::$row = $dbr->selectRow( 'site_stats', '*', false, __METHOD__ );
+ 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();
+ $dbr = wfGetDB( DB_SLAVE );
self::$row = $dbr->selectRow( 'site_stats', '*', false, __METHOD__ );
}
+
+ self::$loaded = true;
+ }
+
+ static function loadAndLazyInit() {
+ wfDebug( __METHOD__ . ": reading site_stats from slave\n" );
+ $row = self::doLoad( wfGetDB( DB_SLAVE ) );
+
+ if( !self::isSane( $row ) ) {
+ // Might have just been initialized during this request? Underflow?
+ wfDebug( __METHOD__ . ": site_stats damaged or missing on slave\n" );
+ $row = self::doLoad( wfGetDB( DB_MASTER ) );
+ }
+
+ if( !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" );
+
+ global $IP;
+ require_once "$IP/maintenance/initStats.inc";
+
+ ob_start();
+ wfInitStats();
+ ob_end_clean();
+
+ $row = self::doLoad( wfGetDB( DB_MASTER ) );
+ }
+
+ if( !self::isSane( $row ) ) {
+ wfDebug( __METHOD__ . ": site_stats persistently nonsensical o_O\n" );
+ }
+ return $row;
+ }
+
+ static function doLoad( $db ) {
+ return $db->selectRow( 'site_stats', '*', false, __METHOD__ );
}
static function views() {
return self::$admins;
}
+ static function jobs() {
+ if ( !isset( self::$jobs ) ) {
+ $dbr = wfGetDB( DB_SLAVE );
+ self::$jobs = $dbr->estimateRowCount('job');
+ /* 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;
+ }
+
static function pagesInNs( $ns ) {
wfProfileIn( __METHOD__ );
if( !isset( self::$pageCount[$ns] ) ) {
return $pageCount[$ns];
}
+ /** Is the provided row of site stats sane, or should it be regenerated? */
+ private static function isSane( $row ) {
+ if(
+ $row === false
+ or $row->ss_total_pages < $row->ss_good_articles
+ or $row->ss_total_edits < $row->ss_total_pages
+ or $row->ss_users < $row->ss_admins
+ ) {
+ return false;
+ }
+ // Now check for underflow/overflow
+ foreach( array( 'total_views', 'total_edits', 'good_articles',
+ 'total_pages', 'users', 'admins', 'images' ) as $member ) {
+ if(
+ $row->{"ss_$member"} > 2000000000
+ or $row->{"ss_$member"} < 0
+ ) {
+ return false;
+ }
+ }
+ return true;
+ }
}
*/
}
}
-?>
+