From c61e9f391273e5f7f4b7aa91ee4174d47402cae9 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 23 Jan 2015 10:50:25 +0100 Subject: [PATCH] Add a method to set/unset multiple config values in one call 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 | 10 ++++ lib/private/config.php | 105 ++++++++++++++++++++++++---------- lib/private/legacy/config.php | 10 ++++ lib/private/systemconfig.php | 10 ++++ lib/public/iconfig.php | 8 +++ tests/lib/config.php | 30 ++++++++++ 6 files changed, 143 insertions(+), 30 deletions(-) diff --git a/lib/private/allconfig.php b/lib/private/allconfig.php index d4b4ed6fb6..421db56686 100644 --- a/lib/private/allconfig.php +++ b/lib/private/allconfig.php @@ -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 * diff --git a/lib/private/config.php b/lib/private/config.php index 8544de34b7..586e8c2058 100644 --- a/lib/private/config.php +++ b/lib/private/config.php @@ -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,38 +68,83 @@ 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; - - // Write changes - $this->writeData(); - } - - /** - * Removes a key from the config - * @param string $key key - * - * This function removes a key from the config.php. - * - */ - public function deleteKey($key) { - if (isset($this->cache[$key])) { - // Delete key from cache - unset($this->cache[$key]); + 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); + } + } + if ($needsUpdate) { // Write changes $this->writeData(); } } + /** + * Sets the value and writes it to config.php if required + * + * @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]); + return true; + } + return false; + } + /** * Loads the config file * diff --git a/lib/private/legacy/config.php b/lib/private/legacy/config.php index 7b71120425..64d01434b1 100644 --- a/lib/private/legacy/config.php +++ b/lib/private/legacy/config.php @@ -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 diff --git a/lib/private/systemconfig.php b/lib/private/systemconfig.php index ce6883e5ab..36cefdb849 100644 --- a/lib/private/systemconfig.php +++ b/lib/private/systemconfig.php @@ -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 * diff --git a/lib/public/iconfig.php b/lib/public/iconfig.php index a1952ef8f8..868a4133d2 100644 --- a/lib/public/iconfig.php +++ b/lib/public/iconfig.php @@ -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 * diff --git a/tests/lib/config.php b/tests/lib/config.php index 6adba356a1..91154579ab 100644 --- a/tests/lib/config.php +++ b/tests/lib/config.php @@ -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 = " '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;