Merge branch 'master' into 0.9.x
Conflicts: classes/Memcached_DataObject.php
This commit is contained in:
commit
866dfa6822
|
@ -80,7 +80,14 @@ class File extends Memcached_DataObject
|
||||||
if (isset($redir_data['type'])
|
if (isset($redir_data['type'])
|
||||||
&& (('text/html' === substr($redir_data['type'], 0, 9) || 'application/xhtml+xml' === substr($redir_data['type'], 0, 21)))
|
&& (('text/html' === substr($redir_data['type'], 0, 9) || 'application/xhtml+xml' === substr($redir_data['type'], 0, 21)))
|
||||||
&& ($oembed_data = File_oembed::_getOembed($given_url))) {
|
&& ($oembed_data = File_oembed::_getOembed($given_url))) {
|
||||||
|
|
||||||
|
$fo = File_oembed::staticGet('file_id', $file_id);
|
||||||
|
|
||||||
|
if (empty($fo)) {
|
||||||
File_oembed::saveNew($oembed_data, $file_id);
|
File_oembed::saveNew($oembed_data, $file_id);
|
||||||
|
} else {
|
||||||
|
common_log(LOG_WARNING, "Strangely, a File_oembed object exists for new file $file_id", __FILE__);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return $x;
|
return $x;
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,13 @@ class File_oembed extends Memcached_DataObject
|
||||||
}
|
}
|
||||||
$file_oembed->insert();
|
$file_oembed->insert();
|
||||||
if (!empty($data->thumbnail_url)) {
|
if (!empty($data->thumbnail_url)) {
|
||||||
File_thumbnail::saveNew($data, $file_id);
|
$ft = File_thumbnail::staticGet('file_id', $file_id);
|
||||||
|
if (!empty($ft)) {
|
||||||
|
common_log(LOG_WARNING, "Strangely, a File_thumbnail object exists for new file $file_id",
|
||||||
|
__FILE__);
|
||||||
|
} else {
|
||||||
|
File_thumbnail::saveNew($data, $file_id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
|
|
||||||
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
||||||
|
|
||||||
|
require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
|
||||||
|
|
||||||
class Memcached_DataObject extends DB_DataObject
|
class Memcached_DataObject extends DB_DataObject
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -66,6 +68,7 @@ class Memcached_DataObject extends DB_DataObject
|
||||||
// Clear this out so we don't accidentally break global
|
// Clear this out so we don't accidentally break global
|
||||||
// state in *this* process.
|
// state in *this* process.
|
||||||
$this->_DB_resultid = null;
|
$this->_DB_resultid = null;
|
||||||
|
|
||||||
// We don't have any local DBO refs, so clear these out.
|
// We don't have any local DBO refs, so clear these out.
|
||||||
$this->_link_loaded = false;
|
$this->_link_loaded = false;
|
||||||
}
|
}
|
||||||
|
@ -90,42 +93,30 @@ class Memcached_DataObject extends DB_DataObject
|
||||||
unset($i);
|
unset($i);
|
||||||
}
|
}
|
||||||
$i = Memcached_DataObject::getcached($cls, $k, $v);
|
$i = Memcached_DataObject::getcached($cls, $k, $v);
|
||||||
if ($i === false) { // false == cache miss
|
if ($i) {
|
||||||
$i = DB_DataObject::factory($cls);
|
|
||||||
if (empty($i)) {
|
|
||||||
$i = false;
|
|
||||||
return $i;
|
|
||||||
}
|
|
||||||
$result = $i->get($k, $v);
|
|
||||||
if ($result) {
|
|
||||||
// Hit!
|
|
||||||
$i->encache();
|
|
||||||
} else {
|
|
||||||
// save the fact that no such row exists
|
|
||||||
$c = self::memcache();
|
|
||||||
if (!empty($c)) {
|
|
||||||
$ck = self::cachekey($cls, $k, $v);
|
|
||||||
$c->set($ck, null);
|
|
||||||
}
|
|
||||||
$i = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $i;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @fixme Should this return false on lookup fail to match staticGet?
|
|
||||||
*/
|
|
||||||
function pkeyGet($cls, $kv)
|
|
||||||
{
|
|
||||||
$i = Memcached_DataObject::multicache($cls, $kv);
|
|
||||||
if ($i !== false) { // false == cache miss
|
|
||||||
return $i;
|
return $i;
|
||||||
} else {
|
} else {
|
||||||
$i = DB_DataObject::factory($cls);
|
$i = DB_DataObject::factory($cls);
|
||||||
if (empty($i)) {
|
if (empty($i)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
$result = $i->get($k, $v);
|
||||||
|
if ($result) {
|
||||||
|
$i->encache();
|
||||||
|
return $i;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function &pkeyGet($cls, $kv)
|
||||||
|
{
|
||||||
|
$i = Memcached_DataObject::multicache($cls, $kv);
|
||||||
|
if ($i) {
|
||||||
|
return $i;
|
||||||
|
} else {
|
||||||
|
$i = new $cls();
|
||||||
foreach ($kv as $k => $v) {
|
foreach ($kv as $k => $v) {
|
||||||
$i->$k = $v;
|
$i->$k = $v;
|
||||||
}
|
}
|
||||||
|
@ -133,11 +124,6 @@ class Memcached_DataObject extends DB_DataObject
|
||||||
$i->encache();
|
$i->encache();
|
||||||
} else {
|
} else {
|
||||||
$i = null;
|
$i = null;
|
||||||
$c = self::memcache();
|
|
||||||
if (!empty($c)) {
|
|
||||||
$ck = self::multicacheKey($cls, $kv);
|
|
||||||
$c->set($ck, null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return $i;
|
return $i;
|
||||||
}
|
}
|
||||||
|
@ -146,9 +132,6 @@ class Memcached_DataObject extends DB_DataObject
|
||||||
function insert()
|
function insert()
|
||||||
{
|
{
|
||||||
$result = parent::insert();
|
$result = parent::insert();
|
||||||
if ($result) {
|
|
||||||
$this->encache(); // in case of cached negative lookups
|
|
||||||
}
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -188,23 +171,21 @@ class Memcached_DataObject extends DB_DataObject
|
||||||
if (!$c) {
|
if (!$c) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
return $c->get(Memcached_DataObject::cacheKey($cls, $k, $v));
|
$obj = $c->get(Memcached_DataObject::cacheKey($cls, $k, $v));
|
||||||
|
if (0 == strcasecmp($cls, 'User')) {
|
||||||
|
// Special case for User
|
||||||
|
if (is_object($obj->id)) {
|
||||||
|
common_log(LOG_ERR, "User " . $obj->nickname . " was cached with User as ID; deleting");
|
||||||
|
$c->delete(Memcached_DataObject::cacheKey($cls, $k, $v));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $obj;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function keyTypes()
|
function keyTypes()
|
||||||
{
|
{
|
||||||
// ini-based classes return number-indexed arrays. handbuilt
|
|
||||||
// classes return column => keytype. Make this uniform.
|
|
||||||
|
|
||||||
$keys = $this->keys();
|
|
||||||
|
|
||||||
$keyskeys = array_keys($keys);
|
|
||||||
|
|
||||||
if (is_string($keyskeys[0])) {
|
|
||||||
return $keys;
|
|
||||||
}
|
|
||||||
|
|
||||||
global $_DB_DATAOBJECT;
|
global $_DB_DATAOBJECT;
|
||||||
if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"])) {
|
if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"])) {
|
||||||
$this->databaseStructure();
|
$this->databaseStructure();
|
||||||
|
@ -216,90 +197,73 @@ class Memcached_DataObject extends DB_DataObject
|
||||||
function encache()
|
function encache()
|
||||||
{
|
{
|
||||||
$c = $this->memcache();
|
$c = $this->memcache();
|
||||||
|
|
||||||
if (!$c) {
|
if (!$c) {
|
||||||
return false;
|
return false;
|
||||||
}
|
} else if ($this->tableName() == 'user' && is_object($this->id)) {
|
||||||
|
// Special case for User bug
|
||||||
$keys = $this->_allCacheKeys();
|
$e = new Exception();
|
||||||
|
common_log(LOG_ERR, __METHOD__ . ' caching user with User object as ID ' .
|
||||||
foreach ($keys as $key) {
|
str_replace("\n", " ", $e->getTraceAsString()));
|
||||||
$c->set($key, $this);
|
return false;
|
||||||
|
} else {
|
||||||
|
$pkey = array();
|
||||||
|
$pval = array();
|
||||||
|
$types = $this->keyTypes();
|
||||||
|
ksort($types);
|
||||||
|
foreach ($types as $key => $type) {
|
||||||
|
if ($type == 'K') {
|
||||||
|
$pkey[] = $key;
|
||||||
|
$pval[] = $this->$key;
|
||||||
|
} else {
|
||||||
|
$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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function decache()
|
function decache()
|
||||||
{
|
{
|
||||||
$c = $this->memcache();
|
$c = $this->memcache();
|
||||||
|
|
||||||
if (!$c) {
|
if (!$c) {
|
||||||
return false;
|
return false;
|
||||||
}
|
} else {
|
||||||
|
$pkey = array();
|
||||||
$keys = $this->_allCacheKeys();
|
$pval = array();
|
||||||
|
$types = $this->keyTypes();
|
||||||
foreach ($keys as $key) {
|
ksort($types);
|
||||||
$c->delete($key, $this);
|
foreach ($types as $key => $type) {
|
||||||
}
|
if ($type == 'K') {
|
||||||
}
|
$pkey[] = $key;
|
||||||
|
$pval[] = $this->$key;
|
||||||
function _allCacheKeys()
|
} else {
|
||||||
{
|
$c->delete($this->cacheKey($this->tableName(), $key, $this->$key));
|
||||||
$ckeys = array();
|
|
||||||
|
|
||||||
$types = $this->keyTypes();
|
|
||||||
ksort($types);
|
|
||||||
|
|
||||||
$pkey = array();
|
|
||||||
$pval = array();
|
|
||||||
|
|
||||||
foreach ($types as $key => $type) {
|
|
||||||
|
|
||||||
assert(!empty($key));
|
|
||||||
|
|
||||||
if ($type == 'U') {
|
|
||||||
if (empty($this->$key)) {
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
$ckeys[] = $this->cacheKey($this->tableName(), $key, $this->$key);
|
|
||||||
} else if ($type == 'K' || $type == 'N') {
|
|
||||||
$pkey[] = $key;
|
|
||||||
$pval[] = $this->$key;
|
|
||||||
} else {
|
|
||||||
throw new Exception("Unknown key type $key => $type for " . $this->tableName());
|
|
||||||
}
|
}
|
||||||
|
# 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));
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(count($pkey) > 0);
|
|
||||||
|
|
||||||
// XXX: should work for both compound and scalar pkeys
|
|
||||||
$pvals = implode(',', $pval);
|
|
||||||
$pkeys = implode(',', $pkey);
|
|
||||||
|
|
||||||
$ckeys[] = $this->cacheKey($this->tableName(), $pkeys, $pvals);
|
|
||||||
|
|
||||||
return $ckeys;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function multicache($cls, $kv)
|
function multicache($cls, $kv)
|
||||||
{
|
{
|
||||||
ksort($kv);
|
ksort($kv);
|
||||||
$c = self::memcache();
|
$c = Memcached_DataObject::memcache();
|
||||||
if (!$c) {
|
if (!$c) {
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
return $c->get(self::multicacheKey($cls, $kv));
|
$pkeys = implode(',', array_keys($kv));
|
||||||
|
$pvals = implode(',', array_values($kv));
|
||||||
|
return $c->get(Memcached_DataObject::cacheKey($cls, $pkeys, $pvals));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static function multicacheKey($cls, $kv)
|
|
||||||
{
|
|
||||||
ksort($kv);
|
|
||||||
$pkeys = implode(',', array_keys($kv));
|
|
||||||
$pvals = implode(',', array_values($kv));
|
|
||||||
return self::cacheKey($cls, $pkeys, $pvals);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getSearchEngine($table)
|
function getSearchEngine($table)
|
||||||
{
|
{
|
||||||
require_once INSTALLDIR.'/lib/search_engines.php';
|
require_once INSTALLDIR.'/lib/search_engines.php';
|
||||||
|
@ -334,8 +298,7 @@ class Memcached_DataObject extends DB_DataObject
|
||||||
$key_part = common_keyize($cls).':'.md5($qry);
|
$key_part = common_keyize($cls).':'.md5($qry);
|
||||||
$ckey = common_cache_key($key_part);
|
$ckey = common_cache_key($key_part);
|
||||||
$stored = $c->get($ckey);
|
$stored = $c->get($ckey);
|
||||||
|
if ($stored) {
|
||||||
if ($stored !== false) {
|
|
||||||
return new ArrayWrapper($stored);
|
return new ArrayWrapper($stored);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -140,12 +140,14 @@ class ApiAction extends Action
|
||||||
|
|
||||||
// Note: some profiles don't have an associated user
|
// Note: some profiles don't have an associated user
|
||||||
|
|
||||||
|
$defaultDesign = Design::siteDesign();
|
||||||
|
|
||||||
if (!empty($user)) {
|
if (!empty($user)) {
|
||||||
$design = $user->getDesign();
|
$design = $user->getDesign();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($design)) {
|
if (empty($design)) {
|
||||||
$design = Design::siteDesign();
|
$design = $defaultDesign;
|
||||||
}
|
}
|
||||||
|
|
||||||
$color = Design::toWebColor(empty($design->backgroundcolor) ? $defaultDesign->backgroundcolor : $design->backgroundcolor);
|
$color = Design::toWebColor(empty($design->backgroundcolor) ? $defaultDesign->backgroundcolor : $design->backgroundcolor);
|
||||||
|
|
|
@ -119,6 +119,11 @@ function common_language()
|
||||||
|
|
||||||
function common_munge_password($password, $id)
|
function common_munge_password($password, $id)
|
||||||
{
|
{
|
||||||
|
if (is_object($id) || is_object($password)) {
|
||||||
|
$e = new Exception();
|
||||||
|
common_log(LOG_ERR, __METHOD__ . ' object in param to common_munge_password ' .
|
||||||
|
str_replace("\n", " ", $e->getTraceAsString()));
|
||||||
|
}
|
||||||
return md5($password . $id);
|
return md5($password . $id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user