make user counts use the database table
This commit is contained in:
		| @@ -64,6 +64,9 @@ class SitemapPlugin extends Plugin | ||||
|  | ||||
|         switch ($cls) | ||||
|         { | ||||
|         case 'Sitemap_user_count': | ||||
|             require_once $dir . '/' . $cls . '.php'; | ||||
|             return false; | ||||
|         case 'SitemapindexAction': | ||||
|         case 'NoticesitemapAction': | ||||
|         case 'UsersitemapAction': | ||||
| @@ -71,6 +74,7 @@ class SitemapPlugin extends Plugin | ||||
|             return false; | ||||
|         case 'SitemapAction': | ||||
|             require_once $dir . '/' . strtolower($cls) . '.php'; | ||||
|             return false; | ||||
|         default: | ||||
|             return true; | ||||
|         } | ||||
|   | ||||
| @@ -105,6 +105,11 @@ class Sitemap_user_count extends Memcached_DataObject | ||||
|         return array('registration_date' => 'K'); | ||||
|     } | ||||
|  | ||||
|     function sequenceKey() | ||||
|     { | ||||
|         return array(false, false, false); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * return key definitions for Memcached_DataObject | ||||
|      * | ||||
| @@ -118,4 +123,165 @@ class Sitemap_user_count extends Memcached_DataObject | ||||
|     { | ||||
|         return $this->keys(); | ||||
|     } | ||||
|  | ||||
|     static function getAll() | ||||
|     { | ||||
|         $userCounts = self::cacheGet('sitemap:user:counts'); | ||||
|  | ||||
|         if ($userCounts === false) { | ||||
|  | ||||
|             $suc = new Sitemap_user_count(); | ||||
|             $suc->orderBy('registration_date DESC'); | ||||
|  | ||||
|             // Fetch the first one to check up-to-date-itude | ||||
|  | ||||
|             $n = $suc->find(true); | ||||
|  | ||||
|             $today = self::today(); | ||||
|             $userCounts = array(); | ||||
|  | ||||
|             if (!$n) { // No counts saved yet | ||||
|                 $userCounts = self::initializeCounts(); | ||||
|             } else if ($suc->registration_date < $today) { // There are counts but not up to today | ||||
|                 $userCounts = self::fillInCounts($suc->registration_date); | ||||
|             } else if ($suc->registration_date == $today) { // Refresh today's | ||||
|                 $userCounts[$today] = self::updateToday(); | ||||
|             } | ||||
|  | ||||
|             // starts with second-to-last date | ||||
|  | ||||
|             while ($suc->fetch()) { | ||||
|                 $userCounts[$suc->registration_date] = $suc->user_count; | ||||
|             } | ||||
|  | ||||
|             self::cacheSet('sitemap:user:counts', $userCounts); | ||||
|         } | ||||
|  | ||||
|         return $userCounts; | ||||
|     } | ||||
|  | ||||
|     static function initializeCounts() | ||||
|     { | ||||
|         $firstDate = self::getFirstDate(); // awww | ||||
|         $today     = self::today(); | ||||
|  | ||||
|         $counts = array(); | ||||
|  | ||||
|         for ($d = $firstDate; $d <= $today; $d = self::incrementDay($d)) { | ||||
|             common_debug("Date = '$d'"); | ||||
|             $n = self::getCount($d); | ||||
|             self::insertCount($d, $n); | ||||
|             $counts[$d] = $n; | ||||
|         } | ||||
|  | ||||
|         return $counts; | ||||
|     } | ||||
|  | ||||
|     static function fillInCounts($lastDate) | ||||
|     { | ||||
|         $today = self::today(); | ||||
|  | ||||
|         $counts = array(); | ||||
|  | ||||
|         $n = self::getCount($lastDate); | ||||
|         self::updateCount($lastDate, $n); | ||||
|  | ||||
|         $counts[$lastDate] = $n; | ||||
|  | ||||
|         for ($d = self::incrementDay($lastDate); $d <= $today; $d = self::incrementDay($d)) { | ||||
|             $n = self::getCount($d); | ||||
|             self::insertCount($d, $n); | ||||
|         } | ||||
|  | ||||
|         return $counts; | ||||
|     } | ||||
|  | ||||
|     static function updateToday() | ||||
|     { | ||||
|         $today = self::today(); | ||||
|  | ||||
|         $n = self::getCount($today); | ||||
|         self::updateCount($today, $n); | ||||
|  | ||||
|         return $n; | ||||
|     } | ||||
|  | ||||
|     static function getCount($d) | ||||
|     { | ||||
|         $user = new User(); | ||||
|         $user->whereAdd('created BETWEEN "'.$d.' 00:00:00" AND "'.self::incrementDay($d).' 00:00:00"'); | ||||
|         $n = $user->count(); | ||||
|  | ||||
|         return $n; | ||||
|     } | ||||
|  | ||||
|     static function insertCount($d, $n) | ||||
|     { | ||||
|         common_debug("Inserting count '$n' for '$d'"); | ||||
|  | ||||
|         $suc = new Sitemap_user_count(); | ||||
|  | ||||
|         $suc->registration_date = DB_DataObject_Cast::date($d); | ||||
|         $suc->user_count        = $n; | ||||
|         $suc->created           = common_sql_now(); | ||||
|         $suc->modified          = $suc->created; | ||||
|  | ||||
|         if (!$suc->insert()) { | ||||
|             common_log(LOG_WARNING, "Could not save user counts for '$d'"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     static function updateCount($d, $n) | ||||
|     { | ||||
|         $suc = Sitemap_user_count::staticGet('registration_date', DB_DataObject_Cast::date($d)); | ||||
|  | ||||
|         if (empty($suc)) { | ||||
|             throw new Exception("No such registration date: $d"); | ||||
|         } | ||||
|  | ||||
|         $orig = clone($suc); | ||||
|  | ||||
|         $suc->registration_date = DB_DataObject_Cast::date($d); | ||||
|         $suc->user_count        = $n; | ||||
|         $suc->created           = common_sql_now(); | ||||
|         $suc->modified          = $suc->created; | ||||
|  | ||||
|         if (!$suc->update($orig)) { | ||||
|             common_log(LOG_WARNING, "Could not save user counts for '$d'"); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     static function incrementDay($d) | ||||
|     { | ||||
|         $dt = self::dateStrToInt($d); | ||||
|         return self::dateIntToStr($dt + 24 * 60 * 60); | ||||
|     } | ||||
|  | ||||
|     static function dateStrToInt($d) | ||||
|     { | ||||
|         return strtotime($d.' 00:00:00'); | ||||
|     } | ||||
|  | ||||
|     static function dateIntToStr($dt) | ||||
|     { | ||||
|         return date('Y-m-d', $dt); | ||||
|     } | ||||
|  | ||||
|     static function getFirstDate() | ||||
|     { | ||||
|         $u = new User(); | ||||
|         $u->selectAdd(); | ||||
|         $u->selectAdd('date(min(created)) as first_date'); | ||||
|         if ($u->find(true)) { | ||||
|             return $u->first_date; | ||||
|         } else { | ||||
|             // Is this right? | ||||
|             return self::dateIntToStr(time()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     static function today() | ||||
|     { | ||||
|         return self::dateIntToStr(time()); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -68,11 +68,15 @@ class SitemapindexAction extends Action | ||||
|  | ||||
|     function showUserSitemaps() | ||||
|     { | ||||
|         $userCounts = $this->getUserCounts(); | ||||
|         $userCounts = Sitemap_user_count::getAll(); | ||||
|  | ||||
|         foreach ($userCounts as $dt => $cnt) { | ||||
|             $cnt = $cnt+0; | ||||
|             assert($cnt != 0); | ||||
|  | ||||
|             if ($cnt == 0) { | ||||
|                 continue; | ||||
|             } | ||||
|  | ||||
|             $n = (int)$cnt / (int)SitemapPlugin::USERS_PER_MAP; | ||||
|             if (($cnt % SitemapPlugin::USERS_PER_MAP) != 0) { | ||||
|                 $n++; | ||||
| @@ -88,7 +92,9 @@ class SitemapindexAction extends Action | ||||
|         $noticeCounts = $this->getNoticeCounts(); | ||||
|  | ||||
|         foreach ($noticeCounts as $dt => $cnt) { | ||||
|             assert($cnt != 0); | ||||
|             if ($cnt == 0) { | ||||
|                 continue; | ||||
|             } | ||||
|             $n = $cnt / SitemapPlugin::NOTICES_PER_MAP; | ||||
|             if ($cnt % SitemapPlugin::NOTICES_PER_MAP) { | ||||
|                 $n++; | ||||
| @@ -101,28 +107,7 @@ class SitemapindexAction extends Action | ||||
|  | ||||
|     function getUserCounts() | ||||
|     { | ||||
|         $userCounts = User::cacheGet('sitemap:user:counts'); | ||||
|  | ||||
|         if ($userCounts === false) { | ||||
|  | ||||
|             $user = new User(); | ||||
|  | ||||
|             $user->selectAdd(); | ||||
|             $user->selectAdd('date(created) as regdate, count(*) as regcount'); | ||||
|             $user->groupBy('regdate'); | ||||
|  | ||||
|             $user->find(); | ||||
|  | ||||
|             $userCounts = array(); | ||||
|  | ||||
|             while ($user->fetch()) { | ||||
|                 $userCounts[$user->regdate] = $user->regcount; | ||||
|             } | ||||
|  | ||||
|             User::cacheSet('sitemap:user:counts', $userCounts); | ||||
|         } | ||||
|  | ||||
|         return $userCounts; | ||||
|         return Sitemap_user_count::getAll(); | ||||
|     } | ||||
|  | ||||
|     function getNoticeCounts() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user