]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Merge branch 'compound-keys-fix' into 1.0.x
authorBrion Vibber <brion@pobox.com>
Fri, 30 Sep 2011 18:55:36 +0000 (11:55 -0700)
committerBrion Vibber <brion@pobox.com>
Fri, 30 Sep 2011 18:55:36 +0000 (11:55 -0700)
classes/Managed_DataObject.php
classes/User_im_prefs.php
lib/cache.php

index 106065fc46673c67181321da644fe2dae781dab1..1d55537e20b800c3fe5ec70b130406a3397fcaa4 100644 (file)
@@ -168,4 +168,38 @@ abstract class Managed_DataObject extends Memcached_DataObject
         }
         return $links;
     }
+
+    /**
+     * Return a list of all primary/unique keys / vals that will be used for
+     * caching. This will understand compound unique keys, which
+     * Memcached_DataObject doesn't have enough info to handle properly.
+     *
+     * @return array of strings
+     */
+    function _allCacheKeys()
+    {
+        $table = call_user_func(array(get_class($this), 'schemaDef'));
+        $ckeys = array();
+
+        if (!empty($table['unique keys'])) {
+            $keyNames = $table['unique keys'];
+            foreach ($keyNames as $idx => $fields) {
+                $val = array();
+                foreach ($fields as $name) {
+                    $val[$name] = self::valueString($this->$name);
+                }
+                $ckeys[] = self::multicacheKey($this->tableName(), $val);
+            }
+        }
+
+        if (!empty($table['primary key'])) {
+            $fields = $table['primary key'];
+            $val = array();
+            foreach ($fields as $name) {
+                $val[$name] = self::valueString($this->$name);
+            }
+            $ckeys[] = self::multicacheKey($this->tableName(), $val);
+        }
+        return $ckeys;
+    }
 }
\ No newline at end of file
index cc9dea608db7ebd4e479ff91006140f10bd5761f..90df216c542eb9c6eac33a994a7fb1844e7e93cb 100644 (file)
@@ -80,26 +80,4 @@ class User_im_prefs extends Managed_DataObject
         );
     }
 
-    /**
-     * We have two compound keys with unique constraints:
-     * (transport, user_id) which is our primary key, and
-     * (transport, screenname) which is an additional constraint.
-     * 
-     * Currently there's not a way to represent that second key
-     * in the general keys list, so we're adding it here to the
-     * list of keys to use for caching, ensuring that it gets
-     * cleared as well when we change.
-     * 
-     * @return array of cache keys
-     */
-    function _allCacheKeys()
-    {
-        $ukeys = 'transport,screenname';
-        $uvals = $this->transport . ',' . $this->screenname;
-
-        $ckeys = parent::_allCacheKeys();
-        $ckeys[] = $this->cacheKey($this->tableName(), $ukeys, $uvals);
-        return $ckeys;
-    }
-
 }
index eb4eb666567a9f21bf7b51e53c09bdf2a9390dd4..59110f74d845f1a425ffbcdbca7cab44a9a75c2f 100644 (file)
  */
 class Cache
 {
-    var $_items   = array();
+    /**
+     * @var array additional in-process cache for web requests;
+     *      disabled on CLI, unsafe for long-running daemons
+     */
+    var $_items = array();
+    var $_inlineCache = true;
     static $_inst = null;
 
     const COMPRESSED = 1;
 
+    private function __construct() {
+        // Potentially long-running daemons or maintenance scripts
+        // should not use an in-process cache as it becomes out of
+        // date.
+        $this->_inlineCache = (php_sapi_name() != 'cli');
+    }
+
     /**
      * Singleton constructor
      *
@@ -166,7 +178,7 @@ class Cache
 
         common_perf_counter('Cache::get', $key);
         if (Event::handle('StartCacheGet', array(&$key, &$value))) {
-            if (array_key_exists($key, $this->_items)) {
+            if ($this->_inlineCache && array_key_exists($key, $this->_items)) {
                 $value = unserialize($this->_items[$key]);
             }
             Event::handle('EndCacheGet', array($key, &$value));
@@ -193,7 +205,9 @@ class Cache
         if (Event::handle('StartCacheSet', array(&$key, &$value, &$flag,
                                                  &$expiry, &$success))) {
 
-            $this->_items[$key] = serialize($value);
+            if ($this->_inlineCache) {
+                $this->_items[$key] = serialize($value);
+            }
 
             $success = true;
 
@@ -244,7 +258,7 @@ class Cache
 
         common_perf_counter('Cache::delete', $key);
         if (Event::handle('StartCacheDelete', array(&$key, &$success))) {
-            if (array_key_exists($key, $this->_items)) {
+            if ($this->_inlineCache && array_key_exists($key, $this->_items)) {
                 unset($this->_items[$key]);
             }
             $success = true;