| 
									
										
										
										
											2008-10-22 16:36:00 -04:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2008-10-22 16:58:23 -04:00
										 |  |  | /* | 
					
						
							|  |  |  |  * Laconica - a distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2009-04-28 13:07:05 -04:00
										 |  |  |  * Copyright (C) 2008, 2009, Control Yourself, Inc. | 
					
						
							| 
									
										
										
										
											2008-10-22 16:58:23 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This program 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. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program 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 this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							| 
									
										
										
										
											2008-10-22 16:36:00 -04:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2008-10-22 16:58:23 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | if (!defined('LACONICA')) { exit(1); } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; | 
					
						
							| 
									
										
										
										
											2008-10-22 16:36:00 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-28 13:07:05 -04:00
										 |  |  | // We keep 5 pages of inbox notices in memcache, +1 for pagination check
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | define('INBOX_CACHE_WINDOW', 101); | 
					
						
							| 
									
										
										
										
											2009-07-09 19:35:50 -04:00
										 |  |  | define('NOTICE_INBOX_GC_BOXCAR', 128); | 
					
						
							|  |  |  | define('NOTICE_INBOX_GC_MAX', 12800); | 
					
						
							|  |  |  | define('NOTICE_INBOX_LIMIT', 1000); | 
					
						
							| 
									
										
										
										
											2009-07-16 00:26:51 -04:00
										 |  |  | define('NOTICE_INBOX_SOFT_LIMIT', 1000); | 
					
						
							| 
									
										
										
										
											2009-04-28 13:07:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-16 21:37:19 -07:00
										 |  |  | define('NOTICE_INBOX_SOURCE_SUB', 1); | 
					
						
							|  |  |  | define('NOTICE_INBOX_SOURCE_GROUP', 2); | 
					
						
							| 
									
										
										
										
											2009-06-25 23:00:46 -07:00
										 |  |  | define('NOTICE_INBOX_SOURCE_REPLY', 3); | 
					
						
							| 
									
										
										
										
											2009-06-16 21:37:19 -07:00
										 |  |  | define('NOTICE_INBOX_SOURCE_GATEWAY', -1); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-28 13:07:05 -04:00
										 |  |  | class Notice_inbox extends Memcached_DataObject | 
					
						
							| 
									
										
										
										
											2008-10-22 16:36:00 -04:00
										 |  |  | { | 
					
						
							|  |  |  |     ###START_AUTOCODE
 | 
					
						
							|  |  |  |     /* the code below is auto generated do not remove the above tag */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public $__table = 'notice_inbox';                    // table name
 | 
					
						
							|  |  |  |     public $user_id;                         // int(4)  primary_key not_null
 | 
					
						
							|  |  |  |     public $notice_id;                       // int(4)  primary_key not_null
 | 
					
						
							| 
									
										
										
										
											2008-11-13 16:02:09 -05:00
										 |  |  |     public $created;                         // datetime()   not_null
 | 
					
						
							| 
									
										
										
										
											2008-11-20 15:53:19 -05:00
										 |  |  |     public $source;                          // tinyint(1)   default_1
 | 
					
						
							| 
									
										
										
										
											2008-10-22 16:36:00 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* Static get */ | 
					
						
							| 
									
										
										
										
											2008-12-23 14:33:23 -05:00
										 |  |  |     function staticGet($k,$v=null) | 
					
						
							|  |  |  |     { return Memcached_DataObject::staticGet('Notice_inbox',$k,$v); } | 
					
						
							| 
									
										
										
										
											2008-10-22 16:36:00 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* the code above is auto generated do not remove the tag below */ | 
					
						
							|  |  |  |     ###END_AUTOCODE
 | 
					
						
							| 
									
										
										
										
											2009-04-28 13:07:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-18 11:45:48 -07:00
										 |  |  |     function stream($user_id, $offset, $limit, $since_id, $max_id, $since, $own=false) | 
					
						
							| 
									
										
										
										
											2009-04-28 13:07:05 -04:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-04-29 11:27:45 -04:00
										 |  |  |         return Notice::stream(array('Notice_inbox', '_streamDirect'), | 
					
						
							| 
									
										
										
										
											2009-06-18 11:45:48 -07:00
										 |  |  |                               array($user_id, $own), | 
					
						
							|  |  |  |                               ($own) ? 'notice_inbox:by_user:'.$user_id : | 
					
						
							|  |  |  |                               'notice_inbox:by_user_own:'.$user_id, | 
					
						
							| 
									
										
										
										
											2009-05-29 16:32:55 -07:00
										 |  |  |                               $offset, $limit, $since_id, $max_id, $since); | 
					
						
							| 
									
										
										
										
											2009-04-28 13:07:05 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-18 11:45:48 -07:00
										 |  |  |     function _streamDirect($user_id, $own, $offset, $limit, $since_id, $max_id, $since) | 
					
						
							| 
									
										
										
										
											2009-04-28 13:07:05 -04:00
										 |  |  |     { | 
					
						
							|  |  |  |         $inbox = new Notice_inbox(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $inbox->user_id = $user_id; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-18 11:45:48 -07:00
										 |  |  |         if (!$own) { | 
					
						
							|  |  |  |             $inbox->whereAdd('source != ' . NOTICE_INBOX_SOURCE_GATEWAY); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-28 13:07:05 -04:00
										 |  |  |         if ($since_id != 0) { | 
					
						
							|  |  |  |             $inbox->whereAdd('notice_id > ' . $since_id); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-05-29 16:32:55 -07:00
										 |  |  |         if ($max_id != 0) { | 
					
						
							| 
									
										
										
										
											2009-05-29 16:54:24 -07:00
										 |  |  |             $inbox->whereAdd('notice_id <= ' . $max_id); | 
					
						
							| 
									
										
										
										
											2009-04-28 13:07:05 -04:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!is_null($since)) { | 
					
						
							|  |  |  |             $inbox->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\''); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $inbox->orderBy('notice_id DESC'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!is_null($offset)) { | 
					
						
							|  |  |  |             $inbox->limit($offset, $limit); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $ids = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($inbox->find()) { | 
					
						
							|  |  |  |             while ($inbox->fetch()) { | 
					
						
							|  |  |  |                 $ids[] = $inbox->notice_id; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $ids; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-06-10 13:52:15 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function &pkeyGet($kv) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return Memcached_DataObject::pkeyGet('Notice_inbox', $kv); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-07-09 19:35:50 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     static function gc($user_id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $entry = new Notice_inbox(); | 
					
						
							|  |  |  |         $entry->user_id = $user_id; | 
					
						
							|  |  |  |         $entry->orderBy('created DESC'); | 
					
						
							|  |  |  |         $entry->limit(NOTICE_INBOX_LIMIT - 1, NOTICE_INBOX_GC_MAX); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $total = $entry->find(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($total > 0) { | 
					
						
							|  |  |  |             $notices = array(); | 
					
						
							|  |  |  |             $cnt = 0; | 
					
						
							|  |  |  |             while ($entry->fetch()) { | 
					
						
							|  |  |  |                 $notices[] = $entry->notice_id; | 
					
						
							|  |  |  |                 $cnt++; | 
					
						
							|  |  |  |                 if ($cnt >= NOTICE_INBOX_GC_BOXCAR) { | 
					
						
							|  |  |  |                     self::deleteMatching($user_id, $notices); | 
					
						
							|  |  |  |                     $notices = array(); | 
					
						
							|  |  |  |                     $cnt = 0; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if ($cnt > 0) { | 
					
						
							|  |  |  |                 self::deleteMatching($user_id, $notices); | 
					
						
							|  |  |  |                 $notices = array(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function deleteMatching($user_id, $notices) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $entry = new Notice_inbox(); | 
					
						
							|  |  |  |         return $entry->query('DELETE FROM notice_inbox '. | 
					
						
							|  |  |  |                              'WHERE user_id = ' . $user_id . ' ' . | 
					
						
							|  |  |  |                              'AND notice_id in ('.implode(',', $notices).')'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-10-22 16:36:00 -04:00
										 |  |  | } |