From 69765a055074d00b723f5ebf0c13a4e2837a93f9 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 28 Sep 2011 18:32:43 -0700 Subject: [PATCH] Fix for caching with compound keys: add Managed_DataObject::_allCacheKeys() to override the one in Memcached_DataObject. 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 | 37 ++++++++++++++++++++++++++++++++++ classes/User_im_prefs.php | 22 -------------------- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/classes/Managed_DataObject.php b/classes/Managed_DataObject.php index 106065fc46..ba2883450c 100644 --- a/classes/Managed_DataObject.php +++ b/classes/Managed_DataObject.php @@ -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 diff --git a/classes/User_im_prefs.php b/classes/User_im_prefs.php index cc9dea608d..90df216c54 100644 --- a/classes/User_im_prefs.php +++ b/classes/User_im_prefs.php @@ -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; - } - }