From faf8806472e8521703af523e097064a607d1b48f Mon Sep 17 00:00:00 2001 From: Ben Roberts Date: Sun, 28 Aug 2011 13:01:56 +0100 Subject: [PATCH] Add write support to Config backends with add/set methods --- source/lib/SihnonFramework/Config.class.php | 80 +++++++++++++++++-- .../Config/IUpdateable.class.php | 26 ++++++ .../Config/Plugin/Database.class.php | 17 +++- .../lib/SihnonFramework/Exceptions.class.php | 3 + 4 files changed, 119 insertions(+), 7 deletions(-) create mode 100644 source/lib/SihnonFramework/Config/IUpdateable.class.php diff --git a/source/lib/SihnonFramework/Config.class.php b/source/lib/SihnonFramework/Config.class.php index 9506017..1c5b71a 100644 --- a/source/lib/SihnonFramework/Config.class.php +++ b/source/lib/SihnonFramework/Config.class.php @@ -55,6 +55,28 @@ class SihnonFramework_Config { $this->backend = Sihnon_Config_PluginFactory::create($backend, $options); $this->settings = $this->backend->preload(); } + + protected static function pack($type, $value) { + switch ($type) { + case static::TYPE_STRING_LIST: { + return join("\n", $value); + } break; + + default: { + return $value; + } + } + } + + protected static function unpack($type, $value) { + switch ($type) { + case self::TYPE_STRING_LIST: + return array_map('trim', explode("\n", $value)); + + default: + return $value; + } + } /** * Identifies whether the named setting exists @@ -76,13 +98,59 @@ class SihnonFramework_Config { throw new Sihnon_Exception_UnknownSetting($key); } - switch ($this->settings[$key]['type']) { - case self::TYPE_STRING_LIST: - return array_map('trim', explode("\n", $this->settings[$key]['value'])); - - default: - return $this->settings[$key]['value']; + return static::unpack($this->settings[$key]['type'], $this->settings[$key]['value']); + } + + public function type($key) { + if (!isset($this->settings[$key])) { + throw new Sihnon_Exception_UnknownSetting($key); } + + return $this->settings[$key]['type']; + } + + public function enumerateAll() { + return array_map(function($r) {return $r['name'];}, $this->settings); + } + + public function set($key, $value) { + if ( ! ($this->backend instanceof Sihnon_Config_IUpdateable)) { + throw new Sihnon_Exception_ReadOnlyConfigBackend(); + } + if (!isset($this->settings[$key])) { + throw new Sihnon_Exception_UnknownSetting($key); + } + + $packed_value = static::pack($this->settings[$key]['type'], $value); + + // Change the setting value for this run + $this->settings[$key]['value'] = $packed_value; + + // Persist the change into the backend + return $this->backend->set($key, $packed_value); + } + + public function add($key, $type, $value) { + if ( ! ($this->backend instanceof Sihnon_Config_IUpdateable)) { + throw new Sihnon_Exception_ReadOnlyConfigBackend(); + } + if (isset($this->settings[$key])) { + throw new Sihnon_Exception_SettingExists($key); + } + if ( ! Sihnon_Main::isClassConstantValue(get_called_class(), 'TYPE_', $type)) { + throw new Sihnon_Exception_UnknownSettingType($type); + } + + $packed_value = static::pack($type, $value); + + // Add the setting for this run + $this->settings[$key] = array( + 'type' => $type, + 'value' => $packed_value, + ); + + // Persist the setting into the backend + return $this->backend->add($key, $type, $packed_value); } }; diff --git a/source/lib/SihnonFramework/Config/IUpdateable.class.php b/source/lib/SihnonFramework/Config/IUpdateable.class.php new file mode 100644 index 0000000..1aa5237 --- /dev/null +++ b/source/lib/SihnonFramework/Config/IUpdateable.class.php @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/source/lib/SihnonFramework/Config/Plugin/Database.class.php b/source/lib/SihnonFramework/Config/Plugin/Database.class.php index 6d7b660..a5dd2de 100644 --- a/source/lib/SihnonFramework/Config/Plugin/Database.class.php +++ b/source/lib/SihnonFramework/Config/Plugin/Database.class.php @@ -1,6 +1,6 @@ database->update("UPDATE `{$this->table}` SET `value`=:value WHERE `name`=:name", array( + array('name' => 'name', 'value' => $key, 'type' => PDO::PARAM_STR), + array('name' => 'value', 'value' => $value, 'type' => PDO::PARAM_STR), + )); + } + + public function add($key, $type, $value) { + return $this->database->insert("INSERT INTO `{$this->table}` (`name`,`value`,`type`) VALUES(:name,:value,:type)", array( + array('name' => 'name', 'value' => $key, 'type' => PDO::PARAM_STR), + array('name' => 'value', 'value' => $value, 'type' => PDO::PARAM_STR), + array('name' => 'type', 'value' => $type, 'type' => PDO::PARAM_STR), + )); + } + } ?> \ No newline at end of file diff --git a/source/lib/SihnonFramework/Exceptions.class.php b/source/lib/SihnonFramework/Exceptions.class.php index 947d05c..0ce68c0 100644 --- a/source/lib/SihnonFramework/Exceptions.class.php +++ b/source/lib/SihnonFramework/Exceptions.class.php @@ -24,6 +24,9 @@ class SihnonFramework_Exception_ResultCountMismatch extends SihnonFramework_E class SihnonFramework_Exception_ConfigException extends SihnonFramework_Exception {}; class SihnonFramework_Exception_UnknownSetting extends SihnonFramework_Exception_ConfigException {}; +class SihnonFramework_Exception_ReadOnlyConfigBackend extends SihnonFramework_Exception_ConfigException {}; +class SihnonFramework_Exception_SettingExists extends SihnonFramework_Exception_ConfigException {}; +class SihnonFramework_Exception_UnknownSettingType extends SihnonFramework_Exception_ConfigException {}; class SihnonFramework_Exception_CacheException extends SihnonFramework_Exception {}; class SihnonFramework_Exception_InvalidCacheDir extends SihnonFramework_Exception_CacheException {};