]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch '0.9.x' into activityatompub
authorEvan Prodromou <evan@status.net>
Sat, 11 Dec 2010 16:03:02 +0000 (11:03 -0500)
committerEvan Prodromou <evan@status.net>
Sat, 11 Dec 2010 16:03:02 +0000 (11:03 -0500)
classes/Profile.php
classes/Session.php
classes/Subscription.php

index 8dbdcbd97385395f78bdaac90c41a21226f8b998..239c368ca19fb0451369921ca0445594f440f91c 100644 (file)
@@ -380,54 +380,32 @@ class Profile extends Memcached_DataObject
 
     function getSubscriptions($offset=0, $limit=null)
     {
-        $qry =
-          'SELECT profile.* ' .
-          'FROM profile JOIN subscription ' .
-          'ON profile.id = subscription.subscribed ' .
-          'WHERE subscription.subscriber = %d ' .
-          'AND subscription.subscribed != subscription.subscriber ' .
-          'ORDER BY subscription.created DESC ';
-
-        if ($offset>0 && !is_null($limit)){
-            if (common_config('db','type') == 'pgsql') {
-                $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
-            } else {
-                $qry .= ' LIMIT ' . $offset . ', ' . $limit;
-            }
-        }
+        $subs = Subscription::bySubscriber($this->id,
+                                           $offset,
+                                           $limit);
 
-        $profile = new Profile();
+        $profiles = array();
 
-        $profile->query(sprintf($qry, $this->id));
+        while ($subs->fetch()) {
+            $profiles[] = Profile::staticGet($subs->subscribed);
+        }
 
-        return $profile;
+        return new ArrayWrapper($profiles);
     }
 
     function getSubscribers($offset=0, $limit=null)
     {
-        $qry =
-          'SELECT profile.* ' .
-          'FROM profile JOIN subscription ' .
-          'ON profile.id = subscription.subscriber ' .
-          'WHERE subscription.subscribed = %d ' .
-          'AND subscription.subscribed != subscription.subscriber ' .
-          'ORDER BY subscription.created DESC ';
-
-        if ($offset>0 && !is_null($limit)){
-            if ($offset) {
-                if (common_config('db','type') == 'pgsql') {
-                    $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
-                } else {
-                    $qry .= ' LIMIT ' . $offset . ', ' . $limit;
-                }
-            }
-        }
+        $subs = Subscription::bySubscribed($this->id,
+                                           $offset,
+                                           $limit);
 
-        $profile = new Profile();
+        $profiles = array();
 
-        $cnt = $profile->query(sprintf($qry, $this->id));
+        while ($subs->fetch()) {
+            $profiles[] = Profile::staticGet($subs->subscriber);
+        }
 
-        return $profile;
+        return new ArrayWrapper($profiles);
     }
 
     function getConnectedApps($offset = 0, $limit = null)
index 2422f8b68ecf975dd3794a051917f6fc495a7a02..e1c83ad4dc78564b7745d06d56cba9a087635981 100644 (file)
@@ -178,6 +178,18 @@ class Session extends Memcached_DataObject
         $result = session_set_save_handler('Session::open', 'Session::close', 'Session::read',
                                            'Session::write', 'Session::destroy', 'Session::gc');
         self::logdeb("save handlers result = $result");
+
+        // PHP 5.3 with APC ends up destroying a bunch of object stuff before the session
+        // save handlers get called on request teardown.
+        // Registering an explicit shutdown function should take care of this before
+        // everything breaks on us.
+        register_shutdown_function('Session::cleanup');
+        
         return $result;
     }
+
+    static function cleanup()
+    {
+        session_write_close();
+    }
 }
index d413494123565d8402c8afb11364dfb83b1bb300..1d4f37929b900bd740d173939516401bd693988b 100644 (file)
@@ -26,6 +26,8 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
 
 class Subscription extends Memcached_DataObject
 {
+    const CACHE_WINDOW = 201;
+
     ###START_AUTOCODE
     /* the code below is auto generated do not remove the above tag */
 
@@ -91,6 +93,9 @@ class Subscription extends Memcached_DataObject
 
             self::blow('user:notices_with_friends:%d', $subscriber->id);
 
+            self::blow('subscription:by-subscriber:'.$subscriber->id);
+            self::blow('subscription:by-subscribed:'.$other->id);
+
             $subscriber->blowSubscriptionCount();
             $other->blowSubscriberCount();
 
@@ -220,6 +225,9 @@ class Subscription extends Memcached_DataObject
 
             self::blow('user:notices_with_friends:%d', $subscriber->id);
 
+            self::blow('subscription:by-subscriber:'.$subscriber->id);
+            self::blow('subscription:by-subscribed:'.$other->id);
+
             $subscriber->blowSubscriptionCount();
             $other->blowSubscriberCount();
 
@@ -273,4 +281,147 @@ class Subscription extends Memcached_DataObject
 
         return $act;
     }
