<?php
/*
- * Laconica - a distributed open-source microblogging tool
- * Copyright (C) 2008, 2009, Control Yourself, Inc.
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2008, 2009, StatusNet, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-if (!defined('LACONICA')) { exit(1); }
+if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
class Memcached_DataObject extends DB_DataObject
{
+ /**
+ * Destructor to free global memory resources associated with
+ * this data object when it's unset or goes out of scope.
+ * DB_DataObject doesn't do this yet by itself.
+ */
+
+ function __destruct()
+ {
+ $this->free();
+ if (method_exists('DB_DataObject', '__destruct')) {
+ parent::__destruct();
+ }
+ }
+
function &staticGet($cls, $k, $v=null)
{
if (is_null($v)) {
if ($i) {
return $i;
} else {
- $i = DB_DataObject::staticGet($cls, $k, $v);
- if ($i) {
+ $i = DB_DataObject::factory($cls);
+ if (empty($i)) {
+ return null;
+ }
+ $result = $i->get($k, $v);
+ if ($result) {
$i->encache();
+ return $i;
+ } else {
+ return null;
}
- return $i;
}
}
}
static function cacheKey($cls, $k, $v) {
+ if (is_object($cls) || is_object($j) || is_object($v)) {
+ $e = new Exception();
+ common_log(LOG_ERR, __METHOD__ . ' object in param: ' .
+ str_replace("\n", " ", $e->getTraceAsString()));
+ }
return common_cache_key(strtolower($cls).':'.$k.':'.$v);
}
require_once INSTALLDIR.'/lib/search_engines.php';
static $search_engine;
if (!isset($search_engine)) {
- $connected = false;
- if (common_config('sphinx', 'enabled')) {
- $search_engine = new SphinxSearch($this, $table);
- $connected = $search_engine->is_connected();
- }
-
- // unable to connect to sphinx' search daemon
- if (!$connected) {
- if ('mysql' === common_config('db', 'type')) {
- $type = common_config('search', 'type');
- if ($type == 'like') {
- $search_engine = new MySQLLikeSearch($this, $table);
- } else if ($type == 'fulltext') {
- $search_engine = new MySQLSearch($this, $table);
- } else {
- throw new ServerException('Unknown search type: ' . $type);
- }
+ if (Event::handle('GetSearchEngine', array($this, $table, &$search_engine))) {
+ if ('mysql' === common_config('db', 'type')) {
+ $type = common_config('search', 'type');
+ if ($type == 'like') {
+ $search_engine = new MySQLLikeSearch($this, $table);
+ } else if ($type == 'fulltext') {
+ $search_engine = new MySQLSearch($this, $table);
} else {
- $search_engine = new PGSearch($this, $table);
+ throw new ServerException('Unknown search type: ' . $type);
}
+ } else {
+ $search_engine = new PGSearch($this, $table);
}
+ }
}
return $search_engine;
}
return new ArrayWrapper($cached);
}
+ function cleanup()
+ {
+ global $_DB_DATAOBJECT;
+
+ if (isset($_DB_DATAOBJECT['RESULTFIELDS'][$this->_DB_resultid])) {
+ unset($_DB_DATAOBJECT['RESULTFIELDS'][$this->_DB_resultid]);
+ }
+ if (isset($_DB_DATAOBJECT['RESULTS'][$this->_DB_resultid])) {
+ unset($_DB_DATAOBJECT['RESULTS'][$this->_DB_resultid]);
+ }
+ }
+
// 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]);
+
+ $sum = $this->_getDbDsnMD5();
+
+ if (!empty($_DB_DATAOBJECT['CONNECTIONS'][$sum]) &&
+ !PEAR::isError($_DB_DATAOBJECT['CONNECTIONS'][$sum])) {
+ $exists = true;
+ } else {
+ $exists = false;
+ }
+
$result = parent::_connect();
- if (!$exists) {
+
+ if ($result && !$exists) {
$DB = &$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5];
if (common_config('db', 'type') == 'mysql' &&
common_config('db', 'utf8')) {
}
}
}
+
return $result;
}
+ // XXX: largely cadged from DB_DataObject
+
+ function _getDbDsnMD5()
+ {
+ if ($this->_database_dsn_md5) {
+ return $this->_database_dsn_md5;
+ }
+
+ $dsn = $this->_getDbDsn();
+
+ if (is_string($dsn)) {
+ $sum = md5($dsn);
+ } else {
+ /// support array based dsn's
+ $sum = md5(serialize($dsn));
+ }
+
+ return $sum;
+ }
+
+ function _getDbDsn()
+ {
+ global $_DB_DATAOBJECT;
+
+ if (empty($_DB_DATAOBJECT['CONFIG'])) {
+ DB_DataObject::_loadConfig();
+ }
+
+ $options = &$_DB_DATAOBJECT['CONFIG'];
+
+ // if the databse dsn dis defined in the object..
+
+ $dsn = isset($this->_database_dsn) ? $this->_database_dsn : null;
+
+ if (!$dsn) {
+
+ if (!$this->_database) {
+ $this->_database = isset($options["table_{$this->__table}"]) ? $options["table_{$this->__table}"] : null;
+ }
+
+ if ($this->_database && !empty($options["database_{$this->_database}"])) {
+ $dsn = $options["database_{$this->_database}"];
+ } else if (!empty($options['database'])) {
+ $dsn = $options['database'];
+ }
+ }
+
+ if (!$dsn) {
+ throw new Exception("No database name / dsn found anywhere");
+ }
+
+ return $dsn;
+ }
}