X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FStatus_network.php;h=f8d6756b69090c4c51e7127ba2497e4b0e1a6444;hb=dff43c03e4cdd76419a430f0942e9eacf30e13b7;hp=bf05ad61e00150c9e79d32592fd3473e1672f2cc;hpb=1a5125137521a3c7f70c7e8a5000a1b81305cdfc;p=quix0rs-gnu-social.git diff --git a/classes/Status_network.php b/classes/Status_network.php index bf05ad61e0..f8d6756b69 100644 --- a/classes/Status_network.php +++ b/classes/Status_network.php @@ -1,8 +1,26 @@ . */ +if (!defined('LACONICA')) { exit(1); } + class Status_network extends DB_DataObject { ###START_AUTOCODE @@ -28,7 +46,10 @@ class Status_network extends DB_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - static function setupDB($dbhost, $dbuser, $dbpass, $dbname) + static $cache = null; + static $base = null; + + static function setupDB($dbhost, $dbuser, $dbpass, $dbname, $servers) { global $config; @@ -36,7 +57,60 @@ class Status_network extends DB_DataObject $config['db']['ini_'.$dbname] = INSTALLDIR.'/classes/statusnet.ini'; $config['db']['table_status_network'] = $dbname; - return true; + self::$cache = new Memcache(); + + if (is_array($servers)) { + foreach($servers as $server) { + self::$cache->addServer($server); + } + } else { + self::$cache->addServer($servers); + } + + self::$base = $dbname; + } + + static function cacheKey($k, $v) { + return 'laconica:' . self::$base . ':status_network:'.$k.':'.$v; + } + + static function memGet($k, $v) + { + $ck = self::cacheKey($k, $v); + + $sn = self::$cache->get($ck); + + if (empty($sn)) { + $sn = self::staticGet($k, $v); + if (!empty($sn)) { + self::$cache->set($ck, $sn); + } + } + + return $sn; + } + + function decache() + { + $keys = array('nickname', 'hostname', 'pathname'); + foreach ($keys as $k) { + $ck = self::cacheKey($k, $this->$k); + self::$cache->delete($ck); + } + } + + function update($orig=null) + { + if (is_object($orig)) { + $orig->decache(); # might be different keys + } + return parent::update($orig); + } + + function delete() + { + $this->decache(); # while we still have the values! + return parent::delete(); } static function setupSite($servername, $pathname, $wildcard) @@ -51,16 +125,19 @@ class Status_network extends DB_DataObject if (0 == strncasecmp(strrev($wildcard), strrev($servername), strlen($wildcard))) { // special case for exact match if (0 == strcasecmp($servername, $wildcard)) { - $sn = Status_network::staticGet('nickname', ''); + $sn = self::memGet('nickname', ''); } else { $parts = explode('.', $servername); - $sn = Status_network::staticGet('nickname', strtolower($parts[0])); + $sn = self::memGet('nickname', strtolower($parts[0])); } } else { - $sn = Status_network::staticGet('hostname', strtolower($servername)); + $sn = self::memGet('hostname', strtolower($servername)); } if (!empty($sn)) { + if (!empty($sn->hostname) && 0 != strcasecmp($sn->hostname, $servername)) { + $sn->redirectToHostname(); + } $dbhost = (empty($sn->dbhost)) ? 'localhost' : $sn->dbhost; $dbuser = (empty($sn->dbuser)) ? $sn->nickname : $sn->dbuser; $dbpass = $sn->dbpass; @@ -82,4 +159,32 @@ class Status_network extends DB_DataObject return null; } } + + // Code partially mooked from http://www.richler.de/en/php-redirect/ + // (C) 2006 by Heiko Richler http://www.richler.de/ + // LGPL + + function redirectToHostname() + { + $destination = 'http://'.$this->hostname; + $destination .= $_SERVER['REQUEST_URI']; + + $old = 'http'. + (($_SERVER['HTTPS'] == 'on') ? 'S' : ''). + '://'. + $_SERVER['HTTP_HOST']. + $_SERVER['REQUEST_URI']. + $_SERVER['QUERY_STRING']; + if ($old == $destination) { // this would be a loop! + // error_log(...) ? + return false; + } + + header('HTTP/1.1 301 Moved Permanently'); + header("Location: $destination"); + + print "$destination\n"; + + exit; + } }