+ }
+
+ public static function cacheUpdate( $dbw ) {
+ global $wgActiveUserDays;
+ $dbr = wfGetDB( DB_SLAVE, array( 'SpecialStatistics', 'vslow' ) );
+ # Get non-bot users than did some recent action other than making accounts.
+ # If account creation is included, the number gets inflated ~20+ fold on enwiki.
+ $activeUsers = $dbr->selectField(
+ 'recentchanges',
+ 'COUNT( DISTINCT rc_user_text )',
+ array(
+ 'rc_user != 0',
+ 'rc_bot' => 0,
+ "rc_log_type != 'newusers' OR rc_log_type IS NULL",
+ "rc_timestamp >= '{$dbw->timestamp( wfTimestamp( TS_UNIX ) - $wgActiveUserDays*24*3600 )}'",
+ ),
+ __METHOD__
+ );
+ $dbw->update(
+ 'site_stats',
+ array( 'ss_active_users' => intval( $activeUsers ) ),
+ array( 'ss_row_id' => 1 ),
+ __METHOD__
+ );
+ return $activeUsers;
+ }
+}
+
+/**
+ * Class designed for counting of stats.
+ */
+class SiteStatsInit {
+
+ // Database connection
+ private $db;
+
+ // Various stats
+ private $mEdits, $mArticles, $mPages, $mUsers, $mViews, $mFiles = 0;
+
+ /**
+ * Constructor
+ * @param $useMaster Boolean: whether to use the master DB
+ */
+ public function __construct( $useMaster = false ) {
+ $this->db = wfGetDB( $useMaster ? DB_MASTER : DB_SLAVE );
+ }
+
+ /**
+ * Count the total number of edits
+ * @return Integer
+ */
+ 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 Integer
+ */
+ public function articles() {
+ global $wgContentNamespaces;
+ $this->mArticles = $this->db->selectField(
+ 'page',
+ 'COUNT(*)',
+ array(
+ 'page_namespace' => $wgContentNamespaces,
+ 'page_is_redirect' => 0,
+ 'page_len > 0'
+ ),
+ __METHOD__
+ );
+ return $this->mArticles;
+ }
+
+ /**
+ * Count total pages
+ * @return Integer
+ */
+ public function pages() {
+ $this->mPages = $this->db->selectField( 'page', 'COUNT(*)', '', __METHOD__ );
+ return $this->mPages;
+ }
+
+ /**
+ * Count total users
+ * @return Integer
+ */
+ public function users() {
+ $this->mUsers = $this->db->selectField( 'user', 'COUNT(*)', '', __METHOD__ );
+ return $this->mUsers;
+ }
+
+ /**
+ * Count views
+ * @return Integer
+ */
+ public function views() {
+ $this->mViews = $this->db->selectField( 'page', 'SUM(page_counter)', '', __METHOD__ );
+ return $this->mViews;
+ }
+
+ /**
+ * Count total files
+ * @return Integer
+ */
+ 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 the calls to wfOut()
+ * @param $update Boolean: whether to update the current stats or write fresh
+ * @param $noViews Boolean: when true, do not update the number of page views
+ * @param $activeUsers Boolean: whether to update the number of active users
+ */
+ public static function doAllAndCommit( $update, $noViews = false, $activeUsers = false ) {
+ // Grab the object and count everything
+ $counter = new SiteStatsInit( false );
+ $counter->edits();
+ $counter->articles();
+ $counter->pages();
+ $counter->users();
+ $counter->files();
+
+ // Only do views if we don't want to not count them
+ if( !$noViews ) {
+ $counter->views();
+ }