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] [Versions 401 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   * Abstract database driver test class providing some moodle database interface
  19   *
  20   * @package    core
  21   * @category   dml
  22   * @copyright  2018 Srdjan Janković, Catalyst IT
  23   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  24   */
  25  
  26  namespace core;
  27  
  28  use Exception;
  29  
  30  defined('MOODLE_INTERNAL') || die();
  31  
  32  require_once (__DIR__.'/../../moodle_database.php');
  33  require_once (__DIR__.'/../../moodle_temptables.php');
  34  require_once (__DIR__.'/../../../ddl/database_manager.php');
  35  require_once (__DIR__.'/test_sql_generator.php');
  36  
  37  /**
  38   * Abstract database driver test class
  39   *
  40   * @package    core
  41   * @category   dml
  42   * @copyright  2018 Catalyst IT
  43   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  44   */
  45  abstract class test_moodle_database extends \moodle_database {
  46  
  47      /** @var string */
  48      private $error;
  49  
  50      /** @var array */
  51      private $_tables = [];
  52  
  53      /**
  54       * Constructor - Instantiates the database
  55       * @param bool $external True means that an external database is used.
  56       */
  57      public function __construct($external = false) {
  58          parent::__construct($external);
  59  
  60          $this->temptables = new \moodle_temptables($this);
  61      }
  62  
  63      /**
  64       * Default implementation
  65       * @return boolean true
  66       */
  67      public function driver_installed() {
  68          return true;
  69      }
  70  
  71      /**
  72       * Default implementation
  73       * @return string 'test'
  74       */
  75      public function get_dbfamily() {
  76          return 'test';
  77      }
  78  
  79      /**
  80       * Default implementation
  81       * @return string 'test'
  82       */
  83      protected function get_dbtype() {
  84          return 'test';
  85      }
  86  
  87      /**
  88       * Default implementation
  89       * @return string 'test'
  90       */
  91      protected function get_dblibrary() {
  92          return 'test';
  93      }
  94  
  95      /**
  96       * Default implementation
  97       * @return string 'test'
  98       */
  99      public function get_name() {
 100          return 'test';
 101      }
 102  
 103      /**
 104       * Default implementation
 105       * @return string
 106       */
 107      public function get_configuration_help() {
 108          return 'test database driver';
 109      }
 110  
 111      /**
 112       * Default implementation
 113       * @return array
 114       */
 115      public function get_server_info() {
 116          return ['description' => $this->name(), 'version' => '0'];
 117      }
 118  
 119      /**
 120       * Default implementation
 121       * @return int 0
 122       */
 123      protected function allowed_param_types() {
 124          return 0;
 125      }
 126  
 127      /**
 128       * Returns error property
 129       * @return string $error
 130       */
 131      public function get_last_error() {
 132          return $this->error;
 133      }
 134  
 135      /**
 136       * Sets tables property
 137       * @param array $tables
 138       * @return void
 139       */
 140      public function set_tables($tables) {
 141          $this->_tables = $tables;
 142      }
 143  
 144      /**
 145       * Returns keys of tables property
 146       * @param bool $usecache
 147       * @return array $tablenames
 148       */
 149      public function get_tables($usecache = true) {
 150          return array_keys($this->_tables);
 151      }
 152  
 153      /**
 154       * Return table indexes
 155       * @param string $table
 156       * @return array $indexes
 157       */
 158      public function get_indexes($table) {
 159          return isset($this->_tables[$table]['indexes']) ? $this->_tables[$table]['indexes'] : [];
 160      }
 161  
 162      /**
 163       * Return table columns
 164       * @param string $table
 165       * @return array database_column_info[] of database_column_info objects indexed with column names
 166       */
 167      public function fetch_columns($table) : array {
 168          return $this->_tables[$table]['columns'];
 169      }
 170  
 171      /**
 172       * Default implementation
 173       * @param \stdClass $column metadata
 174       * @param mixed $value
 175       * @return mixed $value
 176       */
 177      protected function normalise_value($column, $value) {
 178          return $value;
 179      }
 180  
 181      /**
 182       * Default implementation
 183       * @param string|array $sql
 184       * @param array|null $tablenames
 185       * @return bool true
 186       */
 187      public function change_database_structure($sql, $tablenames = null) {
 188          return true;
 189      }
 190  
 191      /**
 192       * Default implementation, throws Exception
 193       * @param string $sql
 194       * @param array $params
 195       * @return bool true
 196       * @throws Exception
 197       */
 198      public function execute($sql, array $params = null) {
 199          throw new Exception("execute() not implemented");
 200      }
 201  
 202      /**
 203       * Default implementation, throws Exception
 204       * @param string $sql
 205       * @param array $params
 206       * @param int $limitfrom
 207       * @param int $limitnum
 208       * @return bool true
 209       * @throws Exception
 210       */
 211      public function get_recordset_sql($sql, array $params = null, $limitfrom = 0, $limitnum = 0) {
 212          throw new Exception("get_recordset_sql() not implemented");
 213      }
 214  
 215      /**
 216       * Default implementation, throws Exception
 217       * @param string $sql
 218       * @param array $params
 219       * @param int $limitfrom
 220       * @param int $limitnum
 221       * @return bool true
 222       * @throws Exception
 223       */
 224      public function get_records_sql($sql, array $params = null, $limitfrom = 0, $limitnum = 0) {
 225          throw new Exception("get_records_sql() not implemented");
 226      }
 227  
 228      /**
 229       * Default implementation, throws Exception
 230       * @param string $sql
 231       * @param array $params
 232       * @return bool true
 233       * @throws Exception
 234       */
 235      public function get_fieldset_sql($sql, array $params = null) {
 236          throw new Exception("get_fieldset_sql() not implemented");
 237      }
 238  
 239      /**
 240       * Default implementation, throws Exception
 241       * @param string $table
 242       * @param array $params
 243       * @param bool $returnid
 244       * @param bool $bulk
 245       * @param bool $customsequence
 246       * @return bool|int true or new id
 247       * @throws Exception
 248       */
 249      public function insert_record_raw($table, $params, $returnid = true, $bulk = false, $customsequence = false) {
 250          throw new Exception("insert_record_raw() not implemented");
 251      }
 252  
 253      /**
 254       * Default implementation, throws Exception
 255       * @param string $table
 256       * @param object|array $dataobject
 257       * @param bool $returnid
 258       * @param bool $bulk
 259       * @return bool|int true or new id
 260       * @throws Exception
 261       */
 262      public function insert_record($table, $dataobject, $returnid = true, $bulk = false) {
 263          return $this->insert_record_raw($table, (array)$dataobject, $returnid, $bulk);
 264      }
 265  
 266      /**
 267       * Default implementation, throws Exception
 268       * @param string $table
 269       * @param StdObject $dataobject
 270       * @return bool true
 271       * @throws Exception
 272       */
 273      public function import_record($table, $dataobject) {
 274          throw new Exception("import_record() not implemented");
 275      }
 276  
 277      /**
 278       * Default implementation, throws Exception
 279       * @param string $table
 280       * @param array $params
 281       * @param bool $bulk
 282       * @return bool true
 283       * @throws Exception
 284       */
 285      public function update_record_raw($table, $params, $bulk = false) {
 286          throw new Exception("update_record_raw() not implemented");
 287      }
 288  
 289      /**
 290       * Default implementation, throws Exception
 291       * @param string $table
 292       * @param StdObject $dataobject
 293       * @param bool $bulk
 294       * @return bool true
 295       * @throws Exception
 296       */
 297      public function update_record($table, $dataobject, $bulk = false) {
 298          throw new Exception("update_record() not implemented");
 299      }
 300  
 301      /**
 302       * Default implementation, throws Exception
 303       * @param string $table
 304       * @param string $newfield
 305       * @param string $newvalue
 306       * @param string $select
 307       * @param array $params
 308       * @return bool true
 309       * @throws Exception
 310       */
 311      public function set_field_select($table, $newfield, $newvalue, $select, array $params = null) {
 312          throw new Exception("set_field_select() not implemented");
 313      }
 314  
 315      /**
 316       * Default implementation, throws Exception
 317       * @param string $table
 318       * @param string $select
 319       * @param array $params
 320       * @return bool true
 321       * @throws Exception
 322       */
 323      public function delete_records_select($table, $select, array $params = null) {
 324          throw new Exception("delete_records_select() not implemented");
 325      }
 326  
 327      /**
 328       * Default implementation, throws Exception
 329       * @return string $sql
 330       * @throws Exception
 331       */
 332      public function sql_concat() {
 333          throw new Exception("sql_concat() not implemented");
 334      }
 335  
 336      /**
 337       * Default implementation, throws Exception
 338       * @param string $separator
 339       * @param array  $elements
 340       * @return string $sql
 341       * @throws Exception
 342       */
 343      public function sql_concat_join($separator = "' '", $elements = []) {
 344          throw new Exception("sql_concat_join() not implemented");
 345      }
 346  
 347      /**
 348       * Default implementation, throws Exception
 349       *
 350       * @param string $field
 351       * @param string $separator
 352       * @param string $sort
 353       * @return string
 354       * @throws Exception
 355       */
 356      public function sql_group_concat(string $field, string $separator = ', ', string $sort = ''): string {
 357          throw new Exception('sql_group_concat() not implemented');
 358      }
 359  
 360      /**
 361       * Default implementation, throws Exception
 362       * @return void
 363       * @throws Exception
 364       */
 365      protected function begin_transaction() {
 366          throw new Exception("begin_transaction() not implemented");
 367      }
 368  
 369      /**
 370       * Default implementation, throws Exception
 371       * @return void
 372       * @throws Exception
 373       */
 374      protected function commit_transaction() {
 375          throw new Exception("commit_transaction() not implemented");
 376      }
 377  
 378      /**
 379       * Default implementation, throws Exception
 380       * @return void
 381       * @throws Exception
 382       */
 383      protected function rollback_transaction() {
 384          throw new Exception("rollback_transaction() not implemented");
 385      }
 386  
 387      /**
 388       * Returns the database manager used for db manipulation.
 389       * Used mostly in upgrade.php scripts.
 390       * @return database_manager The instance used to perform ddl operations.
 391       * @see lib/ddl/database_manager.php
 392       */
 393      public function get_manager() {
 394          if (!$this->database_manager) {
 395              $generator = new test_sql_generator($this, $this->temptables);
 396  
 397              $this->database_manager = new database_manager($this, $generator);
 398          }
 399          return $this->database_manager;
 400      }
 401  }