]> git.mxchange.org Git - friendica.git/commitdiff
Merge pull request #3121 from annando/1701-bugfix-config
authorTobias Diekershoff <tobias.diekershoff@gmx.net>
Sat, 28 Jan 2017 07:30:22 +0000 (08:30 +0100)
committerGitHub <noreply@github.com>
Sat, 28 Jan 2017 07:30:22 +0000 (08:30 +0100)
Issue 3117: Can't store values that are only in the .htconfig.php

include/Core/Config.php
include/Core/PConfig.php

index c495bbd4c7f641bd1ed4f1b8b08c1bb82726c2b2..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.
@@ -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] = '!<unset>!';
+               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),
index 43735018e4ce143b2826ed61d61987d21cd9303e..6ced9fc7553fc6fa1198848c123db0405490f5c9 100644 (file)
@@ -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] = '!<unset>!';
+                       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);
+
+               $stored = self::get($uid, $family, $key, null, true);
 
-               if ($stored == $value) {
+               if (($stored === $dbvalue) AND self::$in_db[$uid][$family][$key]) {
                        return true;
                }
 
-               // manage array value
-               $dbvalue = (is_array($value) ? serialize($value):$value);
+               $a->config[$uid][$family][$key] = $dbvalue;
 
-               $a->config[$uid][$family][$key] = $value;
+               // manage array value
+               $dbvalue = (is_array($value) ? serialize($value) : $dbvalue);
 
-                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'",