From 854c82cfd53cb071afa39259fb467b4730bd6494 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 28 Jun 2009 14:38:34 -0400 Subject: start of queuemanager code --- classes/Queue_item.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'classes') diff --git a/classes/Queue_item.php b/classes/Queue_item.php index 9b909ec22..295c321b5 100644 --- a/classes/Queue_item.php +++ b/classes/Queue_item.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Queue_item extends Memcached_DataObject +class Queue_item extends Memcached_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -13,7 +13,7 @@ class Queue_item extends Memcached_DataObject public $notice_id; // int(4) primary_key not_null public $transport; // varchar(8) primary_key not_null public $created; // datetime() not_null - public $claimed; // datetime() + public $claimed; // datetime() /* Static get */ function staticGet($k,$v=null) @@ -24,7 +24,7 @@ class Queue_item extends Memcached_DataObject function sequenceKey() { return array(false, false); } - + static function top($transport) { $qi = new Queue_item(); @@ -54,4 +54,9 @@ class Queue_item extends Memcached_DataObject $qi = null; return null; } + + function &pkeyGet($kv) + { + return Memcached_DataObject::pkeyGet('Queue_item', $kv); + } } -- cgit v1.2.3-54-g00ecf From cb019f7aad9c4a618316fb3c2e4a36bc013c8da3 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 4 Jul 2009 01:43:35 -0400 Subject: don't send unused variable for streams --- classes/Notice.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'classes') diff --git a/classes/Notice.php b/classes/Notice.php index 8a018068a..5ec0692d9 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1210,7 +1210,7 @@ class Notice extends Memcached_DataObject $window = explode(',', $laststr); $last_id = $window[0]; $new_ids = call_user_func_array($fn, array_merge($args, array(0, NOTICE_CACHE_WINDOW, - $last_id, 0, null, $tag))); + $last_id, 0, null))); $new_window = array_merge($new_ids, $window); @@ -1225,7 +1225,7 @@ class Notice extends Memcached_DataObject } $window = call_user_func_array($fn, array_merge($args, array(0, NOTICE_CACHE_WINDOW, - 0, 0, null, $tag))); + 0, 0, null))); $windowstr = implode(',', $window); -- cgit v1.2.3-54-g00ecf From d4db9d83d84859d7492438a215c8d7a4baf3ef68 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 5 Jul 2009 12:44:18 -0400 Subject: Revert "Merge branch '0.8.x' into cachenonexistent" This reverts commit e21d2cfdb5f259a07d7af0e3c7f5421315ed2710. --- classes/Memcached_DataObject.php | 50 ++++++++-------------------------------- 1 file changed, 10 insertions(+), 40 deletions(-) (limited to 'classes') diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php index 96f8d520b..f7cbb9d5b 100644 --- a/classes/Memcached_DataObject.php +++ b/classes/Memcached_DataObject.php @@ -33,41 +33,21 @@ class Memcached_DataObject extends DB_DataObject $k = $keys[0]; unset($i); } - $i = self::getcached($cls, $k, $v); + $i = Memcached_DataObject::getcached($cls, $k, $v); if ($i) { return $i; } else { $i = DB_DataObject::staticGet($cls, $k, $v); if ($i) { $i->encache(); - } else { - self::cachenull($cls, $k, $v); } return $i; } } - function cachenull($cls, $k, $v) - { - $c = self::memcache(); - if (empty($c)) { - return; - } - $c->set(self::cacheKey($cls, $k, $v), null); - } - - function multicachenull($cls, $kv) - { - $c = self::memcache(); - if (empty($c)) { - return; - } - $c->set(self::multicachekey($cls, $kv), null); - } - function &pkeyGet($cls, $kv) { - $i = self::multicache($cls, $kv); + $i = Memcached_DataObject::multicache($cls, $kv); if ($i) { return $i; } else { @@ -78,7 +58,6 @@ class Memcached_DataObject extends DB_DataObject if ($i->find(true)) { $i->encache(); } else { - self::multicachenull($cls, $kv); $i = null; } return $i; @@ -88,9 +67,6 @@ class Memcached_DataObject extends DB_DataObject function insert() { $result = parent::insert(); - if ($result) { - $this->encache(); - } return $result; } @@ -121,11 +97,11 @@ class Memcached_DataObject extends DB_DataObject } static function getcached($cls, $k, $v) { - $c = self::memcache(); + $c = Memcached_DataObject::memcache(); if (!$c) { return false; } else { - return $c->get(self::cacheKey($cls, $k, $v)); + return $c->get(Memcached_DataObject::cacheKey($cls, $k, $v)); } } @@ -192,23 +168,17 @@ class Memcached_DataObject extends DB_DataObject function multicache($cls, $kv) { - $c = self::memcache(); + ksort($kv); + $c = Memcached_DataObject::memcache(); if (!$c) { return false; } else { - return $c->get(self::multicachekey($cls, $kv)); + $pkeys = implode(',', array_keys($kv)); + $pvals = implode(',', array_values($kv)); + return $c->get(Memcached_DataObject::cacheKey($cls, $pkeys, $pvals)); } } - function multicachekey($cls, $kv) - { - ksort($kv); - $pkeys = implode(',', array_keys($kv)); - $pvals = implode(',', array_values($kv)); - - return self::cacheKey($cls, $pkeys, $pvals); - } - function getSearchEngine($table) { require_once INSTALLDIR.'/lib/search_engines.php'; @@ -241,7 +211,7 @@ class Memcached_DataObject extends DB_DataObject static function cachedQuery($cls, $qry, $expiry=3600) { - $c = self::memcache(); + $c = Memcached_DataObject::memcache(); if (!$c) { $inst = new $cls(); $inst->query($qry); -- cgit v1.2.3-54-g00ecf From 5f72423523c0d95800460cd3342461d3c72eafa1 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Tue, 7 Jul 2009 15:55:10 -0400 Subject: File classes does not use the $FILES array directly, as users of this class aren't necessarily from the web --- actions/newnotice.php | 2 +- classes/File.php | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'classes') diff --git a/actions/newnotice.php b/actions/newnotice.php index 5f44a32a9..e254eac49 100644 --- a/actions/newnotice.php +++ b/actions/newnotice.php @@ -135,7 +135,7 @@ class NewnoticeAction extends Action function isRespectsQuota($user) { $file = new File; - $ret = $file->isRespectsQuota($user); + $ret = $file->isRespectsQuota($user,$_FILES['attach']['size']); if (true === $ret) return true; $this->clientError($ret); } diff --git a/classes/File.php b/classes/File.php index 5dd7cd865..533cc6e71 100644 --- a/classes/File.php +++ b/classes/File.php @@ -122,17 +122,17 @@ class File extends Memcached_DataObject return $x; } - function isRespectsQuota($user) { - if ($_FILES['attach']['size'] > common_config('attachments', 'file_quota')) { + function isRespectsQuota($user,$fileSize) { + if ($fileSize > common_config('attachments', 'file_quota')) { return sprintf(_('No file may be larger than %d bytes ' . 'and the file you sent was %d bytes. Try to upload a smaller version.'), - common_config('attachments', 'file_quota'), $_FILES['attach']['size']); + common_config('attachments', 'file_quota'), $fileSize); } $query = "select sum(size) as total from file join file_to_post on file_to_post.file_id = file.id join notice on file_to_post.post_id = notice.id where profile_id = {$user->id} and file.url like '%/notice/%/file'"; $this->query($query); $this->fetch(); - $total = $this->total + $_FILES['attach']['size']; + $total = $this->total + $fileSize; if ($total > common_config('attachments', 'user_quota')) { return sprintf(_('A file this large would exceed your user quota of %d bytes.'), common_config('attachments', 'user_quota')); } @@ -140,7 +140,7 @@ class File extends Memcached_DataObject $query .= ' month(modified) = month(now()) and year(modified) = year(now())'; $this->query($query); $this->fetch(); - $total = $this->total + $_FILES['attach']['size']; + $total = $this->total + $fileSize; if ($total > common_config('attachments', 'monthly_quota')) { return sprintf(_('A file this large would exceed your monthly quota of %d bytes.'), common_config('attachments', 'monthly_quota')); } -- cgit v1.2.3-54-g00ecf From 69574591d0ac429475b1099e8d9f3e46f7a004ea Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Thu, 9 Jul 2009 13:18:57 -0400 Subject: Notice attachments are enclosures in feeds (Atom, RSS 1.0/RDF, and RSS 2.0). http://laconi.ca/trac/ticket/1690 --- classes/Notice.php | 12 ++++++++++++ lib/rssaction.php | 9 +++++++++ lib/twitterapi.php | 21 ++++++++++++++++++++- 3 files changed, 41 insertions(+), 1 deletion(-) (limited to 'classes') diff --git a/classes/Notice.php b/classes/Notice.php index 5ec0692d9..e975cab93 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1164,6 +1164,18 @@ class Notice extends Memcached_DataObject } $tag->free(); + # Enclosures + $attachments = $this->attachments(); + if($attachments){ + foreach($attachments as $attachment){ + $attributes = array('rel'=>'enclosure','href'=>$attachment->url,'type'=>$attachment->mimetype,'length'=>$attachment->size); + if($attachment->title){ + $attributes['title']=$attachment->title; + } + $xs->element('link', $attributes, null); + } + } + $xs->elementEnd('entry'); return $xs->getString(); diff --git a/lib/rssaction.php b/lib/rssaction.php index 0c8188e88..fe3fd6f4a 100644 --- a/lib/rssaction.php +++ b/lib/rssaction.php @@ -216,6 +216,13 @@ class Rss10Action extends Action $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to)); $this->element('sioc:reply_of', array('rdf:resource' => $replyurl)); } + $attachments = $notice->attachments(); + if($attachments){ + foreach($attachments as $attachment){ + $this->element('enc:enclosure', array('rdf:resource'=>$attachment->url,'enc:type'=>$attachment->mimetype,'enc:length'=>$attachment->size), null); + } + } + $this->elementEnd('item'); $this->creators[$creator_uri] = $profile; } @@ -251,6 +258,8 @@ class Rss10Action extends Action 'http://creativecommons.org/ns#', 'xmlns:content' => 'http://purl.org/rss/1.0/modules/content/', + 'xmlns:enc' => + 'http://purl.oclc.org/net/rss_2.0/enc#', 'xmlns:foaf' => 'http://xmlns.com/foaf/0.1/', 'xmlns:sioc' => diff --git a/lib/twitterapi.php b/lib/twitterapi.php index 40e5b5067..8f902cbca 100644 --- a/lib/twitterapi.php +++ b/lib/twitterapi.php @@ -207,7 +207,6 @@ class TwitterapiAction extends Action function twitter_rss_entry_array($notice) { - $profile = $notice->getProfile(); $entry = array(); @@ -224,6 +223,19 @@ class TwitterapiAction extends Action $entry['updated'] = $entry['published']; $entry['author'] = $profile->getBestName(); + # Enclosure + $attachments = $notice->attachments(); + if($attachments){ + $entry['enclosures']=array(); + foreach($attachments as $attachment){ + $enclosure=array(); + $enclosure['url']=$attachment->url; + $enclosure['mimetype']=$attachment->mimetype; + $enclosure['size']=$attachment->size; + $entry['enclosures'][]=$enclosure; + } + } + # RSS Item specific $entry['description'] = $entry['content']; $entry['pubDate'] = common_date_rfc2822($notice->created); @@ -378,6 +390,13 @@ class TwitterapiAction extends Action $this->element('pubDate', null, $entry['pubDate']); $this->element('guid', null, $entry['guid']); $this->element('link', null, $entry['link']); + + # RSS only supports 1 enclosure per item + if($entry['enclosures']){ + $enclosure = $entry['enclosures'][0]; + $this->element('enclosure', array('url'=>$enclosure['url'],'type'=>$enclosure['mimetype'],'length'=>$enclosure['size']), null); + } + $this->elementEnd('item'); } -- cgit v1.2.3-54-g00ecf From 8b65883f9ddf1cb1b7bdec323722da351fa0cb69 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 9 Jul 2009 17:28:38 -0700 Subject: cache frequently-used subscriber, subscription, notice and fave count values --- classes/Notice.php | 2 + classes/Profile.php | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++ classes/User.php | 2 + lib/command.php | 15 ++---- lib/profileaction.php | 21 +++------ lib/subs.php | 13 +++-- lib/twitterapi.php | 20 ++------ 7 files changed, 157 insertions(+), 44 deletions(-) (limited to 'classes') diff --git a/classes/Notice.php b/classes/Notice.php index e975cab93..75044cf63 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -356,6 +356,8 @@ class Notice extends Memcached_DataObject $this->blowTagCache($blowLast); $this->blowGroupCache($blowLast); $this->blowConversationCache($blowLast); + $profile = Profile::staticGet($this->profile_id); + $profile->blowNoticeCount(); } function blowConversationCache($blowLast=false) diff --git a/classes/Profile.php b/classes/Profile.php index a0ed6b3ca..224b61bd2 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -337,4 +337,132 @@ class Profile extends Memcached_DataObject return $profile; } + + function subscriptionCount() + { + $c = common_memcache(); + + if (!empty($c)) { + $cnt = $c->get(common_cache_key('profile:subscription_count:'.$this->id)); + if (is_integer($cnt)) { + return (int) $cnt; + } + } + + $sub = new Subscription(); + $sub->subscriber = $this->id; + + $cnt = (int) $sub->count('distinct subscribed'); + + $cnt = ($cnt > 0) ? $cnt - 1 : $cnt; + + if (!empty($c)) { + $c->set(common_cache_key('profile:subscription_count:'.$this->id), $cnt); + } + + common_debug("subscriptionCount == $cnt"); + return $cnt; + } + + function subscriberCount() + { + $c = common_memcache(); + if (!empty($c)) { + $cnt = $c->get(common_cache_key('profile:subscriber_count:'.$this->id)); + if (is_integer($cnt)) { + return (int) $cnt; + } + } + + $sub = new Subscription(); + $sub->subscribed = $this->id; + + $cnt = (int) $sub->count('distinct subscriber'); + + $cnt = ($cnt > 0) ? $cnt - 1 : $cnt; + + if (!empty($c)) { + $c->set(common_cache_key('profile:subscriber_count:'.$this->id), $cnt); + } + + common_debug("subscriberCount == $cnt"); + return $cnt; + } + + function faveCount() + { + $c = common_memcache(); + if (!empty($c)) { + $cnt = $c->get(common_cache_key('profile:fave_count:'.$this->id)); + if (is_integer($cnt)) { + return (int) $cnt; + } + } + + $faves = new Fave(); + $faves->user_id = $this->id; + $cnt = (int) $faves->count('distinct notice_id'); + + if (!empty($c)) { + $c->set(common_cache_key('profile:fave_count:'.$this->id), $cnt); + } + + common_debug("faveCount == $cnt"); + return $cnt; + } + + function noticeCount() + { + $c = common_memcache(); + + if (!empty($c)) { + $cnt = $c->get(common_cache_key('profile:notice_count:'.$this->id)); + if (is_integer($cnt)) { + return (int) $cnt; + } + } + + $notices = new Notice(); + $notices->profile_id = $this->id; + $cnt = (int) $notices->count('distinct id'); + + if (!empty($c)) { + $c->set(common_cache_key('profile:notice_count:'.$this->id), $cnt); + } + + common_debug("noticeCount == $cnt"); + return $cnt; + } + + function blowSubscriberCount() + { + $c = common_memcache(); + if (!empty($c)) { + $c->delete(common_cache_key('profile:subscriber_count:'.$this->id)); + } + } + + function blowSubscriptionCount() + { + $c = common_memcache(); + if (!empty($c)) { + $c->delete(common_cache_key('profile:subscription_count:'.$this->id)); + } + } + + function blowFaveCount() + { + $c = common_memcache(); + if (!empty($c)) { + $c->delete(common_cache_key('profile:fave_count:'.$this->id)); + } + } + + function blowNoticeCount() + { + $c = common_memcache(); + if (!empty($c)) { + $c->delete(common_cache_key('profile:notice_count:'.$this->id)); + } + } } diff --git a/classes/User.php b/classes/User.php index 04b38a0d2..6c1f149e4 100644 --- a/classes/User.php +++ b/classes/User.php @@ -494,6 +494,8 @@ class User extends Memcached_DataObject $cache->delete(common_cache_key('fave:ids_by_user_own:'.$this->id)); $cache->delete(common_cache_key('fave:ids_by_user_own:'.$this->id.';last')); } + $profile = $this->getProfile(); + $profile->blowFaveCount(); } function getSelfTags() diff --git a/lib/command.php b/lib/command.php index 564661382..4e2280bc8 100644 --- a/lib/command.php +++ b/lib/command.php @@ -97,18 +97,11 @@ class StatsCommand extends Command { function execute($channel) { + $profile = $this->user->getProfile(); - $subs = new Subscription(); - $subs->subscriber = $this->user->id; - $subs_count = (int) $subs->count() - 1; - - $subbed = new Subscription(); - $subbed->subscribed = $this->user->id; - $subbed_count = (int) $subbed->count() - 1; - - $notices = new Notice(); - $notices->profile_id = $this->user->id; - $notice_count = (int) $notices->count(); + $subs_count = $profile->subscriptionCount(); + $subbed_count = $profile->subscriberCount(); + $notice_count = $profile->noticeCount(); $channel->output($this->user, sprintf(_("Subscriptions: %1\$s\n". "Subscribers: %2\$s\n". diff --git a/lib/profileaction.php b/lib/profileaction.php index eeb5dbe48..9e9c79c78 100644 --- a/lib/profileaction.php +++ b/lib/profileaction.php @@ -163,18 +163,9 @@ class ProfileAction extends OwnerDesignAction function showStatistics() { - // XXX: WORM cache this - $subs = new Subscription(); - $subs->subscriber = $this->profile->id; - $subs_count = (int) $subs->count() - 1; - - $subbed = new Subscription(); - $subbed->subscribed = $this->profile->id; - $subbed_count = (int) $subbed->count() - 1; - - $notices = new Notice(); - $notices->profile_id = $this->profile->id; - $notice_count = (int) $notices->count(); + $subs_count = $this->profile->subscriptionCount(); + $subbed_count = $this->profile->subscriberCount(); + $notice_count = $this->profile->noticeCount(); $this->elementStart('div', array('id' => 'entity_statistics', 'class' => 'section')); @@ -199,7 +190,7 @@ class ProfileAction extends OwnerDesignAction array('nickname' => $this->profile->nickname))), _('Subscriptions')); $this->elementEnd('dt'); - $this->element('dd', null, (is_int($subs_count)) ? $subs_count : '0'); + $this->element('dd', null, $subs_count); $this->elementEnd('dl'); $this->elementStart('dl', 'entity_subscribers'); @@ -208,12 +199,12 @@ class ProfileAction extends OwnerDesignAction array('nickname' => $this->profile->nickname))), _('Subscribers')); $this->elementEnd('dt'); - $this->element('dd', 'subscribers', (is_int($subbed_count)) ? $subbed_count : '0'); + $this->element('dd', 'subscribers', $subbed_count); $this->elementEnd('dl'); $this->elementStart('dl', 'entity_notices'); $this->element('dt', null, _('Notices')); - $this->element('dd', null, (is_int($notice_count)) ? $notice_count : '0'); + $this->element('dd', null, $notice_count); $this->elementEnd('dl'); $this->elementEnd('div'); diff --git a/lib/subs.php b/lib/subs.php index 3bd67b39c..e76023752 100644 --- a/lib/subs.php +++ b/lib/subs.php @@ -44,7 +44,6 @@ function subs_subscribe_user($user, $other_nickname) function subs_subscribe_to($user, $other) { - if ($user->isSubscribed($other)) { return _('Already subscribed!.'); } @@ -60,12 +59,16 @@ function subs_subscribe_to($user, $other) subs_notify($other, $user); - $cache = common_memcache(); + $cache = common_memcache(); if ($cache) { $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id)); } + $profile = $user->getProfile(); + + $profile->blowSubscriptionsCount(); + $other->blowSubscribersCount(); if ($other->autosubscribe && !$other->isSubscribed($user) && !$user->hasBlocked($other)) { if (!$other->subscribeTo($user)) { @@ -117,7 +120,6 @@ function subs_unsubscribe_user($user, $other_nickname) function subs_unsubscribe_to($user, $other) { - if (!$user->isSubscribed($other)) return _('Not subscribed!.'); @@ -139,6 +141,11 @@ function subs_unsubscribe_to($user, $other) $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id)); } + $profile = $user->getProfile(); + + $profile->blowSubscriptionsCount(); + $other->blowSubscribersCount(); + return true; } diff --git a/lib/twitterapi.php b/lib/twitterapi.php index 8f902cbca..f48513e67 100644 --- a/lib/twitterapi.php +++ b/lib/twitterapi.php @@ -89,7 +89,7 @@ class TwitterapiAction extends Action $twitter_user['url'] = ($profile->homepage) ? $profile->homepage : null; $twitter_user['protected'] = false; # not supported by Laconica yet - $twitter_user['followers_count'] = $this->count_subscriptions($profile); + $twitter_user['followers_count'] = $profile->subscriberCount(); // To be supported soon... $twitter_user['profile_background_color'] = ''; @@ -98,17 +98,11 @@ class TwitterapiAction extends Action $twitter_user['profile_sidebar_fill_color'] = ''; $twitter_user['profile_sidebar_border_color'] = ''; - $subbed = DB_DataObject::factory('subscription'); - $subbed->subscriber = $profile->id; - $subbed_count = (int) $subbed->count() - 1; - $twitter_user['friends_count'] = (is_int($subbed_count)) ? $subbed_count : 0; + $twitter_user['friends_count'] = $profile->subscriptionCount(); $twitter_user['created_at'] = $this->date_twitter($profile->created); - $faves = DB_DataObject::factory('fave'); - $faves->user_id = $user->id; - $faves_count = (int) $faves->count(); - $twitter_user['favourites_count'] = $faves_count; // British spelling! + $twitter_user['favourites_count'] = $profile->faveCount(); // British spelling! // Need to pull up the user for some of this $user = User::staticGet($profile->id); @@ -129,11 +123,7 @@ class TwitterapiAction extends Action $twitter_user['profile_background_image_url'] = ''; $twitter_user['profile_background_tile'] = false; - $notices = DB_DataObject::factory('notice'); - $notices->profile_id = $profile->id; - $notice_count = (int) $notices->count(); - - $twitter_user['statuses_count'] = (is_int($notice_count)) ? $notice_count : 0; + $twitter_user['statuses_count'] = $profile->noticeCount(); // Is the requesting user following this user? $twitter_user['following'] = false; @@ -396,7 +386,7 @@ class TwitterapiAction extends Action $enclosure = $entry['enclosures'][0]; $this->element('enclosure', array('url'=>$enclosure['url'],'type'=>$enclosure['mimetype'],'length'=>$enclosure['size']), null); } - + $this->elementEnd('item'); } -- cgit v1.2.3-54-g00ecf