]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Fix for caching with compound keys: add Managed_DataObject::_allCacheKeys() to overri...
authorBrion Vibber <brion@pobox.com>
Thu, 29 Sep 2011 01:32:43 +0000 (18:32 -0700)
committerBrion Vibber <brion@pobox.com>
Thu, 29 Sep 2011 01:32:43 +0000 (18:32 -0700)
Memcached_DataObject doesn't quite fully understand unique indexes, and can't properly build cache keys for compound unique or primary keys.
Managed_DataObject has more information in its schema data, so we can build a proper list.

classes/Managed_DataObject.php
classes/User_im_prefs.php

index 106065fc46673c67181321da644fe2dae781dab1..ba2883450c1e06d6d3c78171eb7dc87a8ecebc59 100644 (file)
@@ -168,4 +168,41 @@ 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'])) {
+            foreach ($table['unique keys'] as $idx => $fields) {
+                $val = array();
+                foreach ($fields as $name) {
+                    $val[] = self::valueString($this->$name);
+                }
+                $keys = implode(',', $fields);
+                $vals = implode(',', $val);
+                $ckeys[] = $this->cacheKey($this->tableName(), $keys, $vals);
+            }
+        }
+
+        if (!empty($table['primary key'])) {
+            $fields = $table['primary key'];
+            $val = array();
+            foreach ($fields as $name) {
+                $val[] = self::valueString($this->$name);
+            }
+            $keys = implode(',', $fields);
+            $vals = implode(',', $val);
+            $ckeys[] = $this->cacheKey($this->tableName(), $keys, $vals);
+        }
+        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;
-    }
-
 }