X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2FCore%2FConfig.php;h=4e5c1e3d04ca02e87a8d19344daa3f2e897c59d4;hb=e66ad9d6bd8e67e2c04910611836311d4624c1a4;hp=7b7045a9ee3ed2f3fe00989d97db6cba13e9959f;hpb=cc16369b6f45eff2c0faa91bda96ae619f9f80e4;p=friendica.git diff --git a/include/Core/Config.php b/include/Core/Config.php index 7b7045a9ee..4e5c1e3d04 100644 --- a/include/Core/Config.php +++ b/include/Core/Config.php @@ -22,6 +22,9 @@ use dbm; */ class Config { + private static $cache; + private static $in_db; + /** * @brief Loads all configuration values of family into a cached storage. * @@ -32,10 +35,17 @@ class Config { * The category of the configuration value * @return void */ - public static function load($family) { + public static function load($family = "config") { + + // We don't preload "system" anymore. + // This reduces the number of database reads a lot. + if ($family === 'system') { + return; + } + $a = get_app(); - $r = q("SELECT `v`, `k` FROM `config` WHERE `cat` = '%s' ORDER BY `cat`, `k`, `id`", dbesc($family)); + $r = q("SELECT `v`, `k` FROM `config` WHERE `cat` = '%s'", dbesc($family)); if (dbm::is_result($r)) { foreach ($r as $rr) { $k = $rr['k']; @@ -43,11 +53,10 @@ class Config { $a->config[$k] = $rr['v']; } else { $a->config[$family][$k] = $rr['v']; + self::$cache[$family][$k] = $rr['v']; + self::$in_db[$family][$k] = true; } } - } else if ($family != 'config') { - // Negative caching - $a->config[$family] = "!!"; } } @@ -78,34 +87,41 @@ class Config { $a = get_app(); if (!$refresh) { - // Looking if the whole family isn't set - if (isset($a->config[$family])) { - if ($a->config[$family] === '!!') { - return $default_value; - } - } - if (isset($a->config[$family][$key])) { - if ($a->config[$family][$key] === '!!') { + // Do we have the cached value? Then return it + if (isset(self::$cache[$family][$key])) { + if (self::$cache[$family][$key] === '!!') { return $default_value; + } else { + return self::$cache[$family][$key]; } - return $a->config[$family][$key]; } } - $ret = q("SELECT `v` FROM `config` WHERE `cat` = '%s' AND `k` = '%s' ORDER BY `id` DESC LIMIT 1", + $ret = q("SELECT `v` FROM `config` WHERE `cat` = '%s' AND `k` = '%s'", dbesc($family), dbesc($key) ); - if (count($ret)) { + if (dbm::is_result($ret)) { // manage array value - $val = (preg_match("|^a:[0-9]+:{.*}$|s", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']); - $a->config[$family][$key] = $val; + $val = (preg_match("|^a:[0-9]+:{.*}$|s", $ret[0]['v']) ? unserialize($ret[0]['v']) : $ret[0]['v']); + // Assign the value from the database to the cache + self::$cache[$family][$key] = $val; + self::$in_db[$family][$key] = true; return $val; - } else { - $a->config[$family][$key] = '!!'; + } elseif (isset($a->config[$family][$key])) { + + // Assign the value (mostly) from the .htconfig.php to the cache + self::$cache[$family][$key] = $a->config[$family][$key]; + self::$in_db[$family][$key] = false; + + return $a->config[$family][$key]; } + + self::$cache[$family][$key] = '!!'; + self::$in_db[$family][$key] = false; + return $default_value; } @@ -128,19 +144,30 @@ class Config { public static function set($family, $key, $value) { $a = get_app(); - $stored = self::get($family, $key); + // We store our setting values in a string variable. + // So we have to do the conversion here so that the compare below works. + // The exception are array values. + $dbvalue = (!is_array($value) ? (string)$value : $value); + + $stored = self::get($family, $key, null, true); - if ($stored == $value) { + if (($stored === $dbvalue) AND self::$in_db[$family][$key]) { return true; } - $a->config[$family][$key] = $value; + if ($family === 'config') { + $a->config[$key] = $dbvalue; + } elseif ($family != 'system') { + $a->config[$family][$key] = $dbvalue; + } + + // Assign the just added value to the cache + self::$cache[$family][$key] = $dbvalue; // manage array value - $dbvalue = (is_array($value) ? serialize($value) : $value); - $dbvalue = (is_bool($dbvalue) ? intval($dbvalue) : $dbvalue); + $dbvalue = (is_array($value) ? serialize($value) : $dbvalue); - if (is_null($stored)) { + if (is_null($stored) OR !self::$in_db[$family][$key]) { $ret = q("INSERT INTO `config` (`cat`, `k`, `v`) VALUES ('%s', '%s', '%s') ON DUPLICATE KEY UPDATE `v` = '%s'", dbesc($family), dbesc($key), @@ -155,6 +182,7 @@ class Config { ); } if ($ret) { + self::$in_db[$family][$key] = true; return $value; } return $ret; @@ -174,9 +202,9 @@ class Config { */ public static function delete($family, $key) { - $a = get_app(); - if (x($a->config[$family],$key)) { - unset($a->config[$family][$key]); + if (isset(self::$cache[$family][$key])) { + unset(self::$cache[$family][$key]); + unset(self::$in_db[$family][$key]); } $ret = q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s'", dbesc($family), @@ -185,5 +213,4 @@ class Config { return $ret; } - }