Add a method the memcached_object that lets it cache query results

This commit is contained in:
Evan Prodromou 2009-01-22 19:13:26 +01:00
parent e2869fcf0a
commit 8c79646e53

View File

@ -21,7 +21,7 @@ if (!defined('LACONICA')) { exit(1); }
require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
class Memcached_DataObject extends DB_DataObject class Memcached_DataObject extends DB_DataObject
{ {
function &staticGet($cls, $k, $v=null) function &staticGet($cls, $k, $v=null)
{ {
@ -69,7 +69,7 @@ class Memcached_DataObject extends DB_DataObject
$result = parent::insert(); $result = parent::insert();
return $result; return $result;
} }
function update($orig=null) function update($orig=null)
{ {
if (is_object($orig) && $orig instanceof Memcached_DataObject) { if (is_object($orig) && $orig instanceof Memcached_DataObject) {
@ -81,21 +81,21 @@ class Memcached_DataObject extends DB_DataObject
} }
return $result; return $result;
} }
function delete() function delete()
{ {
$this->decache(); # while we still have the values! $this->decache(); # while we still have the values!
return parent::delete(); return parent::delete();
} }
static function memcache() { static function memcache() {
return common_memcache(); return common_memcache();
} }
static function cacheKey($cls, $k, $v) { static function cacheKey($cls, $k, $v) {
return common_cache_key(strtolower($cls).':'.$k.':'.$v); return common_cache_key(strtolower($cls).':'.$k.':'.$v);
} }
static function getcached($cls, $k, $v) { static function getcached($cls, $k, $v) {
$c = Memcached_DataObject::memcache(); $c = Memcached_DataObject::memcache();
if (!$c) { if (!$c) {
@ -114,7 +114,7 @@ class Memcached_DataObject extends DB_DataObject
} }
return $_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"]; return $_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"];
} }
function encache() function encache()
{ {
$c = $this->memcache(); $c = $this->memcache();
@ -122,7 +122,7 @@ class Memcached_DataObject extends DB_DataObject
return false; return false;
} else { } else {
$pkey = array(); $pkey = array();
$pval = array(); $pval = array();
$types = $this->keyTypes(); $types = $this->keyTypes();
ksort($types); ksort($types);
foreach ($types as $key => $type) { foreach ($types as $key => $type) {
@ -139,7 +139,7 @@ class Memcached_DataObject extends DB_DataObject
$c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this); $c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this);
} }
} }
function decache() function decache()
{ {
$c = $this->memcache(); $c = $this->memcache();
@ -147,7 +147,7 @@ class Memcached_DataObject extends DB_DataObject
return false; return false;
} else { } else {
$pkey = array(); $pkey = array();
$pval = array(); $pval = array();
$types = $this->keyTypes(); $types = $this->keyTypes();
ksort($types); ksort($types);
foreach ($types as $key => $type) { foreach ($types as $key => $type) {
@ -201,4 +201,33 @@ class Memcached_DataObject extends DB_DataObject
} }
return $search_engine; return $search_engine;
} }
static function cachedQuery($cls, $qry, $expiry=3600)
{
$c = Memcached_DataObject::memcache();
if (!$c) {
$inst = new $cls();
$inst->query($qry);
return $cls;
}
$key_part = common_keyize($cls).':'.md5($qry);
$ckey = common_cache_key($key_part);
$stored = $c->get($ckey);
if ($stored) {
return new ArrayWrapper($stored);
}
$inst = new $cls();
$result = $inst->query($qry);
if (!$result) {
return $inst;
}
$cached = array();
while ($inst->fetch()) {
$cached[] = clone($inst);
}
$inst->free();
$c->set($ckey, $cached, MEMCACHE_COMPRESSED, $expiry);
return ArrayWrapper($cached);
}
} }