mirror of
https://github.com/moodle/moodle.git
synced 2025-08-06 17:36:38 +02:00
Merge branch 'w11_MDL-44496_m27_eventbuffer' of https://github.com/skodak/moodle
This commit is contained in:
commit
509edd5624
3 changed files with 72 additions and 64 deletions
|
@ -27,7 +27,6 @@ defined('MOODLE_INTERNAL') || die();
|
|||
|
||||
/**
|
||||
* Helper trait buffered_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
|
||||
|
@ -44,6 +43,13 @@ trait buffered_writer {
|
|||
/** @var int $count Counter. */
|
||||
protected $count = 0;
|
||||
|
||||
/**
|
||||
* Should the event be ignored (== not logged)?
|
||||
* @param \core\event\base $event
|
||||
* @return bool
|
||||
*/
|
||||
abstract protected function is_event_ignored(\core\event\base $event);
|
||||
|
||||
/**
|
||||
* Write event in the store with buffering. Method insert_events() must be
|
||||
* defined.
|
||||
|
@ -53,7 +59,26 @@ trait buffered_writer {
|
|||
* @return void
|
||||
*/
|
||||
public function write(\core\event\base $event) {
|
||||
$this->buffer[] = $event;
|
||||
if ($this->is_event_ignored($event)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// We need to capture current info at this moment,
|
||||
// at the same time this lowers memory use because
|
||||
// snapshots and custom objects may be garbage collected.
|
||||
$entry = $event->get_data();
|
||||
$entry['other'] = serialize($entry['other']);
|
||||
if (CLI_SCRIPT) {
|
||||
$entry['origin'] = 'cli';
|
||||
$entry['ip'] = null;
|
||||
} else {
|
||||
$entry['origin'] = 'web';
|
||||
$entry['ip'] = getremoteaddr();
|
||||
}
|
||||
$entry['realuserid'] = \core\session\manager::is_loggedinas() ? $_SESSION['USER']->realuser : null;
|
||||
|
||||
|
||||
$this->buffer[] = $entry;
|
||||
$this->count++;
|
||||
|
||||
if (!isset($this->buffersize)) {
|
||||
|
@ -75,15 +100,15 @@ trait buffered_writer {
|
|||
$events = $this->buffer;
|
||||
$this->count = 0;
|
||||
$this->buffer = array();
|
||||
$this->insert_events($events);
|
||||
$this->insert_event_entries($events);
|
||||
}
|
||||
|
||||
/**
|
||||
* Bulk write a given array of events to the backend. Stores must implement this.
|
||||
*
|
||||
* @param array $events An array of events to write.
|
||||
* @param array $evententries raw event data
|
||||
*/
|
||||
abstract protected function insert_events($events);
|
||||
abstract protected function insert_event_entries($evententries);
|
||||
|
||||
/**
|
||||
* Get a config value for the store.
|
||||
|
|
|
@ -107,49 +107,41 @@ class store implements \tool_log\log\writer, \core\log\sql_select_reader {
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should the event be ignored (== not logged)?
|
||||
* @param \core\event\base $event
|
||||
* @return bool
|
||||
*/
|
||||
protected function is_event_ignored(\core\event\base $event) {
|
||||
if (in_array($event->crud, $this->excludeactions) ||
|
||||
in_array($event->edulevel, $this->excludelevels)
|
||||
) {
|
||||
// Ignore event if the store settings do not want to store it.
|
||||
return true;
|
||||
}
|
||||
if ((!CLI_SCRIPT or PHPUNIT_TEST) and !$this->logguests) {
|
||||
// Always log inside CLI scripts because we do not login there.
|
||||
if (!isloggedin() or isguestuser()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert events in bulk to the database.
|
||||
*
|
||||
* @param \core\event\base[] $events
|
||||
* @param array $evententries raw event data
|
||||
*/
|
||||
protected function insert_events($events) {
|
||||
protected function insert_event_entries($evententries) {
|
||||
if (!$this->init()) {
|
||||
return;
|
||||
}
|
||||
if (!$dbtable = $this->get_config('dbtable')) {
|
||||
return;
|
||||
}
|
||||
$dataobj = array();
|
||||
|
||||
// Filter events.
|
||||
foreach ($events as $event) {
|
||||
if (in_array($event->crud, $this->excludeactions) ||
|
||||
in_array($event->edulevel, $this->excludelevels)
|
||||
) {
|
||||
// Ignore event if the store settings do not want to store it.
|
||||
continue;
|
||||
}
|
||||
if ((!CLI_SCRIPT or PHPUNIT_TEST) and !$this->logguests) {
|
||||
// Always log inside CLI scripts because we do not login there.
|
||||
if (!isloggedin() or isguestuser()) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
$data = $event->get_data();
|
||||
$data['other'] = serialize($data['other']);
|
||||
if (CLI_SCRIPT) {
|
||||
$data['origin'] = 'cli';
|
||||
$data['ip'] = null;
|
||||
} else {
|
||||
$data['origin'] = 'web';
|
||||
$data['ip'] = getremoteaddr();
|
||||
}
|
||||
$data['realuserid'] = \core\session\manager::is_loggedinas() ? $_SESSION['USER']->realuser : null;
|
||||
$dataobj[] = $data;
|
||||
}
|
||||
try {
|
||||
$this->extdb->insert_records($dbtable, $dataobj);
|
||||
$this->extdb->insert_records($dbtable, $evententries);
|
||||
} catch (\moodle_exception $e) {
|
||||
debugging('Cannot write to external database: ' . $e->getMessage(), DEBUG_DEVELOPER);
|
||||
}
|
||||
|
|
|
@ -41,38 +41,29 @@ class store implements \tool_log\log\writer, \core\log\sql_internal_reader {
|
|||
}
|
||||
|
||||
/**
|
||||
* Finally store the events into the database.
|
||||
*
|
||||
* @param \core\event\base[] $events
|
||||
* Should the event be ignored (== not logged)?
|
||||
* @param \core\event\base $event
|
||||
* @return bool
|
||||
*/
|
||||
protected function insert_events($events) {
|
||||
global $DB;
|
||||
|
||||
$dataobj = array();
|
||||
|
||||
// Filter events.
|
||||
foreach ($events as $event) {
|
||||
protected function is_event_ignored(\core\event\base $event) {
|
||||
if ((!CLI_SCRIPT or PHPUNIT_TEST) and !$this->logguests) {
|
||||
// Always log inside CLI scripts because we do not login there.
|
||||
if (!isloggedin() or isguestuser()) {
|
||||
continue;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
$data = $event->get_data();
|
||||
$data['other'] = serialize($data['other']);
|
||||
if (CLI_SCRIPT) {
|
||||
$data['origin'] = 'cli';
|
||||
$data['ip'] = null;
|
||||
} else {
|
||||
$data['origin'] = 'web';
|
||||
$data['ip'] = getremoteaddr();
|
||||
}
|
||||
$data['realuserid'] = \core\session\manager::is_loggedinas() ? $_SESSION['USER']->realuser : null;
|
||||
$dataobj[] = $data;
|
||||
}
|
||||
/**
|
||||
* Finally store the events into the database.
|
||||
*
|
||||
* @param array $evententries raw event data
|
||||
*/
|
||||
protected function insert_event_entries($evententries) {
|
||||
global $DB;
|
||||
|
||||
$DB->insert_records('logstore_standard_log', $dataobj);
|
||||
$DB->insert_records('logstore_standard_log', $evententries);
|
||||
}
|
||||
|
||||
public function get_events_select($selectwhere, array $params, $sort, $limitfrom, $limitnum) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue