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)
+ {
if (is_null($v)) {
$v = $k;
# XXX: HACK!
}
}
- function &pkeyGet($cls, $kv) {
+ function &pkeyGet($cls, $kv)
+ {
$i = Memcached_DataObject::multicache($cls, $kv);
if ($i) {
return $i;
if ($i->find(true)) {
$i->encache();
} else {
- $i = NULL;
+ $i = null;
}
return $i;
}
}
- function insert() {
+ function insert()
+ {
$result = parent::insert();
return $result;
}
-
- function update($orig=NULL) {
+
+ function update($orig=null)
+ {
if (is_object($orig) && $orig instanceof Memcached_DataObject) {
$orig->decache(); # might be different keys
}
}
return $result;
}
-
- function delete() {
+
+ function delete()
+ {
$this->decache(); # while we still have the values!
return parent::delete();
}
-
+
static function memcache() {
return common_memcache();
}
-
+
static function cacheKey($cls, $k, $v) {
return common_cache_key(strtolower($cls).':'.$k.':'.$v);
}
-
+
static function getcached($cls, $k, $v) {
$c = Memcached_DataObject::memcache();
if (!$c) {
}
}
- function keyTypes() {
+ function keyTypes()
+ {
global $_DB_DATAOBJECT;
if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"])) {
$this->databaseStructure();
}
return $_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"];
}
-
- function encache() {
+
+ function encache()
+ {
$c = $this->memcache();
if (!$c) {
return false;
} else {
$pkey = array();
- $pval = array();
+ $pval = array();
$types = $this->keyTypes();
ksort($types);
foreach ($types as $key => $type) {
$c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this);
}
}
-
- function decache() {
+
+ function decache()
+ {
$c = $this->memcache();
if (!$c) {
return false;
} else {
$pkey = array();
- $pval = array();
+ $pval = array();
$types = $this->keyTypes();
ksort($types);
foreach ($types as $key => $type) {
}
}
- function multicache($cls, $kv) {
+ function multicache($cls, $kv)
+ {
ksort($kv);
$c = Memcached_DataObject::memcache();
if (!$c) {
}
}
- function getSearchEngine($table) {
+ function getSearchEngine($table)
+ {
require_once INSTALLDIR.'/lib/search_engines.php';
static $search_engine;
if (!isset($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 $inst;
+ }
+ $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();
+ $inst->query($qry);
+ $cached = array();
+ while ($inst->fetch()) {
+ $cached[] = clone($inst);
+ }
+ $inst->free();
+ $c->set($ckey, $cached, MEMCACHE_COMPRESSED, $expiry);
+ return new ArrayWrapper($cached);
+ }
+
+ // We overload so that 'SET NAMES "utf8"' is called for
+ // each connection
+
+ function _connect()
+ {
+ global $_DB_DATAOBJECT;
+ $exists = !empty($this->_database_dsn_md5) &&
+ isset($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]);
+ $result = parent::_connect();
+ if (!$exists) {
+ $DB = &$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5];
+ if (common_config('db', 'type') == 'mysql' &&
+ common_config('db', 'utf8')) {
+ $conn = $DB->connection;
+ if ($DB instanceof DB_mysqli) {
+ mysqli_set_charset($conn, 'utf8');
+ } else if ($DB instanceof DB_mysql) {
+ mysql_set_charset('utf8', $conn);
+ }
+ }
+ }
+ return $result;
+ }
}