Merge branch 'w11_MDL-44496_m27_eventbuffer' of https://github.com/skodak/moodle

This commit is contained in:
Sam Hemelryk 2014-03-11 11:54:05 +13:00
commit 509edd5624
3 changed files with 72 additions and 64 deletions

View file

@ -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.

View file

@ -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);
}

View file

@ -40,39 +40,30 @@ class store implements \tool_log\log\writer, \core\log\sql_internal_reader {
$this->logguests = $this->get_config('logguests', 1);
}
/**
* Should the event be ignored (== not logged)?
* @param \core\event\base $event
* @return bool
*/
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()) {
return true;
}
}
return false;
}
/**
* Finally store the events into the database.
*
* @param \core\event\base[] $events
* @param array $evententries raw event data
*/
protected function insert_events($events) {
protected function insert_event_entries($evententries) {
global $DB;
$dataobj = array();
// Filter events.
foreach ($events as $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;
}
}
$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;
}
$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) {