aboutsummaryrefslogtreecommitdiff
path: root/ratatoeskr
diff options
context:
space:
mode:
authorKevin Chabowski <kevin@kch42.de>2011-12-27 00:05:49 +0100
committerKevin Chabowski <kevin@kch42.de>2011-12-27 00:05:49 +0100
commitcb172742c78517baf6a79b52f980b0b9dcb81274 (patch)
treed06f730060fa71645ee6f2fdec5ae4dcde1fae94 /ratatoeskr
parent722a900eaaeb6204ef180e7095fc0a30a48b4d4a (diff)
downloadratatoeskr-cms-cb172742c78517baf6a79b52f980b0b9dcb81274.tar.gz
ratatoeskr-cms-cb172742c78517baf6a79b52f980b0b9dcb81274.tar.bz2
ratatoeskr-cms-cb172742c78517baf6a79b52f980b0b9dcb81274.zip
Rewritten Settings class and added atexit() to plugin API.
Settings now does not load/save values automatically any more (to save SQL queries). Settings will be loaded at startup and saved at the end. There is also only one instance possible now (singleton).
Diffstat (limited to 'ratatoeskr')
-rw-r--r--ratatoeskr/main.php5
-rw-r--r--ratatoeskr/sys/models.php154
-rw-r--r--ratatoeskr/sys/plugin_api.php14
3 files changed, 98 insertions, 75 deletions
diff --git a/ratatoeskr/main.php b/ratatoeskr/main.php
index 9d963ac..aa36201 100644
--- a/ratatoeskr/main.php
+++ b/ratatoeskr/main.php
@@ -71,6 +71,11 @@ function ratatoeskr()
$ste->vars["rel_path_to_root"] = $rel_path_to_root;
url_process($urlpath, $url_handlers, $data);
+
+ foreach($plugin_objs as $plugin_obj)
+ $plugin_obj->atexit();
+ $ratatoeskr_settings->save();
+
echo "<!--
Queries: $queries_fired
Time: " . (microtime(True) - $ts_start) . "
diff --git a/ratatoeskr/sys/models.php b/ratatoeskr/sys/models.php
index d3789b8..c4e0991 100644
--- a/ratatoeskr/sys/models.php
+++ b/ratatoeskr/sys/models.php
@@ -638,106 +638,122 @@ class Multilingual implements Countable, ArrayAccess, IteratorAggregate
public function getIterator() { return new ArrayIterator($this->translations); }
}
-/*
- * Buffer for settings keys.
- * NEVER(!) MODIFY DIRECTLY!
- */
-$global_settings_keys_buffer = NULL;
-
-/* DO NOT CONSTRUCT THIS YOURSELF! */
class SettingsIterator implements Iterator
{
- private $iter_keys_buffer;
+ private $index;
+ private $keys;
private $settings_obj;
- private $position = 0;
- public function __construct($settings_obj)
+ public function __construct($settings_obj, $keys)
{
- global $global_settings_keys_buffer;
+ $this->index = 0;
$this->settings_obj = $settings_obj;
- $this->iter_keys_buffer = array_slice($global_settings_keys_buffer, 0); /* a.k.a. copying */
+ $this->keys = $keys;
}
- function rewind() { return $this->position = 0; }
- function current() { return $this->settings_obj->offsetGet($this->iter_keys_buffer[$this->position]); }
- function key() { return $this->iter_keys_buffer[$this->position]; }
- function next() { ++$this->position; }
- function valid() { return isset($this->iter_keys_buffer[$this->position]); }
+ /* Iterator implementation */
+ public function current() { return $this->settings_obj[$this->keys[$this->index]]; }
+ public function key() { return $this->keys[$this->index]; }
+ public function next() { ++$this->index; }
+ public function rewind() { $this->index = 0; }
+ public function valid() { return $this->index < count($this->keys); }
}
/*
* Class: Settings
- * Representing the settings.
- * You can access them like an array.
+ * A class that holds the Settings of Ratatöskr.
+ * You can access settings like an array.
*/
-class Settings implements Countable, ArrayAccess, IteratorAggregate
+class Settings implements ArrayAccess, IteratorAggregate, Countable
{
- private $rw;
-
+ /* Singleton implementation */
+ private function __copy() {}
+ private static $instance = NULL;
/*
- * Constructor: __construct
- * Creates a new Settings object.
- *
- * Parameters:
- * $mode - "rw" for read-write access, "r" for read-only access (default)
+ * Constructor: get_instance
+ * Get an instance of this class.
+ * All instances are equal (ie. this is a singleton), so you can also use
+ * the global <$ratatoeskr_settings> instance.
*/
- public function __construct($mode="r")
+ public static function get_instance()
{
- global $global_settings_keys_buffer;
- if($global_settings_keys_buffer === NULL)
- {
- $global_settings_keys_buffer = array();
- $result = qdb("SELECT `key` FROM `PREFIX_settings_kvstorage` WHERE 1");
- while($sqlrow = mysql_fetch_assoc($result))
- $global_settings_keys_buffer[] = $sqlrow["key"];
- }
- $this->rw = ($mode == "rw");
+ if(self::$instance === NULL)
+ self::$instance = new self;
+ return self::$instance;
}
- /* Countable interface implementation */
- public function count() { global $global_settings_keys_buffer; return count($global_settings_keys_buffer); }
+ private $buffer;
+ private $to_be_deleted;
+ private $to_be_created;
+ private $to_be_updated;
- /* ArrayAccess interface implementation */
- public function offsetExists($offset) { global $global_settings_keys_buffer; return in_array($offset, $global_settings_keys_buffer); }
+ private function __construct()
+ {
+ $this->buffer = array();
+ $result = qdb("SELECT `key`, `value` FROM `PREFIX_settings_kvstorage` WHERE 1");
+ while($sqlrow = mysql_fetch_assoc($result))
+ $this->buffer[$sqlrow["key"]] = unserialize(base64_decode($sqlrow["value"]));
+
+ $this->to_be_created = array();
+ $this->to_be_deleted = array();
+ $this->to_be_updated = array();
+ }
+
+ public function save()
+ {
+ foreach($this->to_be_deleted as $k)
+ qdb("DELETE FROM `PREFIX_settings_kvstorage` WHERE `key` = '%s'", $k);
+ foreach($this->to_be_updated as $k)
+ qdb("UPDATE `PREFIX_settings_kvstorage` SET `value` = '%s' WHERE `key` = '%s'", base64_encode(serialize($this->buffer[$k])), $k);
+ foreach($this->to_be_created as $k)
+ qdb("INSERT INTO `PREFIX_settings_kvstorage` (`key`, `value`) VALUES ('%s', '%s')", $k, base64_encode(serialize($this->buffer[$k])));
+ $this->to_be_created = array();
+ $this->to_be_deleted = array();
+ $this->to_be_updated = array();
+ }
+
+ /* ArrayAccess implementation */
+ public function offsetExists($offset)
+ {
+ return isset($this->buffer[$offset]);
+ }
public function offsetGet($offset)
{
- global $global_settings_keys_buffer;
- if($this->offsetExists($offset))
+ return $this->buffer[$offset];
+ }
+ public function offsetSet ($offset, $value)
+ {
+ if(!$this->offsetExists($offset))
{
- $result = qdb("SELECT `value` FROM `PREFIX_settings_kvstorage` WHERE `key` = '%s'", $offset);
- $sqlrow = mysql_fetch_assoc($result);
- return unserialize(base64_decode($sqlrow["value"]));
+ if(in_array($offset, $this->to_be_deleted))
+ {
+ $this->to_be_updated[] = $offset;
+ unset($this->to_be_deleted[array_search($offset, $this->to_be_deleted)]);
+ }
+ else
+ $this->to_be_created[] = $offset;
}
- else
- throw new DoesNotExistError();
+ elseif((!in_array($offset, $this->to_be_created)) and (!in_array($offset, $this->to_be_updated)))
+ $this->to_be_updated[] = $offset;
+ $this->buffer[$offset] = $value;
}
public function offsetUnset($offset)
{
- global $global_settings_keys_buffer;
- if(!$this->rw)
- throw new NotAllowedError();
- unset($global_settings_keys_buffer[array_search($offset, $global_settings_keys_buffer)]);
- qdb("DELETE FROM `PREFIX_settings_kvstorage` WHERE `key` = '%s'", $offset);
- }
- public function offsetSet($offset, $value)
- {
- global $global_settings_keys_buffer;
- if(!$this->rw)
- throw new NotAllowedError();
- if(in_array($offset, $global_settings_keys_buffer))
- qdb("UPDATE `PREFIX_settings_kvstorage` SET `value` = '%s' WHERE `key` = '%s'", base64_encode(serialize($value)), $offset);
+ if(in_array($offset, $this->to_be_created))
+ unset($this->to_be_created[array_search($offset, $this->to_be_created)]);
else
- {
- $global_settings_keys_buffer[] = $offset;
- qdb("INSERT INTO `PREFIX_settings_kvstorage` (`key`, `value`) VALUES ('%s', '%s')", $offset, base64_encode(serialize($value)));
- }
+ $this->to_be_deleted[] = $offset;
+ unset($this->buffer[$offset]);
}
- /* IteratorAggregate interface implementation */
- public function getIterator() { return new SettingsIterator($this); }
+ /* IteratorAggregate implementation */
+ public function getIterator() { return new SettingsIterator($this, array_keys($this->buffer)); }
+
+ /* Countable implementation */
+ public function count() { return count($this->buffer); }
}
-$ratatoeskr_settings = new Settings("rw");
+$ratatoeskr_settings = Settings::get_instance();
/*
* Class: PluginKVStorage
@@ -2470,7 +2486,7 @@ class Article extends BySQLRowEnabled
function clean_database()
{
global $ratatoeskr_settings;
- if((!isset($ratatoeskr_settings["last_db_cleanup"])) or ($ratatoeskr_repositories["last_db_cleanup"] < (time() - 86400)))
+ if((!isset($ratatoeskr_settings["last_db_cleanup"])) or ($ratatoeskr_settings["last_db_cleanup"] < (time() - 86400)))
{
Plugin::clean_db();
$ratatoeskr_settings["last_db_cleanup"] = time();
diff --git a/ratatoeskr/sys/plugin_api.php b/ratatoeskr/sys/plugin_api.php
index f34a42a..a6f14d4 100644
--- a/ratatoeskr/sys/plugin_api.php
+++ b/ratatoeskr/sys/plugin_api.php
@@ -15,15 +15,15 @@ require_once(dirname(__FILE__) . "/../frontend.php");
/*
* Constant: APIVERSION
- * The current API version (1).
+ * The current API version (2).
*/
-define("APIVERSION", 1);
+define("APIVERSION", 2);
/*
* Array: $api_compat
* Array of API versions, this version is compatible to (including itself).
*/
-$api_compat = array(1);
+$api_compat = array(1, 2);
$url_handlers = array();
/*
@@ -184,12 +184,14 @@ abstract class RatatoeskrPlugin
/*
* Functions: Functions that are called at special events
*
- * init - Will be called after plugin is loaded. You should register your stuff here.
- * install - Will be called after installation. If your plugin needs to initialize some database stuff or generate files, this is the right function.
+ * init - Will be called after plugin is loaded. You should register your stuff here.
+ * atexit - Will be called, when Ratatöskr will exit.
+ * install - Will be called after installation. If your plugin needs to initialize some database stuff or generate files, this is the right function.
* uninstall - Will be called during uninstallation. If you used the install function you should undo your custom installation stuff.
- * update - Will be called after your plugin was updated to a new version.
+ * update - Will be called after your plugin was updated to a new version.
*/
public function init() {}
+ public function atexit() {}
public function install() {}
public function uninstall() {}
public function update() {}