]> git.mxchange.org Git - friendica.git/blobdiff - include/Core/Config.php
Merge remote-tracking branch 'upstream/develop' into 1702-null-date
[friendica.git] / include / Core / Config.php
index 574ff5b8a53c54fa00fd5b3f7bce3c5db0b965b8..4e5c1e3d04ca02e87a8d19344daa3f2e897c59d4 100644 (file)
@@ -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.
@@ -38,7 +39,7 @@ class Config {
 
                // We don't preload "system" anymore.
                // This reduces the number of database reads a lot.
-               if ($family == 'system') {
+               if ($family === 'system') {
                        return;
                }
 
@@ -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;
                                }
                        }
                }
@@ -88,7 +90,7 @@ class Config {
 
                        // Do we have the cached value? Then return it
                        if (isset(self::$cache[$family][$key])) {
-                               if (self::$cache[$family][$key] == '!<unset>!') {
+                               if (self::$cache[$family][$key] === '!<unset>!') {
                                        return $default_value;
                                } else {
                                        return self::$cache[$family][$key];
@@ -102,20 +104,23 @@ class Config {
                );
                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']);
+                       $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;
                } 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] = '!<unset>!';
+               self::$in_db[$family][$key] = false;
 
                return $default_value;
        }
@@ -139,26 +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);
 
-               if ($stored == $value) {
+               $stored = self::get($family, $key, null, true);
+
+               if (($stored === $dbvalue) AND self::$in_db[$family][$key]) {
                        return true;
                }
 
                if ($family === 'config') {
-                       $a->config[$key] = $value;
+                       $a->config[$key] = $dbvalue;
                } elseif ($family != 'system') {
-                       $a->config[$family][$key] = $value;
+                       $a->config[$family][$key] = $dbvalue;
                }
 
                // Assign the just added value to the cache
-               self::$cache[$family][$key] = $value;
+               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),
@@ -173,6 +182,7 @@ class Config {
                        );
                }
                if ($ret) {
+                       self::$in_db[$family][$key] = true;
                        return $value;
                }
                return $ret;
@@ -194,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),