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() {
}
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) {
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);
}
}
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));
}
}
}