The config class now makes less database reads.

This commit is contained in:
Michael 2017-01-18 21:45:32 +00:00
parent 045e94ccf3
commit 0548099f6c
29 changed files with 153 additions and 107 deletions

View file

@ -22,6 +22,8 @@ use dbm;
*/
class Config {
private static $cache;
/**
* @brief Loads all configuration values of family into a cached storage.
*
@ -32,10 +34,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 +52,9 @@ class Config {
$a->config[$k] = $rr['v'];
} else {
$a->config[$family][$k] = $rr['v'];
self::$cache[$family][$k] = $rr['v'];
}
}
} else if ($family != 'config') {
// Negative caching
$a->config[$family] = "!<unset>!";
}
}
@ -78,34 +85,38 @@ class Config {
$a = get_app();
if (!$refresh) {
// Looking if the whole family isn't set
if (isset($a->config[$family])) {
if ($a->config[$family] === '!<unset>!') {
return $default_value;
}
}
if (isset($a->config[$family][$key])) {
if ($a->config[$family][$key] === '!<unset>!') {
// Do we have the cached value? Then return it
if (isset(self::$cache[$family][$key])) {
if (self::$cache[$family][$key] == '!<unset>!') {
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;
// Assign the value from the database to the cache
self::$cache[$family][$key] = $val;
return $val;
} else {
$a->config[$family][$key] = '!<unset>!';
} 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];
return $a->config[$family][$key];
}
self::$cache[$family][$key] = '!<unset>!';
return $default_value;
}
@ -134,7 +145,14 @@ class Config {
return true;
}
$a->config[$family][$key] = $value;
if ($family === 'config') {
$a->config[$key] = $value;
} elseif ($family != 'system') {
$a->config[$family][$key] = $value;
}
// Assign the just added value to the cache
self::$cache[$family][$key] = $value;
// manage array value
$dbvalue = (is_array($value) ? serialize($value) : $value);
@ -174,9 +192,8 @@ 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]);
}
$ret = q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s'",
dbesc($family),
@ -185,5 +202,4 @@ class Config {
return $ret;
}
}