summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--classes/Inbox.php53
-rw-r--r--classes/Notice.php20
-rw-r--r--classes/User.php81
3 files changed, 72 insertions, 82 deletions
diff --git a/classes/Inbox.php b/classes/Inbox.php
index 35f532c06..de48d7381 100644
--- a/classes/Inbox.php
+++ b/classes/Inbox.php
@@ -31,6 +31,8 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
class Inbox extends Memcached_DataObject
{
+ const BOXCAR = 128;
+
###START_AUTOCODE
/* the code below is auto generated do not remove the above tag */
@@ -48,4 +50,55 @@ class Inbox extends Memcached_DataObject
{
return array(false, false, false);
}
+
+ static function insertNotice($user_id, $notice_id)
+ {
+ $inbox = new Inbox();
+
+ $inbox->query(sprintf('UPDATE inbox '.
+ 'set notice_ids = concat(cast(%08x as binary(4)), '.
+ 'substr(notice_ids, 1, 4092)) '.
+ 'WHERE user_id = %d',
+ $notice_id, $user_id));
+ }
+
+ static function bulkInsert($notice_id, $user_ids)
+ {
+ $cnt = count($user_ids);
+
+ for ($off = 0; $off < $cnt; $off += self::BOXCAR) {
+
+ $boxcar = array_slice($user_ids, $off, self::BOXCAR);
+
+ if (empty($boxcar)) { // jump in, hobo!
+ break;
+ }
+
+ $inbox = new Inbox();
+
+ $inbox->query(sprintf('UPDATE inbox '.
+ 'set notice_ids = concat(cast(%08x as binary(4)), '.
+ 'substr(notice_ids, 1, 4092)) '.
+ 'WHERE user_id in (%s)',
+ $notice_id, implode(',', $boxcar)));
+
+ $inbox->free();
+ }
+ }
+
+ function stream($user_id, $offset, $limit, $since_id, $max_id, $since, $own=false)
+ {
+ $inbox = Inbox::staticGet('user_id', $user_id);
+
+ if (empty($inbox)) {
+ return array();
+ }
+
+ $ids = unpack('L*', $inbox->notice_ids);
+
+ // XXX: handle since_id
+ // XXX: handle max_id
+
+ $ids = array_slice($ids, $offset, $limit);
+ }
}
diff --git a/classes/Notice.php b/classes/Notice.php
index 9bda47827..8783912e8 100644
--- a/classes/Notice.php
+++ b/classes/Notice.php
@@ -125,8 +125,7 @@ class Notice extends Memcached_DataObject
'Fave',
'Notice_tag',
'Group_inbox',
- 'Queue_item',
- 'Notice_inbox');
+ 'Queue_item');
foreach ($related as $cls) {
$inst = new $cls();
@@ -504,17 +503,6 @@ class Notice extends Memcached_DataObject
unset($original);
}
- $ni = new Notice_inbox();
-
- $ni->notice_id = $this->id;
-
- if ($ni->find()) {
- while ($ni->fetch()) {
- $tmk = common_cache_key('user:repeated_to_me:'.$ni->user_id);
- $cache->delete($tmk);
- }
- }
-
$ni->free();
unset($ni);
}
@@ -844,10 +832,6 @@ class Notice extends Memcached_DataObject
function addToInboxes()
{
- // XXX: loads constants
-
- $inbox = new Notice_inbox();
-
$users = $this->getSubscribedUsers();
// FIXME: kind of ignoring 'transitional'...
@@ -887,7 +871,7 @@ class Notice extends Memcached_DataObject
}
}
- Notice_inbox::bulkInsert($this->id, $this->created, $ni);
+ Inbox::bulkInsert($this->id, array_keys($ni));
return;
}
diff --git a/classes/User.php b/classes/User.php
index 34151778c..773723da4 100644
--- a/classes/User.php
+++ b/classes/User.php
@@ -291,6 +291,19 @@ class User extends Memcached_DataObject
return false;
}
+ // Everyone gets an inbox
+
+ $inbox = new Inbox();
+
+ $inbox->user_id = $user->id;
+
+ $result = $inbox->insert();
+
+ if (!$result) {
+ common_log_db_error($inbox, 'INSERT', __FILE__);
+ return false;
+ }
+
// Everyone is subscribed to themself
$subscription = new Subscription();
@@ -482,89 +495,30 @@ class User extends Memcached_DataObject
function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
{
- $ids = Notice_inbox::stream($this->id, $offset, $limit, $since_id, $before_id, $since, false);
-
+ $ids = Inbox::stream($this->id, $offset, $limit, $since_id, $before_id, $since, false);
return Notice::getStreamByIds($ids);
}
function noticeInbox($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
{
- $ids = Notice_inbox::stream($this->id, $offset, $limit, $since_id, $before_id, $since, true);
-
+ $ids = Inbox::stream($this->id, $offset, $limit, $since_id, $before_id, $since, true);
return Notice::getStreamByIds($ids);
}
function friendsTimeline($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
{
- $ids = Notice::stream(array($this, '_friendsTimelineDirect'),
- array(false),
- 'user:friends_timeline:'.$this->id,
- $offset, $limit, $since_id, $before_id, $since);
+ $ids = Inbox::stream($this->id, $offset, $limit, $since_id, $before_id, $since, false);
return Notice::getStreamByIds($ids);
}
function ownFriendsTimeline($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null)
{
- $ids = Notice::stream(array($this, '_friendsTimelineDirect'),
- array(true),
- 'user:friends_timeline_own:'.$this->id,
- $offset, $limit, $since_id, $before_id, $since);
+ $ids = Inbox::stream($this->id, $offset, $limit, $since_id, $before_id, $since, true);
return Notice::getStreamByIds($ids);
}
- function _friendsTimelineDirect($own, $offset, $limit, $since_id, $max_id, $since)
- {
- $qry =
- 'SELECT notice.id AS id ' .
- 'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' .
- 'WHERE notice_inbox.user_id = ' . $this->id . ' ' .
- 'AND notice.repeat_of IS NULL ';
-
- if (!$own) {
- // XXX: autoload notice inbox for constant
- $inbox = new Notice_inbox();
-
- $qry .= 'AND notice_inbox.source != ' . NOTICE_INBOX_SOURCE_GATEWAY . ' ';
- }
-
- if ($since_id != 0) {
- $qry .= 'AND notice.id > ' . $since_id . ' ';
- }
-
- if ($max_id != 0) {
- $qry .= 'AND notice.id <= ' . $max_id . ' ';
- }
-
- if (!is_null($since)) {
- $qry .= 'AND notice.modified > \'' . date('Y-m-d H:i:s', $since) . '\' ';
- }
-
- // NOTE: we sort by fave time, not by notice time!
-
- $qry .= 'ORDER BY notice_id DESC ';
-
- if (!is_null($offset)) {
- $qry .= "LIMIT $limit OFFSET $offset";
- }
-
- $ids = array();
-
- $notice = new Notice();
-
- $notice->query($qry);
-
- while ($notice->fetch()) {
- $ids[] = $notice->id;
- }
-
- $notice->free();
- $notice = NULL;
-
- return $ids;
- }
-
function blowFavesCache()
{
$cache = common_memcache();
@@ -777,7 +731,6 @@ class User extends Memcached_DataObject
'Remember_me',
'Foreign_link',
'Invitation',
- 'Notice_inbox',
);
Event::handle('UserDeleteRelated', array($this, &$related));