]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
OStatus: garbage collect unused PuSH subscriptions when the last local subscriber...
authorBrion Vibber <brion@pobox.com>
Thu, 11 Feb 2010 00:09:20 +0000 (00:09 +0000)
committerBrion Vibber <brion@pobox.com>
Thu, 11 Feb 2010 00:09:20 +0000 (00:09 +0000)
plugins/OStatus/OStatusPlugin.php
plugins/OStatus/actions/pushcallback.php
plugins/OStatus/classes/Feedinfo.php

index 4b9b4d2c32e54075c65f1ce8ca0911017db37f15..ce02393e4345c0ad88a17a0e73cd469c4526a285 100644 (file)
@@ -234,13 +234,30 @@ class OStatusPlugin extends Plugin
         }
     }
     
+
+    /**
+     * Garbage collect unused feeds on unsubscribe
+     */
+    function onEndUnsubscribe($user, $other)
+    {
+        $feed = Feedinfo::staticGet('profile_id', $other->id);
+        if ($feed) {
+            $sub = new Subscription();
+            $sub->subscribed = $other->id;
+            $sub->limit(1);
+            if (!$sub->find(true)) {
+                common_log(LOG_INFO, "Unsubscribing from now-unused feed $feed->feeduri on hub $feed->huburi");
+                $feed->unsubscribe();
+            }
+        }
+        return true;
+    }
+
     
     function onCheckSchema() {
-        // warning: the autoincrement doesn't seem to set.
-        // alter table feedinfo change column id id int(11) not null  auto_increment;
         $schema = Schema::get();
         $schema->ensureTable('feedinfo', Feedinfo::schemaDef());
         $schema->ensureTable('hubsub', HubSub::schemaDef());
         return true;
-    } 
+    }
 }
index a5e02e08f1442f9603174fc2fcace621b84b1048..471d079ab91e33ac510193760943765861670e04 100644 (file)
@@ -91,15 +91,20 @@ class PushCallbackAction extends Action
         #}
         
         // OK!
-        common_log(LOG_INFO, __METHOD__ . ': sub confirmed');
-        $feedinfo->sub_start = common_sql_date(time());
-        if ($lease_seconds > 0) {
-            $feedinfo->sub_end = common_sql_date(time() + $lease_seconds);
+        if ($mode == 'subscribe') {
+            common_log(LOG_INFO, __METHOD__ . ': sub confirmed');
+            $feedinfo->sub_start = common_sql_date(time());
+            if ($lease_seconds > 0) {
+                $feedinfo->sub_end = common_sql_date(time() + $lease_seconds);
+            } else {
+                $feedinfo->sub_end = null;
+            }
+            $feedinfo->update();
         } else {
-            $feedinfo->sub_end = null;
+            common_log(LOG_INFO, __METHOD__ . ": unsub confirmed; deleting sub record for $topic");
+            $feedinfo->delete();
         }
-        $feedinfo->update();
-        
+
         print $challenge;
     }
 }
index 2344a4a0eed480cb750f23ff407f12ba02b9a641..d3cccd42f0e14d12a19c76a8ae4f6a30ee62588f 100644 (file)
@@ -112,9 +112,9 @@ class Feedinfo extends Memcached_DataObject
                                    /*extra*/ null,
                                    /*auto_increment*/ true),
                      new ColumnDef('profile_id', 'integer',
-                                   null, true),
+                                   null, true, 'UNI'),
                      new ColumnDef('group_id', 'integer',
-                                   null, true),
+                                   null, true, 'UNI'),
                      new ColumnDef('feeduri', 'varchar',
                                    255, false, 'UNI'),
                      new ColumnDef('homeuri', 'varchar',
@@ -160,7 +160,7 @@ class Feedinfo extends Memcached_DataObject
 
     function keyTypes()
     {
-        return array('id' => 'K', 'feeduri' => 'U'); // @fixme we'll need a profile_id key at least
+        return array('id' => 'K', 'profile_id' => 'U', 'group_id' => 'U', 'feeduri' => 'U');
     }
 
     function sequenceKey()
@@ -261,11 +261,11 @@ class Feedinfo extends Memcached_DataObject
 
     /**
      * Send a subscription request to the hub for this feed.
-     * The hub will later send us a confirmation POST to /feedsub/callback.
+     * The hub will later send us a confirmation POST to /main/push/callback.
      *
      * @return bool true on success, false on failure
      */
-    public function subscribe()
+    public function subscribe($mode='subscribe')
     {
         if (common_config('feedsub', 'nohub')) {
             // Fake it! We're just testing remote feeds w/o hubs.
@@ -278,7 +278,7 @@ class Feedinfo extends Memcached_DataObject
         try {
             $callback = common_local_url('pushcallback', array('feed' => $this->id));
             $headers = array('Content-Type: application/x-www-form-urlencoded');
-            $post = array('hub.mode' => 'subscribe',
+            $post = array('hub.mode' => $mode,
                           'hub.callback' => $callback,
                           'hub.verify' => 'async',
                           'hub.verify_token' => $this->verify_token,
@@ -308,6 +308,16 @@ class Feedinfo extends Memcached_DataObject
         }
     }
 
+    /**
+     * Send an unsubscription request to the hub for this feed.
+     * The hub will later send us a confirmation POST to /main/push/callback.
+     *
+     * @return bool true on success, false on failure
+     */
+    public function unsubscribe() {
+        return $this->subscribe('unsubscribe');
+    }
+
     /**
      * Read and post notices for updates from the feed.
      * Currently assumes that all items in the feed are new,