X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FStatus_network.php;h=4a1f2c37475a4ef4a91ff26d7fd8260669387688;hb=2f86cd860231f92213950d439e9a109b7a5f11c4;hp=445f8a5a3c5759e0c5a4b00ca1861ce85a9af5e3;hpb=b6aa1511eb868d740f8893160ce8bef387725867;p=quix0rs-gnu-social.git diff --git a/classes/Status_network.php b/classes/Status_network.php index 445f8a5a3c..3498b4bd24 100644 --- a/classes/Status_network.php +++ b/classes/Status_network.php @@ -21,32 +21,45 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } -class Status_network extends DB_DataObject +class Status_network extends Safe_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ public $__table = 'status_network'; // table name - public $nickname; // varchar(64) primary_key not_null - public $hostname; // varchar(255) unique_key - public $pathname; // varchar(255) unique_key - public $dbhost; // varchar(255) - public $dbuser; // varchar(255) - public $dbpass; // varchar(255) - public $dbname; // varchar(255) - public $sitename; // varchar(255) - public $theme; // varchar(255) - public $logo; // varchar(255) + public $site_id; // int(4) primary_key not_null + public $nickname; // varchar(64) unique_key not_null + public $hostname; // varchar(191) unique_key not 255 because utf8mb4 takes more space + public $pathname; // varchar(191) unique_key not 255 because utf8mb4 takes more space + public $dbhost; // varchar(191) not 255 because utf8mb4 takes more space + public $dbuser; // varchar(191) not 255 because utf8mb4 takes more space + public $dbpass; // varchar(191) not 255 because utf8mb4 takes more space + public $dbname; // varchar(191) not 255 because utf8mb4 takes more space + public $sitename; // varchar(191) not 255 because utf8mb4 takes more space + public $theme; // varchar(191) not 255 because utf8mb4 takes more space + public $logo; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP /* Static get */ - function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('Status_network',$k,$v); } + static function getKV($k,$v=NULL) { + // TODO: This must probably be turned into a non-static call + $i = DB_DataObject::staticGet('Status_network',$k,$v); + + // Don't use local process cache; if we're fetching multiple + // times it's because we're reloading it in a long-running + // process; we need a fresh copy! + global $_DB_DATAOBJECT; + unset($_DB_DATAOBJECT['CACHE']['status_network']); + return $i; + } /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE - static $cache = null; + // XXX: made public so Status_network_tag can eff with it + public static $cache = null; + public static $cacheInitialized = false; static $base = null; static $wildcard = null; @@ -57,42 +70,56 @@ class Status_network extends DB_DataObject * @param string $dbname * @param array $servers memcached servers to use for caching config info */ - static function setupDB($dbhost, $dbuser, $dbpass, $dbname, $servers) + static function setupDB($dbhost, $dbuser, $dbpass, $dbname, array $servers) { global $config; $config['db']['database_'.$dbname] = "mysqli://$dbuser:$dbpass@$dbhost/$dbname"; $config['db']['ini_'.$dbname] = INSTALLDIR.'/classes/status_network.ini'; - $config['db']['table_status_network'] = $dbname; + + foreach (array('status_network', 'status_network_tag', 'unavailable_status_network') as $table) { + $config['db']['table_'.$table] = $dbname; + } if (class_exists('Memcache')) { self::$cache = new Memcache(); - // Can't close persistent connections, making forking painful. + // If we're a parent command-line process we need + // to be able to close out the connection after + // forking, so disable persistence. // - // @fixme only do this in *parent* CLI processes. - // single-process and child-processes *should* use persistent. - $persist = php_sapi_name() != 'cli'; - if (is_array($servers)) { - foreach($servers as $server) { - self::$cache->addServer($server, 11211, $persist); + // We'll turn it back on again the second time + // through which will either be in a child process, + // or a single-process script which is switching + // configurations. + $persist = php_sapi_name() != 'cli' || self::$cacheInitialized; + if (!is_array($servers)) { + $servers = array($servers); + } + foreach($servers as $server) { + $parts = explode(':', $server); + $server = $parts[0]; + if (count($parts) > 1) { + $port = $parts[1]; + } else { + $port = 11211; } - } else { - self::$cache->addServer($servers, 11211, $persist); + self::$cache->addServer($server, $port, $persist); } + self::$cacheInitialized = true; } self::$base = $dbname; } static function cacheKey($k, $v) { - return 'statusnet:' . self::$base . ':status_network:'.$k.':'.$v; + return 'gnusocial:' . self::$base . ':status_network:'.$k.':'.$v; } static function memGet($k, $v) { if (!self::$cache) { - return self::staticGet($k, $v); + return self::getKV($k, $v); } $ck = self::cacheKey($k, $v); @@ -100,7 +127,7 @@ class Status_network extends DB_DataObject $sn = self::$cache->get($ck); if (empty($sn)) { - $sn = self::staticGet($k, $v); + $sn = self::getKV($k, $v); if (!empty($sn)) { self::$cache->set($ck, clone($sn)); } @@ -120,34 +147,56 @@ class Status_network extends DB_DataObject } } - function update($orig=null) + function update($dataObject=false) { - if (is_object($orig)) { - $orig->decache(); # might be different keys + if (is_object($dataObject)) { + $dataObject->decache(); # might be different keys } - return parent::update($orig); + return parent::update($dataObject); } - function delete() + /** + * DB_DataObject doesn't allow updating keys (even non-primary) + */ + function updateKeys(&$orig) + { + $this->_connect(); + foreach (array('hostname', 'pathname') as $k) { + if (strcmp($this->$k, $orig->$k) != 0) { + $parts[] = $k . ' = ' . $this->_quote($this->$k); + } + } + if (count($parts) == 0) { + // No changes + return true; + } + + $toupdate = implode(', ', $parts); + + $table = common_database_tablename($this->tableName()); + $qry = 'UPDATE ' . $table . ' SET ' . $toupdate . + ' WHERE nickname = ' . $this->_quote($this->nickname); + $orig->decache(); + $result = $this->query($qry); + $this->decache(); + + return $result; + } + + function delete($useWhere=false) { $this->decache(); # while we still have the values! - return parent::delete(); + return parent::delete($useWhere); } /** * @param string $servername hostname - * @param string $pathname URL base path * @param string $wildcard hostname suffix to match wildcard config + * @return mixed Status_network or null */ - static function setupSite($servername, $pathname, $wildcard) + static function getFromHostname($servername, $wildcard) { - global $config; - $sn = null; - - // XXX I18N, probably not crucial for hostnames - // XXX This probably needs a tune up - if (0 == strncasecmp(strrev($wildcard), strrev($servername), strlen($wildcard))) { // special case for exact match if (0 == strcasecmp($servername, $wildcard)) { @@ -166,6 +215,23 @@ class Status_network extends DB_DataObject } } } + return $sn; + } + + /** + * @param string $servername hostname + * @param string $pathname URL base path + * @param string $wildcard hostname suffix to match wildcard config + */ + static function setupSite($servername, $pathname, $wildcard) + { + global $config; + + $sn = null; + + // XXX I18N, probably not crucial for hostnames + // XXX This probably needs a tune up + $sn = self::getFromHostname($servername, $wildcard); if (!empty($sn)) { @@ -245,4 +311,63 @@ class Status_network extends DB_DataObject return $this->nickname . '.' . self::$wildcard; } } + + /** + * Return site meta-info tags as an array + * @return array of strings + */ + function getTags() + { + return Status_network_tag::getTags($this->site_id); + } + + /** + * Save a given set of tags + * @param array tags + * @fixme only add/remove differentials + */ + function setTags(array $tags) + { + $this->clearTags(); + foreach ($tags as $tag) { + if (!empty($tag)) { + $snt = new Status_network_tag(); + $snt->site_id = $this->site_id; + $snt->tag = $tag; + $snt->created = common_sql_now(); + + $id = $snt->insert(); + if (!$id) { + // TRANS: Exception thrown when a tag cannot be saved. + throw new Exception(_("Unable to save tag.")); + } + } + } + + return true; + } + + function clearTags() + { + $tag = new Status_network_tag(); + $tag->site_id = $this->site_id; + + if ($tag->find()) { + while($tag->fetch()) { + $tag->delete(); + } + } + + $tag->free(); + } + + /** + * Check if this site record has a particular meta-info tag attached. + * @param string $tag + * @return bool + */ + function hasTag($tag) + { + return in_array($tag, $this->getTags()); + } }