| 
									
										
										
										
											2010-05-03 14:00:12 -04:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  | // This file is part of GNU social - https://www.gnu.org/software/social
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social is free software: you can redistribute it and/or modify
 | 
					
						
							|  |  |  | // it under the terms of the GNU Affero General Public License as published by
 | 
					
						
							|  |  |  | // the Free Software Foundation, either version 3 of the License, or
 | 
					
						
							|  |  |  | // (at your option) any later version.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social is distributed in the hope that it will be useful,
 | 
					
						
							|  |  |  | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
					
						
							|  |  |  | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
					
						
							|  |  |  | // GNU Affero General Public License for more details.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // You should have received a copy of the GNU Affero General Public License
 | 
					
						
							|  |  |  | // along with GNU social.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-03 14:00:12 -04:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Data class for counting user registrations by date | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |  * @category  Data | 
					
						
							|  |  |  |  * @package   GNUsocial | 
					
						
							|  |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							| 
									
										
										
										
											2020-06-29 01:41:46 +03:00
										 |  |  |  * @copyright 2010 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |  * @license   https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later | 
					
						
							| 
									
										
										
										
											2010-05-03 14:00:12 -04:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  | defined('GNUSOCIAL') || die(); | 
					
						
							| 
									
										
										
										
											2010-05-03 14:00:12 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Data class for counting users by date | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * We make a separate sitemap for each user registered by date. | 
					
						
							|  |  |  |  * To save ourselves some processing effort, we cache this data | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2020-06-29 01:41:46 +03:00
										 |  |  |  * @copyright 2010 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |  * @license   https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later | 
					
						
							| 
									
										
										
										
											2010-05-03 14:00:12 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2020-06-29 01:41:46 +03:00
										 |  |  |  * @see       DB_DataObject | 
					
						
							| 
									
										
										
										
											2010-05-03 14:00:12 -04:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-08-18 12:10:44 +02:00
										 |  |  | class Sitemap_user_count extends Managed_DataObject | 
					
						
							| 
									
										
										
										
											2010-05-03 14:00:12 -04:00
										 |  |  | { | 
					
						
							|  |  |  |     public $__table = 'sitemap_user_count'; // table name
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public $registration_date;               // date primary_key not_null
 | 
					
						
							|  |  |  |     public $user_count;                      // int(4)
 | 
					
						
							| 
									
										
										
										
											2020-06-29 01:41:46 +03:00
										 |  |  |     public $created;                         // datetime()
 | 
					
						
							|  |  |  |     public $modified;                        // timestamp()  not_null
 | 
					
						
							| 
									
										
										
										
											2010-05-03 14:00:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-19 17:08:18 +02:00
										 |  |  |     public static function schemaDef() | 
					
						
							| 
									
										
										
										
											2010-05-03 14:00:12 -04:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-08-19 17:08:18 +02:00
										 |  |  |         return array( | 
					
						
							|  |  |  |             'fields' => array( | 
					
						
							|  |  |  |                 'registration_date' => array('type' => 'date', 'not null' => true, 'description' => 'record date'), | 
					
						
							|  |  |  |                 'user_count' => array('type' => 'int', 'not null' => true, 'description' => 'the user count of the recorded date'), | 
					
						
							| 
									
										
										
										
											2020-06-29 01:41:46 +03:00
										 |  |  |                 'created' => array('type' => 'datetime', 'description' => 'date this record was created'), | 
					
						
							| 
									
										
										
										
											2013-08-19 17:08:18 +02:00
										 |  |  |                 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             'primary key' => array('registration_date'), | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2010-05-03 14:00:12 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     public static function getAll() | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         $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(); | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |             } elseif ($suc->registration_date < $today) { // There are counts but not up to today
 | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |                 $userCounts = self::fillInCounts($suc->registration_date); | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |             } elseif ($suc->registration_date === $today) { // Refresh today's
 | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |                 $userCounts[$today] = self::updateToday(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // starts with second-to-last date
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             while ($suc->fetch()) { | 
					
						
							|  |  |  |                 $userCounts[$suc->registration_date] = $suc->user_count; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-14 10:38:34 -04:00
										 |  |  |             // Cache user counts for 4 hours.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self::cacheSet('sitemap:user:counts', $userCounts, null, time() + 4 * 60 * 60); | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $userCounts; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     public static function initializeCounts() | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         $firstDate = self::getFirstDate(); // awww
 | 
					
						
							|  |  |  |         $today     = self::today(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $counts = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for ($d = $firstDate; $d <= $today; $d = self::incrementDay($d)) { | 
					
						
							|  |  |  |             $n = self::getCount($d); | 
					
						
							|  |  |  |             self::insertCount($d, $n); | 
					
						
							|  |  |  |             $counts[$d] = $n; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $counts; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     public static function fillInCounts($lastDate) | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         $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; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     public static function updateToday() | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         $today = self::today(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $n = self::getCount($today); | 
					
						
							|  |  |  |         self::updateCount($today, $n); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $n; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     public static function getCount($d) | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         $user = new User(); | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |         $user->whereAdd( | 
					
						
							|  |  |  |             "created BETWEEN TIMESTAMP '" . $d . " 00:00:00' AND " . | 
					
						
							|  |  |  |             "TIMESTAMP '" . self::incrementDay($d) . " 00:00:00'" | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |         $n = $user->count(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $n; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     public static function insertCount($d, $n) | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         $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'"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     public static function updateCount($d, $n) | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |         $suc = Sitemap_user_count::getKV('registration_date', DB_DataObject_Cast::date($d)); | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (empty($suc)) { | 
					
						
							| 
									
										
										
										
											2010-10-03 23:54:57 +02:00
										 |  |  |             // TRANS: Exception thrown when a registration date cannot be found.
 | 
					
						
							|  |  |  |             throw new Exception(_m("No such registration date: $d.")); | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $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'"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     public static function incrementDay($d) | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         $dt = self::dateStrToInt($d); | 
					
						
							|  |  |  |         return self::dateIntToStr($dt + 24 * 60 * 60); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     public static function dateStrToInt($d) | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         return strtotime($d.' 00:00:00'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     public static function dateIntToStr($dt) | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         return date('Y-m-d', $dt); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     public static function getFirstDate() | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         $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()); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-11 09:46:30 +03:00
										 |  |  |     public static function today() | 
					
						
							| 
									
										
										
										
											2010-05-21 16:47:30 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         return self::dateIntToStr(time()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-05-03 14:00:12 -04:00
										 |  |  | } |