3 * Laconica - a distributed open-source microblogging tool
4 * Copyright (C) 2008, Controlez-Vous, Inc.
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Affero General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Affero General Public License for more details.
16 * You should have received a copy of the GNU Affero General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 if (!defined('LACONICA')) { exit(1); }
22 require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
24 class Memcached_DataObject extends DB_DataObject
26 function &staticGet($cls, $k, $v=NULL) {
35 $i = Memcached_DataObject::getcached($cls, $k, $v);
39 $i = DB_DataObject::staticGet($cls, $k, $v);
47 function &pkeyGet($cls, $kv) {
48 $i = Memcached_DataObject::multicache($cls, $kv);
53 foreach ($kv as $k => $v) {
66 $result = parent::insert();
70 function update($orig=NULL) {
71 if (is_object($orig) && $orig instanceof Memcached_DataObject) {
72 $orig->decache(); # might be different keys
74 $result = parent::update($orig);
82 $this->decache(); # while we still have the values!
83 return parent::delete();
86 static function memcache() {
87 return common_memcache();
90 static function cacheKey($cls, $k, $v) {
91 return common_cache_key(strtolower($cls).':'.$k.':'.$v);
94 static function getcached($cls, $k, $v) {
95 $c = Memcached_DataObject::memcache();
99 return $c->get(Memcached_DataObject::cacheKey($cls, $k, $v));
103 function keyTypes() {
104 global $_DB_DATAOBJECT;
105 if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"])) {
106 $this->databaseStructure();
109 return $_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"];
113 $c = $this->memcache();
119 $types = $this->keyTypes();
121 foreach ($types as $key => $type) {
124 $pval[] = $this->$key;
126 $c->set($this->cacheKey($this->tableName(), $key, $this->$key), $this);
129 # XXX: should work for both compound and scalar pkeys
130 $pvals = implode(',', $pval);
131 $pkeys = implode(',', $pkey);
132 $c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this);
137 $c = $this->memcache();
143 $types = $this->keyTypes();
145 foreach ($types as $key => $type) {
148 $pval[] = $this->$key;
150 $c->delete($this->cacheKey($this->tableName(), $key, $this->$key));
153 # should work for both compound and scalar pkeys
154 # XXX: comma works for now but may not be safe separator for future keys
155 $pvals = implode(',', $pval);
156 $pkeys = implode(',', $pkey);
157 $c->delete($this->cacheKey($this->tableName(), $pkeys, $pvals));
161 function multicache($cls, $kv) {
163 $c = Memcached_DataObject::memcache();
167 $pkeys = implode(',', array_keys($kv));
168 $pvals = implode(',', array_values($kv));
169 return $c->get(Memcached_DataObject::cacheKey($cls, $pkeys, $pvals));