X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FMemcached_DataObject.php;h=f8e1b9accc6871495a2197680f24087ac3d42483;hb=894496f0e87fe198a0271cefdea1396c7c9f685d;hp=03067aba75e61131c3102cf1d855d31149c3faf8;hpb=92e1c41f636e5c22bc6a452872aae3b02a2f8f1c;p=quix0rs-gnu-social.git diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php index 03067aba75..f8e1b9accc 100644 --- a/classes/Memcached_DataObject.php +++ b/classes/Memcached_DataObject.php @@ -37,29 +37,45 @@ class Memcached_DataObject extends DB_DataObject return $i; } else { $i = DB_DataObject::staticGet($cls, $k, $v); - if (!is_null($i)) { + if ($i) { $i->encache(); } return $i; } } - + + function &pkeyGet($cls, $kv) { + $i = Memcached_DataObject::multicache($cls, $kv); + if ($i) { + return $i; + } else { + $i = new $cls(); + foreach ($kv as $k => $v) { + $i->$k = $v; + } + if ($i->find(true)) { + $i->encache(); + return $i; + } else { + return NULL; + } + } + } + function insert() { $result = parent::insert(); - if ($result) { - $this->encache(); - } return $result; } function update($orig=NULL) { - if (!is_null($orig)) { + if (is_object($orig) && $orig instanceof Memcached_DataObject) { $orig->decache(); # might be different keys } $result = parent::update($orig); if ($result) { $this->encache(); } + return $result; } function delete() { @@ -68,14 +84,7 @@ class Memcached_DataObject extends DB_DataObject } static function memcache() { - if (!common_config('memcached', 'enabled')) { - return NULL; - } else { - $cache = new Memcache(); - $res = $cache->connect(common_config('memcached', 'server'), - common_config('memcached', 'port')); - return ($res) ? $cache : NULL; - } + return common_memcache(); } static function cacheKey($cls, $k, $v) { @@ -105,26 +114,22 @@ class Memcached_DataObject extends DB_DataObject if (!$c) { return false; } else { - $primary = array(); + $pkey = array(); + $pval = array(); $types = $this->keyTypes(); ksort($types); foreach ($types as $key => $type) { if ($type == 'K') { - $primary[] = $key; + $pkey[] = $key; + $pval[] = $this->$key; } else { - $v = $this->$key; - if (!is_null($v)) { - $c->set($this->cacheKey($this->tableName(), $key, $v), - $this); - } + $c->set($this->cacheKey($this->tableName(), $key, $this->$key), $this); } } - # XXX: figure out what to do with compound pkeys - if (count($primary) == 1) { - $key = $primary[0]; - $c->set($this->cacheKey($this->tableName(), $key, $this->$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); } } @@ -133,21 +138,35 @@ class Memcached_DataObject extends DB_DataObject if (!$c) { return false; } else { - $primary = array(); + $pkey = array(); + $pval = array(); $types = $this->keyTypes(); ksort($types); foreach ($types as $key => $type) { if ($type == 'K') { - $primary[] = $this->$key; + $pkey[] = $key; + $pval[] = $this->$key; } else { $c->delete($this->cacheKey($this->tableName(), $key, $this->$key)); } } - # XXX: figure out what to do with compound pkeys - if (count($primary) == 1) { - $key = $primary[0]; - $c->delete($this->cacheKey($this->tableName(), $key, $this->$key)); - } + # should work for both compound and scalar pkeys + # XXX: comma works for now but may not be safe separator for future keys + $pvals = implode(',', $pval); + $pkeys = implode(',', $pkey); + $c->delete($this->cacheKey($this->tableName(), $pkeys, $pvals)); + } + } + + function multicache($cls, $kv) { + ksort($kv); + $c = Memcached_DataObject::memcache(); + if (!$c) { + return false; + } else { + $pkeys = implode(',', array_keys($kv)); + $pvals = implode(',', array_values($kv)); + return $c->get(Memcached_DataObject::cacheKey($cls, $pkeys, $pvals)); } } }