+
+    /**
+     * Stream of subscriptions with the same subscriber
+     *
+     * Useful for showing pages that list subscriptions in reverse
+     * chronological order. Has offset & limit to make paging
+     * easy.
+     *
+     * @param integer $subscriberId Profile ID of the subscriber
+     * @param integer $offset       Offset from latest
+     * @param integer $limit        Maximum number to fetch
+     *
+     * @return Subscription stream of subscriptions; use fetch() to iterate
+     */
+
+    static function bySubscriber($subscriberId,
+                                 $offset = 0,
+                                 $limit = PROFILES_PER_PAGE)
+    {
+        if ($offset + $limit > self::CACHE_WINDOW) {
+            return new ArrayWrapper(self::realBySubscriber($subscriberId,
+                                                           $offset,
+                                                           $limit));
+        } else {
+            $key = 'subscription:by-subscriber:'.$subscriberId;
+            $window = self::cacheGet($key);
+            if ($window === false) {
+                $window = self::realBySubscriber($subscriberId,
+                                                 0,
+                                                 self::CACHE_WINDOW);
+                self::cacheSet($key, $window);
+            }
+            return new ArrayWrapper(array_slice($window,
+                                                $offset,
+                                                $limit));
+        }
+    }
+
+    private static function realBySubscriber($subscriberId,
+                                             $offset,
+                                             $limit)
+    {
+        $sub = new Subscription();
+
+        $sub->subscriber = $subscriberId;
+
+        $sub->whereAdd('subscribed != ' . $subscriberId);
+
+        $sub->orderBy('created DESC');
+        $sub->limit($offset, $limit);
+
+        $sub->find();
+
+        $subs = array();
+
+        while ($sub->fetch()) {
+            $subs[] = clone($sub);
+        }
+
+        return $subs;
+    }
+
+    /**
+     * Stream of subscriptions with the same subscribed profile
+     *
+     * Useful for showing pages that list subscribers in reverse
+     * chronological order. Has offset & limit to make paging
+     * easy.
+     *
+     * @param integer $subscribedId Profile ID of the subscribed
+     * @param integer $offset       Offset from latest
+     * @param integer $limit        Maximum number to fetch
+     *
+     * @return Subscription stream of subscriptions; use fetch() to iterate
+     */
+
+    static function bySubscribed($subscribedId,
+                                 $offset = 0,
+                                 $limit = PROFILES_PER_PAGE)
+    {
+        if ($offset + $limit > self::CACHE_WINDOW) {
+            return new ArrayWrapper(self::realBySubscribed($subscribedId,
+                                                           $offset,
+                                                           $limit));
+        } else {
+            $key = 'subscription:by-subscribed:'.$subscribedId;
+            $window = self::cacheGet($key);
+            if ($window === false) {
+                $window = self::realBySubscribed($subscribedId,
+                                                 0,
+                                                 self::CACHE_WINDOW);
+                self::cacheSet($key, $window);
+            }
+            return new ArrayWrapper(array_slice($window,
+                                                $offset,
+                                                $limit));
+        }
+    }
+
+    private static function realBySubscribed($subscribedId,
+                                             $offset,
+                                             $limit)
+    {
+        $sub = new Subscription();
+
+        $sub->subscribed = $subscribedId;
+
+        $sub->whereAdd('subscriber != ' . $subscribedId);
+
+        $sub->orderBy('created DESC');
+        $sub->limit($offset, $limit);
+
+        $sub->find();
+
+        $subs = array();
+
+        while ($sub->fetch()) {
+            $subs[] = clone($sub);
+        }
+
+        return $subs;
+    }
+
+    /**
+     * Flush cached subscriptions when subscription is updated
+     *
+     * Because we cache subscriptions, it's useful to flush them
+     * here.
+     *
+     * @param mixed $orig Original version of object
+     *
+     * @return boolean success flag.
+     */
+
+    function update($orig=null)
+    {
+        $result = parent::update($orig);
+
+        self::blow('subscription:by-subscriber:'.$this->subscriber);
+        self::blow('subscription:by-subscribed:'.$this->subscribed);
+
+        return $result;
+    }
 }