Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.x is supported too.

Differences Between: [Versions 310 and 402] [Versions 311 and 402] [Versions 39 and 402] [Versions 400 and 402]

   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/>.
  16  
  17  /**
  18   * Standard log reader/writer.
  19   *
  20   * @package    logstore_standard
  21   * @copyright  2013 Petr Skoda {@link http://skodak.org}
  22   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  namespace logstore_standard\log;
  26  
  27  defined('MOODLE_INTERNAL') || die();
  28  
  29  class store implements \tool_log\log\writer, \core\log\sql_internal_table_reader {
  30      use \tool_log\helper\store,
  31          \tool_log\helper\buffered_writer,
  32          \tool_log\helper\reader;
  33  
  34      /** @var string $logguests true if logging guest access */
  35      protected $logguests;
  36  
  37      public function __construct(\tool_log\log\manager $manager) {
  38          $this->helper_setup($manager);
  39          // Log everything before setting is saved for the first time.
  40          $this->logguests = $this->get_config('logguests', 1);
  41          // JSON writing defaults to false (table format compatibility with older versions).
  42          // Note: This variable is defined in the buffered_writer trait.
  43          $this->jsonformat = (bool)$this->get_config('jsonformat', false);
  44      }
  45  
  46      /**
  47       * Should the event be ignored (== not logged)?
  48       * @param \core\event\base $event
  49       * @return bool
  50       */
  51      protected function is_event_ignored(\core\event\base $event) {
  52          if ((!CLI_SCRIPT or PHPUNIT_TEST) and !$this->logguests) {
  53              // Always log inside CLI scripts because we do not login there.
  54              if (!isloggedin() or isguestuser()) {
  55                  return true;
  56              }
  57          }
  58          return false;
  59      }
  60  
  61      /**
  62       * Finally store the events into the database.
  63       *
  64       * @param array $evententries raw event data
  65       */
  66      protected function insert_event_entries($evententries) {
  67          global $DB;
  68  
  69          $DB->insert_records('logstore_standard_log', $evententries);
  70      }
  71  
  72      public function get_events_select($selectwhere, array $params, $sort, $limitfrom, $limitnum) {
  73          global $DB;
  74  
  75          $sort = self::tweak_sort_by_id($sort);
  76  
  77          $events = array();
  78          $records = $DB->get_recordset_select('logstore_standard_log', $selectwhere, $params, $sort, '*', $limitfrom, $limitnum);
  79  
  80          foreach ($records as $data) {
  81              if ($event = $this->get_log_event($data)) {
  82                  $events[$data->id] = $event;
  83              }
  84          }
  85  
  86          $records->close();
  87  
  88          return $events;
  89      }
  90  
  91      /**
  92       * Fetch records using given criteria returning a Traversable object.
  93       *
  94       * Note that the traversable object contains a moodle_recordset, so
  95       * remember that is important that you call close() once you finish
  96       * using it.
  97       *
  98       * @param string $selectwhere
  99       * @param array $params
 100       * @param string $sort
 101       * @param int $limitfrom
 102       * @param int $limitnum
 103       * @return \core\dml\recordset_walk|\core\event\base[]
 104       */
 105      public function get_events_select_iterator($selectwhere, array $params, $sort, $limitfrom, $limitnum) {
 106          global $DB;
 107  
 108          $sort = self::tweak_sort_by_id($sort);
 109  
 110          $recordset = $DB->get_recordset_select('logstore_standard_log', $selectwhere, $params, $sort, '*', $limitfrom, $limitnum);
 111  
 112          return new \core\dml\recordset_walk($recordset, array($this, 'get_log_event'));
 113      }
 114  
 115      /**
 116       * Returns an event from the log data.
 117       *
 118       * @param stdClass $data Log data
 119       * @return \core\event\base
 120       */
 121      public function get_log_event($data) {
 122  
 123          $extra = array('origin' => $data->origin, 'ip' => $data->ip, 'realuserid' => $data->realuserid);
 124          $data = (array)$data;
 125          $id = $data['id'];
 126          $data['other'] = self::decode_other($data['other']);
 127          if ($data['other'] === false) {
 128              $data['other'] = array();
 129          }
 130          unset($data['origin']);
 131          unset($data['ip']);
 132          unset($data['realuserid']);
 133          unset($data['id']);
 134  
 135          if (!$event = \core\event\base::restore($data, $extra)) {
 136              return null;
 137          }
 138  
 139          return $event;
 140      }
 141  
 142      /**
 143       * Get number of events present for the given select clause.
 144       *
 145       * @param string $selectwhere select conditions.
 146       * @param array $params params.
 147       *
 148       * @return int Number of events available for the given conditions
 149       */
 150      public function get_events_select_count($selectwhere, array $params) {
 151          global $DB;
 152          return $DB->count_records_select('logstore_standard_log', $selectwhere, $params);
 153      }
 154  
 155      /**
 156       * Get whether events are present for the given select clause.
 157       *
 158       * @param string $selectwhere select conditions.
 159       * @param array $params params.
 160       *
 161       * @return bool Whether events available for the given conditions
 162       */
 163      public function get_events_select_exists(string $selectwhere, array $params): bool {
 164          global $DB;
 165          return $DB->record_exists_select('logstore_standard_log', $selectwhere, $params);
 166      }
 167  
 168      public function get_internal_log_table_name() {
 169          return 'logstore_standard_log';
 170      }
 171  
 172      /**
 173       * Are the new events appearing in the reader?
 174       *
 175       * @return bool true means new log events are being added, false means no new data will be added
 176       */
 177      public function is_logging() {
 178          // Only enabled stpres are queried,
 179          // this means we can return true here unless store has some extra switch.
 180          return true;
 181      }
 182  }