0e47fca4d904b03e6a546bd02c3993916b740643
[moodle.git] / admin / tool / log / classes / helper / buffered_writer.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Helper trait buffered_writer
19  *
20  * @package    tool_log
21  * @copyright  2014 onwards Ankit Agarwal
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace tool_log\helper;
26 defined('MOODLE_INTERNAL') || die();
28 /**
29  * Helper trait buffered_writer. Adds buffer support for the store.
30  *
31  * @package    tool_log
32  * @copyright  2014 onwards Ankit Agarwal
33  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34  */
35 trait buffered_writer {
37     /** @var array $buffer buffer of events. */
38     protected $buffer = array();
40     /** @var array $buffer buffer size of events. */
41     protected $buffersize;
43     /** @var int $count Counter. */
44     protected $count = 0;
46     /**
47      * Should the event be ignored (== not logged)?
48      * @param \core\event\base $event
49      * @return bool
50      */
51     abstract protected function is_event_ignored(\core\event\base $event);
53     /**
54      * Write event in the store with buffering. Method insert_events() must be
55      * defined.
56      *
57      * @param \core\event\base $event
58      *
59      * @return void
60      */
61     public function write(\core\event\base $event) {
62         if ($this->is_event_ignored($event)) {
63             return;
64         }
66         // We need to capture current info at this moment,
67         // at the same time this lowers memory use because
68         // snapshots and custom objects may be garbage collected.
69         $entry = $event->get_data();
70         $entry['other'] = serialize($entry['other']);
71         if (CLI_SCRIPT) {
72             $entry['origin'] = 'cli';
73             $entry['ip'] = null;
74         } else {
75             $entry['origin'] = 'web';
76             $entry['ip'] = getremoteaddr();
77         }
78         $entry['realuserid'] = \core\session\manager::is_loggedinas() ? $_SESSION['USER']->realuser : null;
81         $this->buffer[] = $entry;
82         $this->count++;
84         if (!isset($this->buffersize)) {
85             $this->buffersize = $this->get_config('buffersize', 50);
86         }
88         if ($this->count >= $this->buffersize) {
89             $this->flush();
90         }
91     }
93     /**
94      * Flush event buffer.
95      */
96     public function flush() {
97         if ($this->count == 0) {
98             return;
99         }
100         $events = $this->buffer;
101         $this->count = 0;
102         $this->buffer = array();
103         $this->insert_event_entries($events);
104     }
106     /**
107      * Bulk write a given array of events to the backend. Stores must implement this.
108      *
109      * @param array $evententries raw event data
110      */
111     abstract protected function insert_event_entries($evententries);
113     /**
114      * Get a config value for the store.
115      *
116      * @param string $name Config name
117      * @param mixed $default default value
118      *
119      * @return mixed config value if set, else the default value.
120      */
121     abstract protected function get_config($name, $default = null);
123     /**
124      * Push any remaining events to the database. Insert_events() must be
125      * defined. override in stores if the store doesn't support buffering.
126      *
127      */
128     public function dispose() {
129         $this->flush();
130     }