]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add a method to set/unset multiple config values in one call
authorJoas Schilling <nickvergessen@gmx.de>
Fri, 23 Jan 2015 09:50:25 +0000 (10:50 +0100)
committerJoas Schilling <nickvergessen@gmx.de>
Fri, 23 Jan 2015 10:00:53 +0000 (11:00 +0100)
This reduces the number of file writes we do for config.php and therefor
hopefully helps lowering the chances for empty config.php files

lib/private/allconfig.php
lib/private/config.php
lib/private/legacy/config.php
lib/private/systemconfig.php
lib/public/iconfig.php
tests/lib/config.php

index d4b4ed6fb6ae3b096d50786bd951ca8155d9f2b6..421db5668668d14dc0401d79f59363b830659aef 100644 (file)
@@ -69,6 +69,16 @@ class AllConfig implements \OCP\IConfig {
                }
        }
 
+       /**
+        * Sets and deletes system wide values
+        *
+        * @param array $configs Associative array with `key => value` pairs
+        *                       If value is null, the config key will be deleted
+        */
+       public function setSystemValues(array $configs) {
+               $this->systemConfig->setValues($configs);
+       }
+
        /**
         * Sets a new system wide value
         *
index 8544de34b720b904cd0ad1b165361ad1cd41ff62..586e8c20587d86679a6741bb1824533d6bb20353 100644 (file)
@@ -41,10 +41,10 @@ class Config {
 
        /**
         * Lists all available config keys
-        * @return array an array of key names
         *
-        * This function returns all keys saved in config.php. Please note that it
-        * does not return the values.
+        * Please note that it does not return the values.
+        *
+        * @return array an array of key names
         */
        public function getKeys() {
                return array_keys($this->cache);
@@ -52,12 +52,12 @@ class Config {
 
        /**
         * Gets a value from config.php
+        *
+        * If it does not exist, $default will be returned.
+        *
         * @param string $key key
         * @param mixed $default = null default value
         * @return mixed the value or $default
-        *
-        * This function gets the value from config.php. If it does not exist,
-        * $default will be returned.
         */
        public function getValue($key, $default = null) {
                if (isset($this->cache[$key])) {
@@ -68,36 +68,81 @@ class Config {
        }
 
        /**
-        * Sets a value
-        * @param string $key key
-        * @param mixed $value value
-        *
-        * This function sets the value and writes the config.php.
+        * Sets and deletes values and writes the config.php
         *
+        * @param array $configs Associative array with `key => value` pairs
+        *                       If value is null, the config key will be deleted
         */
-       public function setValue($key, $value) {
-               // Add change
-               $this->cache[$key] = $value;
+       public function setValues(array $configs) {
+               $needsUpdate = false;
+               foreach ($configs as $key => $value) {
+                       if ($value !== null) {
+                               $needsUpdate |= $this->set($key, $value);
+                       } else {
+                               $needsUpdate |= $this->delete($key);
+                       }
+               }
 
-               // Write changes
-               $this->writeData();
+               if ($needsUpdate) {
+                       // Write changes
+                       $this->writeData();
+               }
        }
 
        /**
-        * Removes a key from the config
-        * @param string $key key
+        * Sets the value and writes it to config.php if required
         *
-        * This function removes a key from the config.php.
+        * @param string $key key
+        * @param mixed $value value
+        */
+       public function setValue($key, $value) {
+               if ($this->set($key, $value)) {
+                       // Write changes
+                       $this->writeData();
+               }
+       }
+
+       /**
+        * This function sets the value
         *
+        * @param string $key key
+        * @param mixed $value value
+        * @return bool True if the file needs to be updated, false otherwise
+        */
+       protected function set($key, $value) {
+               if (!isset($this->cache[$key]) || $this->cache[$key] !== $value) {
+                       // Add change
+                       $this->cache[$key] = $value;
+                       return true;
+               }
+
+               return false;
+       }
+
+       /**
+        * Removes a key from the config and removes it from config.php if required
+        * @param string $key
         */
        public function deleteKey($key) {
+               if ($this->delete($key)) {
+                       // Write changes
+                       $this->writeData();
+               }
+       }
+
+       /**
+        * This function removes a key from the config
+        *
+        * @param string $key
+        * @return bool True if the file needs to be updated, false otherwise
+        */
+       protected function delete($key) {
                if (isset($this->cache[$key])) {
                        // Delete key from cache
                        unset($this->cache[$key]);
-
-                       // Write changes
-                       $this->writeData();
+                       return true;
                }
+               return false;
        }
 
        /**
index 7b7112042563539610ea0bcb1a5c0e9a118feaf6..64d01434b1158aaa187321dd89cde24b225e0840 100644 (file)
@@ -58,6 +58,16 @@ class OC_Config {
                self::$object->setValue($key, $value);
        }
 
+       /**
+        * Sets and deletes values and writes the config.php
+        *
+        * @param array $configs Associative array with `key => value` pairs
+        *                       If value is null, the config key will be deleted
+        */
+       public static function setValues(array $configs) {
+               self::$object->setValues($configs);
+       }
+
        /**
         * Removes a key from the config
         * @param string $key key
index ce6883e5ab3e824e8c167e4a99f1a862148163f6..36cefdb849937e46f52c9c17daecbba8d5635a77 100644 (file)
@@ -27,6 +27,16 @@ class SystemConfig {
                \OC_Config::setValue($key, $value);
        }
 
+       /**
+        * Sets and deletes values and writes the config.php
+        *
+        * @param array $configs Associative array with `key => value` pairs
+        *                       If value is null, the config key will be deleted
+        */
+       public function setValues(array $configs) {
+               \OC_Config::setValues($configs);
+       }
+
        /**
         * Looks up a system wide defined value
         *
index a1952ef8f84eb497d7760f49f753efc0a2986186..868a4133d2e39de76392c6732dca8c2341605c80 100644 (file)
@@ -34,6 +34,14 @@ namespace OCP;
  * Access to all the configuration options ownCloud offers
  */
 interface IConfig {
+       /**
+        * Sets and deletes system wide values
+        *
+        * @param array $configs Associative array with `key => value` pairs
+        *                       If value is null, the config key will be deleted
+        */
+       public function setSystemValues(array $configs);
+
        /**
         * Sets a new system wide value
         *
index 6adba356a1c7cf12864f9061e6ded0fb5dfd1577..91154579ab59f7bf15dd475b3a934219d27eda49 100644 (file)
@@ -71,6 +71,36 @@ class Test_Config extends \Test\TestCase {
                $this->assertEquals($expected, $content);
        }
 
+       public function testSetValues() {
+               $content = file_get_contents($this->configFile);
+               $this->assertEquals(self::TESTCONTENT, $content);
+
+               // Changing configs to existing values and deleting non-existing once
+               // should not rewrite the config.php
+               $this->config->setValues([
+                       'foo'                   => 'bar',
+                       'not_exists'    => null,
+               ]);
+
+               $this->assertAttributeEquals($this->initialConfig, 'cache', $this->config);
+               $content = file_get_contents($this->configFile);
+               $this->assertEquals(self::TESTCONTENT, $content);
+
+               $this->config->setValues([
+                       'foo'                   => 'moo',
+                       'alcohol_free'  => null,
+               ]);
+               $expectedConfig = $this->initialConfig;
+               $expectedConfig['foo'] = 'moo';
+               unset($expectedConfig['alcohol_free']);
+               $this->assertAttributeEquals($expectedConfig, 'cache', $this->config);
+
+               $content = file_get_contents($this->configFile);
+               $expected = "<?php\n\$CONFIG = array (\n  'foo' => 'moo',\n  'beers' => \n  array (\n    0 => 'Appenzeller',\n  " .
+                       "  1 => 'Guinness',\n    2 => 'Kölsch',\n  ),\n);\n";
+               $this->assertEquals($expected, $content);
+       }
+
        public function testDeleteKey() {
                $this->config->deleteKey('foo');
                $expectedConfig = $this->initialConfig;