]> git.mxchange.org Git - friendica.git/blobdiff - include/Core/Config.php
Documentation added
[friendica.git] / include / Core / Config.php
index a5eca0570a56efc86f1ecf26ed4dae91f71e07df..4e5c1e3d04ca02e87a8d19344daa3f2e897c59d4 100644 (file)
@@ -1,5 +1,8 @@
 <?php
 namespace Friendica\Core;
+
+use dbm;
+
 /**
  * @file include/Core/Config.php
  *
@@ -19,6 +22,9 @@ namespace Friendica\Core;
  */
 class Config {
 
+       private static $cache;
+       private static $in_db;
+
        /**
         * @brief Loads all configuration values of family into a cached storage.
         *
@@ -29,22 +35,28 @@ class Config {
         *  The category of the configuration value
         * @return void
         */
-       public static function load($family) {
-               global $a;
+       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;
+               }
 
-               $r = q("SELECT `v`, `k` FROM `config` WHERE `cat` = '%s' ORDER BY `cat`, `k`, `id`", dbesc($family));
-               if (count($r)) {
+               $a = get_app();
+
+               $r = q("SELECT `v`, `k` FROM `config` WHERE `cat` = '%s'", dbesc($family));
+               if (dbm::is_result($r)) {
                        foreach ($r as $rr) {
                                $k = $rr['k'];
                                if ($family === '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] = "!<unset>!";
                }
        }
 
@@ -72,37 +84,44 @@ class Config {
         */
        public static function get($family, $key, $default_value = null, $refresh = false) {
 
-               global $a;
+               $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;
+                       $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] = '!<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];
+                       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;
        }
 
@@ -123,21 +142,32 @@ class Config {
         * @return mixed Stored $value or false if the database update failed
         */
        public static function set($family, $key, $value) {
-               global $a;
+               $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;
                }
 
-               $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),
@@ -152,6 +182,7 @@ class Config {
                        );
                }
                if ($ret) {
+                       self::$in_db[$family][$key] = true;
                        return $value;
                }
                return $ret;
@@ -171,9 +202,9 @@ class Config {
         */
        public static function delete($family, $key) {
 
-               global $a;
-               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),
@@ -182,5 +213,4 @@ class Config {
 
                return $ret;
        }
-
 }