From f7b2b1fb7ac29862adb3b0e3f59019523f6e40c8 Mon Sep 17 00:00:00 2001 From: Ankit Agarwal Date: Tue, 21 Jan 2014 11:49:11 +0800 Subject: [PATCH] MDL-43759 logging: Add helper traits for stores and add support for buffering --- admin/tool/log/classes/helper/reader.php | 72 ++++++++++++++++++++ admin/tool/log/classes/helper/store.php | 80 +++++++++++++++++++++++ admin/tool/log/classes/helper/writer.php | 83 ++++++++++++++++++++++++ 3 files changed, 235 insertions(+) create mode 100644 admin/tool/log/classes/helper/reader.php create mode 100644 admin/tool/log/classes/helper/store.php create mode 100644 admin/tool/log/classes/helper/writer.php diff --git a/admin/tool/log/classes/helper/reader.php b/admin/tool/log/classes/helper/reader.php new file mode 100644 index 00000000000..2bff91f79ff --- /dev/null +++ b/admin/tool/log/classes/helper/reader.php @@ -0,0 +1,72 @@ +. + +/** + * Reader helper trait. + * + * @package tool_log + * @copyright 2014 onwards Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace tool_log\helper; + +defined('MOODLE_INTERNAL') || die(); + +/** + * Reader helper trait. + * \tool_log\helper\store must be included before using this trait. + * + * @package tool_log + * @copyright 2014 onwards Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +trait reader { + /** + * Default get name api. + * + * @return string name of the store. + */ + public function get_name() { + if (get_string_manager()->string_exists('pluginname', $this->component)) { + return get_string('pluginname', $this->component); + } + return $this->store; + } + + /** + * Default get description method. + * + * @return string description of the store. + */ + public function get_description() { + if (get_string_manager()->string_exists('pluginname_desc', $this->component)) { + return get_string('pluginname_desc', $this->component); + } + return $this->store; + } + + /** + * If the current user can access current store or not. + * + * @param \context $context. + * + * @return bool + */ + public function can_access(\context $context) { + return has_capability('logstore/' . $this->store . ':read', $context); + } +} diff --git a/admin/tool/log/classes/helper/store.php b/admin/tool/log/classes/helper/store.php new file mode 100644 index 00000000000..d99b1be395a --- /dev/null +++ b/admin/tool/log/classes/helper/store.php @@ -0,0 +1,80 @@ +. + + +/** + * Helper trait store. + * + * @package tool_log + * @copyright 2014 onwards Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace tool_log\helper; +defined('MOODLE_INTERNAL') || die(); + +/** + * Helper trait store. Adds some helper methods for stores. + * + * @package tool_log + * @copyright 2014 onwards Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +trait store { + + /** @var \tool_log\log\manager $manager manager instance. */ + protected $manager; + + /** @var string $component Frankenstyle store name. */ + protected $component; + + /** @var string $store name of the store. */ + protected $store; + + + /** + * Setup store specific variables. + * + * @param \tool_log\log\manager $manager manager instance. + */ + protected function helper_setup(\tool_log\log\manager $manager) { + $this->manager = $manager; + $called = get_called_class(); + $parts = explode('\\', $called); + if (!isset($parts[0]) || strpos($parts[0], 'logstore_') !== 0) { + throw new \coding_exception("Store $called doesn't define classes in correct namespaces."); + } + $this->component = $parts[0]; + $this->store = str_replace('logstore_', '', $this->store); + } + + /** + * Api to get plugin config + * + * @param string $name name of the config. + * @param null|mixed $default default value to return. + * + * @return mixed|null return config value. + */ + protected function get_config($name, $default = null) { + $value = get_config($this->component, $name); + if ($value !== false) { + return $value; + } + return $default; + } + +} diff --git a/admin/tool/log/classes/helper/writer.php b/admin/tool/log/classes/helper/writer.php new file mode 100644 index 00000000000..ff785910580 --- /dev/null +++ b/admin/tool/log/classes/helper/writer.php @@ -0,0 +1,83 @@ +. + + +/** + * Helper trait writer + * + * @package tool_log + * @copyright 2014 onwards Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace tool_log\helper; +defined('MOODLE_INTERNAL') || die(); + +/** + * Helper trait writer. Adds buffer support for the store. + * \tool_log\helper\store must be included before using this trait. + * + * @package tool_log + * @copyright 2014 onwards Ankit Agarwal + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +trait writer { + + /** @var array $buffer buffer of events.*/ + protected $buffer = array(); + + /** @var array $buffer buffer size of events.*/ + protected $buffersize; + + /** @var int $count Counter.*/ + protected $count = 0; + + /** + * Write event in the store with buffering. Insert_events() must be + * defined. override in stores if the store doesn't support buffering. + * + * @param \core\event\base $event + * + * @return void + */ + public function write(\core\event\base $event) { + $this->buffer[] = $event; + $this->count++; + + if (!isset($this->buffersize)) { + $this->buffersize = $this->get_config('buffersize', 50); + } + + if ($this->count >= $this->buffersize) { + $events = $this->buffer; + $this->insert_events($events); + $this->count = 0; + $this->buffer = array(); + } + } + + /** + * Push any remaining events to the database. Insert_events() must be + * defined. override in stores if the store doesn't support buffering. + * + */ + public function dispose() { + $events = $this->buffer; + $this->insert_events($events); + $this->count = 0; + $this->buffer = array(); + } +}