We are no longer offering accounts on this server. Consider https://gitlab.freedesktop.org/ as a place to host projects.

Commit 69765a05 authored by Brion Vibber's avatar Brion Vibber

Fix for caching with compound keys: add Managed_DataObject::_allCacheKeys() to...

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.
parent 797e187a
......@@ -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
......@@ -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;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment