From 82086eea36e84a00942ca8f7c6655f9171d2f1ee Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 28 Jan 2017 06:18:16 +0000 Subject: [PATCH] Bugfix: When a value was only in the .htconfig.php then it never was stored --- include/Core/Config.php | 13 ++++++++++--- include/Core/PConfig.php | 27 ++++++++++++++++++++------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/include/Core/Config.php b/include/Core/Config.php index c495bbd4c7..4e5c1e3d04 100644 --- a/include/Core/Config.php +++ b/include/Core/Config.php @@ -23,6 +23,7 @@ use dbm; class Config { private static $cache; + private static $in_db; /** * @brief Loads all configuration values of family into a cached storage. @@ -53,6 +54,7 @@ class Config { } else { $a->config[$family][$k] = $rr['v']; self::$cache[$family][$k] = $rr['v']; + self::$in_db[$family][$k] = true; } } } @@ -106,16 +108,19 @@ class Config { // Assign the value from the database to the cache self::$cache[$family][$key] = $val; + self::$in_db[$family][$key] = true; return $val; } 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; } @@ -144,9 +149,9 @@ class Config { // The exception are array values. $dbvalue = (!is_array($value) ? (string)$value : $value); - $stored = self::get($family, $key); + $stored = self::get($family, $key, null, true); - if ($stored === $dbvalue) { + if (($stored === $dbvalue) AND self::$in_db[$family][$key]) { return true; } @@ -162,7 +167,7 @@ class Config { // manage array value $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), @@ -177,6 +182,7 @@ class Config { ); } if ($ret) { + self::$in_db[$family][$key] = true; return $value; } return $ret; @@ -198,6 +204,7 @@ class Config { 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), diff --git a/include/Core/PConfig.php b/include/Core/PConfig.php index 43735018e4..cdf22c083d 100644 --- a/include/Core/PConfig.php +++ b/include/Core/PConfig.php @@ -18,6 +18,8 @@ use dbm; */ class PConfig { + private static $in_db; + /** * @brief Loads all configuration values of a user's config family into a cached storage. * @@ -40,6 +42,7 @@ class PConfig { foreach ($r as $rr) { $k = $rr['k']; $a->config[$uid][$family][$k] = $rr['v']; + self::$in_db[$uid][$family][$k] = true; } } else if ($family != 'config') { // Negative caching @@ -95,12 +98,15 @@ class PConfig { if (count($ret)) { $val = (preg_match("|^a:[0-9]+:{.*}$|s", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']); $a->config[$uid][$family][$key] = $val; + self::$in_db[$uid][$family][$key] = true; return $val; } else { $a->config[$uid][$family][$key] = '!!'; + self::$in_db[$uid][$family][$key] = false; + + return $default_value; } - return $default_value; } /** @@ -125,18 +131,23 @@ class PConfig { $a = get_app(); - $stored = self::get($uid, $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); - if ($stored == $value) { + $stored = self::get($uid, $family, $key, null, true); + + if ($stored === $dbvalue AND self::$in_db[$uid][$family][$key]) { return true; } + $a->config[$uid][$family][$key] = $dbvalue; + // manage array value - $dbvalue = (is_array($value) ? serialize($value):$value); + $dbvalue = (is_array($value) ? serialize($value) : $dbvalue); - $a->config[$uid][$family][$key] = $value; - - if (is_null($stored)) { + if (is_null($stored) OR !self::$in_db[$uid][$family][$key]) { $ret = q("INSERT INTO `pconfig` (`uid`, `cat`, `k`, `v`) VALUES (%d, '%s', '%s', '%s') ON DUPLICATE KEY UPDATE `v` = '%s'", intval($uid), dbesc($family), @@ -154,6 +165,7 @@ class PConfig { } if ($ret) { + self::$in_db[$uid][$family][$key] = true; return $value; } return $ret; @@ -178,6 +190,7 @@ class PConfig { if (x($a->config[$uid][$family], $key)) { unset($a->config[$uid][$family][$key]); + unset(self::$in_db[$uid][$family][$key]); } $ret = q("DELETE FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s'",