forked from GNUsocial/gnu-social
Recover caching logic lost in bad merge
I made a bad merge on Jan 10th from master to 0.9.x. This lost a number of memcache enhancements made on the 0.9.x branch. I've been able to re-do the manual merge, and this represents the changes. Most of them are related to caching on insert.
This commit is contained in:
parent
7cd666ae92
commit
e6cf293db8
@ -66,7 +66,6 @@ class Memcached_DataObject extends DB_DataObject
|
||||
// Clear this out so we don't accidentally break global
|
||||
// state in *this* process.
|
||||
$this->_DB_resultid = null;
|
||||
|
||||
// We don't have any local DBO refs, so clear these out.
|
||||
$this->_link_loaded = false;
|
||||
}
|
||||
@ -91,9 +90,7 @@ class Memcached_DataObject extends DB_DataObject
|
||||
unset($i);
|
||||
}
|
||||
$i = Memcached_DataObject::getcached($cls, $k, $v);
|
||||
if ($i) {
|
||||
return $i;
|
||||
} else {
|
||||
if ($i === false) { // false == cache miss
|
||||
$i = DB_DataObject::factory($cls);
|
||||
if (empty($i)) {
|
||||
$i = false;
|
||||
@ -101,22 +98,34 @@ class Memcached_DataObject extends DB_DataObject
|
||||
}
|
||||
$result = $i->get($k, $v);
|
||||
if ($result) {
|
||||
// Hit!
|
||||
$i->encache();
|
||||
return $i;
|
||||
} else {
|
||||
// save the fact that no such row exists
|
||||
$c = self::memcache();
|
||||
if (!empty($c)) {
|
||||
$ck = self::cachekey($cls, $k, $v);
|
||||
$c->set($ck, null);
|
||||
}
|
||||
$i = false;
|
||||
}
|
||||
}
|
||||
return $i;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function &pkeyGet($cls, $kv)
|
||||
/**
|
||||
* @fixme Should this return false on lookup fail to match staticGet?
|
||||
*/
|
||||
function pkeyGet($cls, $kv)
|
||||
{
|
||||
$i = Memcached_DataObject::multicache($cls, $kv);
|
||||
if ($i) {
|
||||
if ($i !== false) { // false == cache miss
|
||||
return $i;
|
||||
} else {
|
||||
$i = new $cls();
|
||||
$i = DB_DataObject::factory($cls);
|
||||
if (empty($i)) {
|
||||
return false;
|
||||
}
|
||||
foreach ($kv as $k => $v) {
|
||||
$i->$k = $v;
|
||||
}
|
||||
@ -124,6 +133,11 @@ class Memcached_DataObject extends DB_DataObject
|
||||
$i->encache();
|
||||
} else {
|
||||
$i = null;
|
||||
$c = self::memcache();
|
||||
if (!empty($c)) {
|
||||
$ck = self::multicacheKey($cls, $kv);
|
||||
$c->set($ck, null);
|
||||
}
|
||||
}
|
||||
return $i;
|
||||
}
|
||||
@ -132,6 +146,9 @@ class Memcached_DataObject extends DB_DataObject
|
||||
function insert()
|
||||
{
|
||||
$result = parent::insert();
|
||||
if ($result) {
|
||||
$this->encache(); // in case of cached negative lookups
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
@ -186,6 +203,17 @@ class Memcached_DataObject extends DB_DataObject
|
||||
|
||||
function keyTypes()
|
||||
{
|
||||
// ini-based classes return number-indexed arrays. handbuilt
|
||||
// classes return column => keytype. Make this uniform.
|
||||
|
||||
$keys = $this->keys();
|
||||
|
||||
$keyskeys = array_keys($keys);
|
||||
|
||||
if (is_string($keyskeys[0])) {
|
||||
return $keys;
|
||||
}
|
||||
|
||||
global $_DB_DATAOBJECT;
|
||||
if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"])) {
|
||||
$this->databaseStructure();
|
||||
@ -197,6 +225,7 @@ class Memcached_DataObject extends DB_DataObject
|
||||
function encache()
|
||||
{
|
||||
$c = $this->memcache();
|
||||
|
||||
if (!$c) {
|
||||
return false;
|
||||
} else if ($this->tableName() == 'user' && is_object($this->id)) {
|
||||
@ -206,62 +235,84 @@ class Memcached_DataObject extends DB_DataObject
|
||||
str_replace("\n", " ", $e->getTraceAsString()));
|
||||
return false;
|
||||
} else {
|
||||
$pkey = array();
|
||||
$pval = array();
|
||||
$types = $this->keyTypes();
|
||||
ksort($types);
|
||||
foreach ($types as $key => $type) {
|
||||
if ($type == 'K') {
|
||||
$pkey[] = $key;
|
||||
$pval[] = $this->$key;
|
||||
} else {
|
||||
$c->set($this->cacheKey($this->tableName(), $key, $this->$key), $this);
|
||||
$keys = $this->_allCacheKeys();
|
||||
|
||||
foreach ($keys as $key) {
|
||||
$c->set($key, $this);
|
||||
}
|
||||
}
|
||||
# XXX: should work for both compound and scalar pkeys
|
||||
$pvals = implode(',', $pval);
|
||||
$pkeys = implode(',', $pkey);
|
||||
$c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this);
|
||||
}
|
||||
}
|
||||
|
||||
function decache()
|
||||
{
|
||||
$c = $this->memcache();
|
||||
|
||||
if (!$c) {
|
||||
return false;
|
||||
} else {
|
||||
$pkey = array();
|
||||
$pval = array();
|
||||
}
|
||||
|
||||
$keys = $this->_allCacheKeys();
|
||||
|
||||
foreach ($keys as $key) {
|
||||
$c->delete($key, $this);
|
||||
}
|
||||
}
|
||||
|
||||
function _allCacheKeys()
|
||||
{
|
||||
$ckeys = array();
|
||||
|
||||
$types = $this->keyTypes();
|
||||
ksort($types);
|
||||
|
||||
$pkey = array();
|
||||
$pval = array();
|
||||
|
||||
foreach ($types as $key => $type) {
|
||||
if ($type == 'K') {
|
||||
|
||||
assert(!empty($key));
|
||||
|
||||
if ($type == 'U') {
|
||||
if (empty($this->$key)) {
|
||||
continue;
|
||||
}
|
||||
$ckeys[] = $this->cacheKey($this->tableName(), $key, $this->$key);
|
||||
} else if ($type == 'K' || $type == 'N') {
|
||||
$pkey[] = $key;
|
||||
$pval[] = $this->$key;
|
||||
} else {
|
||||
$c->delete($this->cacheKey($this->tableName(), $key, $this->$key));
|
||||
throw new Exception("Unknown key type $key => $type for " . $this->tableName());
|
||||
}
|
||||
}
|
||||
# should work for both compound and scalar pkeys
|
||||
# XXX: comma works for now but may not be safe separator for future keys
|
||||
|
||||
assert(count($pkey) > 0);
|
||||
|
||||
// XXX: should work for both compound and scalar pkeys
|
||||
$pvals = implode(',', $pval);
|
||||
$pkeys = implode(',', $pkey);
|
||||
$c->delete($this->cacheKey($this->tableName(), $pkeys, $pvals));
|
||||
}
|
||||
|
||||
$ckeys[] = $this->cacheKey($this->tableName(), $pkeys, $pvals);
|
||||
|
||||
return $ckeys;
|
||||
}
|
||||
|
||||
function multicache($cls, $kv)
|
||||
{
|
||||
ksort($kv);
|
||||
$c = Memcached_DataObject::memcache();
|
||||
$c = self::memcache();
|
||||
if (!$c) {
|
||||
return false;
|
||||
} else {
|
||||
return $c->get(self::multicacheKey($cls, $kv));
|
||||
}
|
||||
}
|
||||
|
||||
static function multicacheKey($cls, $kv)
|
||||
{
|
||||
ksort($kv);
|
||||
$pkeys = implode(',', array_keys($kv));
|
||||
$pvals = implode(',', array_values($kv));
|
||||
return $c->get(Memcached_DataObject::cacheKey($cls, $pkeys, $pvals));
|
||||
}
|
||||
return self::cacheKey($cls, $pkeys, $pvals);
|
||||
}
|
||||
|
||||
function getSearchEngine($table)
|
||||
@ -298,7 +349,8 @@ class Memcached_DataObject extends DB_DataObject
|
||||
$key_part = common_keyize($cls).':'.md5($qry);
|
||||
$ckey = common_cache_key($key_part);
|
||||
$stored = $c->get($ckey);
|
||||
if ($stored) {
|
||||
|
||||
if ($stored !== false) {
|
||||
return new ArrayWrapper($stored);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user