Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.0.x will end 8 May 2023 (12 months).
  • Bug fixes for security issues in 4.0.x will end 13 November 2023 (18 months).
  • PHP version: minimum PHP 7.3.0 Note: the minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is also supported.

Differences Between: [Versions 310 and 400] [Versions 39 and 400] [Versions 400 and 401] [Versions 400 and 402] [Versions 400 and 403]

Native mysqli class representing moodle database interface.

Copyright: 2008 Petr Skoda (http://skodak.org)
License: http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
File Size: 2142 lines (81 kb)
Included or required: 3 times
Referenced: 0 times
Includes or requires: 4 files
 lib/dml/mysqli_native_moodle_temptables.php
 lib/dml/moodle_read_slave_trait.php
 lib/dml/moodle_database.php
 lib/dml/mysqli_native_moodle_recordset.php

Defines 1 class

mysqli_native_moodle_database:: (77 methods):
  create_database()
  driver_installed()
  get_dbfamily()
  get_dbtype()
  get_dblibrary()
  get_dbengine()
  get_dbcollation()
  detect_collation()
  is_antelope_file_format_no_more_supported()
  get_row_format()
  is_compressed_row_format_supported()
  is_file_per_table_enabled()
  is_large_prefix_enabled()
  get_row_format_sql()
  get_name()
  get_configuration_help()
  diagnose()
  raw_connect()
  dispose()
  get_db_handle()
  set_db_handle()
  can_use_readonly()
  get_server_info()
  allowed_param_types()
  get_last_error()
  get_tables()
  get_indexes()
  fetch_columns()
  has_breaking_change_quoted_defaults()
  has_breaking_change_sqlmode()
  get_column_info()
  mysqltype2moodletype()
  normalise_value()
  setup_is_unicodedb()
  change_database_structure()
  emulate_bound_params()
  execute()
  get_recordset_sql()
  export_table_recordset()
  create_recordset()
  get_records_sql()
  get_fieldset_sql()
  insert_record_raw()
  insert_record()
  insert_records()
  insert_chunk()
  import_record()
  update_record_raw()
  update_record()
  set_field_select()
  delete_records_select()
  delete_records_subquery()
  sql_cast_char2int()
  sql_cast_char2real()
  sql_equal()
  sql_like()
  sql_concat()
  sql_concat_join()
  sql_group_concat()
  sql_length()
  sql_regex_supported()
  sql_regex()
  sql_regex_get_word_beginning_boundary_marker()
  sql_regex_get_word_end_boundary_marker()
  sql_cast_2signed()
  sql_intersect()
  replace_all_text_supported()
  session_lock_supported()
  get_session_lock()
  release_session_lock()
  transactions_supported()
  begin_transaction()
  commit_transaction()
  rollback_transaction()
  convert_table_row_format()
  is_fulltext_search_supported()
  fix_table_name()


Class: mysqli_native_moodle_database  - X-Ref

Native mysqli class representing moodle database interface.

create_database($dbhost, $dbuser, $dbpass, $dbname, array $dboptions=null)   X-Ref
Attempt to create the database

return: bool success
param: string $dbhost
param: string $dbuser
param: string $dbpass
param: string $dbname

driver_installed()   X-Ref
Detects if all needed PHP stuff installed.
Note: can be used before connect()

return: mixed true if ok, string if something

get_dbfamily()   X-Ref
Returns database family type - describes SQL dialect
Note: can be used before connect()

return: string db family name (mysql, postgres, mssql, oracle, etc.)

get_dbtype()   X-Ref
Returns more specific database driver type
Note: can be used before connect()

return: string db type mysqli, pgsql, oci, mssql, sqlsrv

get_dblibrary()   X-Ref
Returns general database library name
Note: can be used before connect()

return: string db type pdo, native

get_dbengine()   X-Ref
Returns the current MySQL db engine.

This is an ugly workaround for MySQL default engine problems,
Moodle is designed to work best on ACID compliant databases
with full transaction support. Do not use MyISAM.

return: string or null MySQL engine name

get_dbcollation()   X-Ref
Returns the current MySQL db collation.

This is an ugly workaround for MySQL default collation problems.

return: string or null MySQL collation name

detect_collation()   X-Ref
Set 'dbcollation' option

return: string|null $dbcollation

is_antelope_file_format_no_more_supported()   X-Ref
Tests if the Antelope file format is still supported or it has been removed.
When removed, only Barracuda file format is supported, given the XtraDB/InnoDB engine.

return: bool True if the Antelope file format has been removed; otherwise, false.

get_row_format($table = null)   X-Ref
Get the row format from the database schema.

return: string row_format name or null if not known or table does not exist.
param: string $table

is_compressed_row_format_supported($cached = true)   X-Ref
Is this database compatible with compressed row format?
This feature is necessary for support of large number of text
columns in InnoDB/XtraDB database.

return: bool true if table can be created or changed to compressed row format.
param: bool $cached use cached result

is_file_per_table_enabled()   X-Ref
Check the database to see if innodb_file_per_table is on.

return: bool True if on otherwise false.

is_large_prefix_enabled()   X-Ref
Check the database to see if innodb_large_prefix is on.

return: bool True if on otherwise false.

get_row_format_sql($engine = null, $collation = null)   X-Ref
Determine if the row format should be set to compressed, dynamic, or default.

Terrible kludge. If we're using utf8mb4 AND we're using InnoDB, we need to specify row format to
be either dynamic or compressed (default is compact) in order to allow for bigger indexes (MySQL
errors #1709 and #1071).

return: string An sql fragment to add to sql statements.
param: string $engine The database engine being used. Will be looked up if not supplied.
param: string $collation The database collation to use. Will look up the current collation if not supplied.

get_name()   X-Ref
Returns localised database type name
Note: can be used before connect()

return: string

get_configuration_help()   X-Ref
Returns localised database configuration help.
Note: can be used before connect()

return: string

diagnose()   X-Ref
Diagnose database and tables, this function is used
to verify database and driver settings, db engine types, etc.

return: string null means everything ok, string means problem found.

raw_connect(string $dbhost, string $dbuser, string $dbpass, string $dbname, $prefix, array $dboptions=null)   X-Ref
Connect to db

return: bool success
param: string $dbhost The database host.
param: string $dbuser The database username.
param: string $dbpass The database username's password.
param: string $dbname The name of the database being connected to.e
param: mixed $prefix string means moodle db prefix, false used for external databases where prefix not used
param: array $dboptions driver specific options

dispose()   X-Ref
Close database connection and release all resources
and memory (especially circular memory references).
Do NOT use connect() again, create a new instance if needed.


get_db_handle()   X-Ref
Gets db handle currently used with queries

return: resource

set_db_handle($dbh)   X-Ref
Sets db handle to be used with subsequent queries

return: void
param: resource $dbh

can_use_readonly(int $type, string $sql)   X-Ref
Check if The query qualifies for readonly connection execution
Logging queries are exempt, those are write operations that circumvent
standard query_start/query_end paths.

return: bool
param: int $type type of query
param: string $sql

get_server_info()   X-Ref
Returns database server info array

return: array Array containing 'description' and 'version' info

allowed_param_types()   X-Ref
Returns supported query parameter types

return: int bitmask of accepted SQL_PARAMS_*

get_last_error()   X-Ref
Returns last error reported by database engine.

return: string error message

get_tables($usecache=true)   X-Ref
Return tables in database WITHOUT current prefix

return: array of table names in lowercase and without prefix
param: bool $usecache if true, returns list of cached tables.

get_indexes($table)   X-Ref
Return table indexes - everything lowercased.

return: array An associative array of indexes containing 'unique' flag and 'columns' being indexed
param: string $table The table we want to get indexes from.

fetch_columns(string $table)   X-Ref
Fetches detailed information about columns in table.

return: database_column_info[] array of database_column_info objects indexed with column names
param: string $table name

has_breaking_change_quoted_defaults()   X-Ref
Indicates whether column information retrieved from `information_schema.columns` has default values quoted or not.

return: boolean True when default values are quoted (breaking change); otherwise, false.

has_breaking_change_sqlmode()   X-Ref
Indicates whether SQL_MODE default value has changed in a not backward compatible way.

return: boolean True when SQL_MODE breaks BC; otherwise, false.

get_column_info(stdClass $rawcolumn)   X-Ref
Returns moodle column info for raw column from information schema.

return: stdClass standardised colum info
param: stdClass $rawcolumn

mysqltype2moodletype($mysql_type)   X-Ref
Normalise column type.

return: string one character
param: string $mysql_type

normalise_value($column, $value)   X-Ref
Normalise values based in RDBMS dependencies (booleans, LOBs...)

return: mixed the normalised value
param: database_column_info $column column metadata corresponding with the value we are going to normalise
param: mixed $value value we are going to normalise

setup_is_unicodedb()   X-Ref
Is this database compatible with utf8?

return: bool

change_database_structure($sql, $tablenames = null)   X-Ref
Do NOT use in code, to be used by database_manager only!

return: bool true
param: string|array $sql query
param: array|null $tablenames an array of xmldb table names affected by this request.

emulate_bound_params($sql, array $params=null)   X-Ref
Very ugly hack which emulates bound parameters in queries
because prepared statements do not use query cache.


execute($sql, array $params=null)   X-Ref
Execute general sql query. Should be used only when no other method suitable.
Do NOT use this to make changes in db structure, use database_manager methods instead!

return: bool true
param: string $sql query
param: array $params query parameters

get_recordset_sql($sql, array $params=null, $limitfrom=0, $limitnum=0)   X-Ref
Get a number of records as a moodle_recordset using a SQL statement.

Since this method is a little less readable, use of it should be restricted to
code where it's possible there might be large datasets being returned.  For known
small datasets use get_records_sql - it leads to simpler code.

The return type is like:
return: moodle_recordset instance
param: string $sql the SQL select query to execute.
param: array $params array of sql parameters
param: int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set).
param: int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set).

export_table_recordset($table)   X-Ref
Get all records from a table.

This method works around potential memory problems and may improve performance,
this method may block access to table until the recordset is closed.

return: moodle_recordset A moodle_recordset instance {@link function get_recordset}.
param: string $table Name of database table.

create_recordset($result)   X-Ref
No description

get_records_sql($sql, array $params=null, $limitfrom=0, $limitnum=0)   X-Ref
Get a number of records as an array of objects using a SQL statement.

Return value is like:
return: array of objects, or empty array if no records were found
param: string $sql the SQL select query to execute. The first column of this SELECT statement
param: array $params array of sql parameters
param: int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set).
param: int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set).

get_fieldset_sql($sql, array $params=null)   X-Ref
Selects records and return values (first field) as an array using a SQL statement.

return: array of values
param: string $sql The SQL query
param: array $params array of sql parameters

insert_record_raw($table, $params, $returnid=true, $bulk=false, $customsequence=false)   X-Ref
Insert new record into database, as fast as possible, no safety checks, lobs not supported.

return: bool|int true or new id
param: string $table name
param: mixed $params data record as object or array
param: bool $returnit return it of inserted record
param: bool $bulk true means repeated inserts expected
param: bool $customsequence true if 'id' included in $params, disables $returnid

insert_record($table, $dataobject, $returnid=true, $bulk=false)   X-Ref
Insert a record into a table and return the "id" field if required.

Some conversions and safety checks are carried out. Lobs are supported.
If the return ID isn't required, then this just reports success as true/false.
$data is an object containing needed data
return: bool|int true or new id
param: string $table The database table to be inserted into
param: object|array $dataobject A data object with values for one or more fields in the record
param: bool $returnid Should the id of the newly created record entry be returned? If this option is not requested then true/false is returned.

insert_records($table, $dataobjects)   X-Ref
Insert multiple records into database as fast as possible.

Order of inserts is maintained, but the operation is not atomic,
use transactions if necessary.

This method is intended for inserting of large number of small objects,
do not use for huge objects with text or binary fields.

return: void does not return new record ids
param: string $table  The database table to be inserted into
param: array|Traversable $dataobjects list of objects to be inserted, must be compatible with foreach

insert_chunk($table, array $chunk, array $columns)   X-Ref
Insert records in chunks.

Note: can be used only from insert_records().

param: string $table
param: array $chunk
param: database_column_info[] $columns

import_record($table, $dataobject)   X-Ref
Import a record into a table, id field is required.
Safety checks are NOT carried out. Lobs are supported.

return: bool true
param: string $table name of database table to be inserted into
param: object $dataobject A data object with values for one or more fields in the record

update_record_raw($table, $params, $bulk=false)   X-Ref
Update record in database, as fast as possible, no safety checks, lobs not supported.

return: bool true
param: string $table name
param: mixed $params data record as object or array
param: bool true means repeated updates expected

update_record($table, $dataobject, $bulk=false)   X-Ref
Update a record in a table

$dataobject is an object containing needed data
Relies on $dataobject having a variable "id" to
specify the record to update

return: bool true
param: string $table The database table to be checked against.
param: object $dataobject An object with contents equal to fieldname=>fieldvalue. Must have an entry for 'id' to map to the table specified.
param: bool true means repeated updates expected

set_field_select($table, $newfield, $newvalue, $select, array $params=null)   X-Ref
Set a single field in every table record which match a particular WHERE clause.

return: bool true
param: string $table The database table to be checked against.
param: string $newfield the field to set.
param: string $newvalue the value to set the field to.
param: string $select A fragment of SQL to be used in a where clause in the SQL call.
param: array $params array of sql parameters

delete_records_select($table, $select, array $params=null)   X-Ref
Delete one or more records from a table which match a particular WHERE clause.

return: bool true
param: string $table The database table to be checked against.
param: string $select A fragment of SQL to be used in a where clause in the SQL call (used to define the selection criteria).
param: array $params array of sql parameters

delete_records_subquery(string $table, string $field, string $alias, string $subquery, array $params = [])   X-Ref
Deletes records using a subquery, which is done with a strange DELETE...JOIN syntax in MySQL
because it performs very badly with normal subqueries.

param: string $table Table to delete from
param: string $field Field in table to match
param: string $alias Name of single column in subquery e.g. 'id'
param: string $subquery Query that will return values of the field to delete
param: array $params Parameters for query

sql_cast_char2int($fieldname, $text=false)   X-Ref
No description

sql_cast_char2real($fieldname, $text=false)   X-Ref
No description

sql_equal($fieldname, $param, $casesensitive = true, $accentsensitive = true, $notequal = false)   X-Ref
No description

sql_like($fieldname, $param, $casesensitive = true, $accentsensitive = true, $notlike = false, $escapechar = '\\')   X-Ref
Returns 'LIKE' part of a query.

Note that mysql does not support $casesensitive = true and $accentsensitive = false.
More information in http://bugs.mysql.com/bug.php?id=19567.

return: string SQL code fragment
param: string $fieldname usually name of the table column
param: string $param usually bound query parameter (?, :named)
param: bool $casesensitive use case sensitive search
param: bool $accensensitive use accent sensitive search (ignored if $casesensitive is true)
param: bool $notlike true means "NOT LIKE"
param: string $escapechar escape char for '%' and '_'

sql_concat()   X-Ref
Returns the proper SQL to do CONCAT between the elements passed
Can take many parameters

return: string The concat sql
param: string $str,... 1 or more fields/strings to concat

sql_concat_join($separator="' '", $elements=array()   X-Ref
Returns the proper SQL to do CONCAT between the elements passed
with a given separator

return: string The concat SQL
param: string $separator The string to use as the separator
param: array $elements An array of items to concatenate

sql_group_concat(string $field, string $separator = ', ', string $sort = '')   X-Ref
Return SQL for performing group concatenation on given field/expression

return: string
param: string $field
param: string $separator
param: string $sort

sql_length($fieldname)   X-Ref
Returns the SQL text to be used to calculate the length in characters of one expression.

return: string the piece of SQL code to be used in the statement.
param: string fieldname or expression to calculate its length in characters.

sql_regex_supported()   X-Ref
Does this driver support regex syntax when searching


sql_regex($positivematch = true, $casesensitive = false)   X-Ref
Return regex positive or negative match sql

return: string or empty if not supported
param: bool $positivematch
param: bool $casesensitive

sql_regex_get_word_beginning_boundary_marker()   X-Ref
Returns the word-beginning boundary marker based on MySQL version.

return: string The word-beginning boundary marker.

sql_regex_get_word_end_boundary_marker()   X-Ref
Returns the word-end boundary marker based on MySQL version.

return: string The word-end boundary marker.

sql_cast_2signed($fieldname)   X-Ref
Returns the SQL to be used in order to an UNSIGNED INTEGER column to SIGNED.

return: string The piece of SQL code to be used in your statement.
param: string $fieldname The name of the field to be cast

sql_intersect($selects, $fields)   X-Ref
Returns the SQL that allows to find intersection of two or more queries

return: string SQL query that will return only values that are present in each of selects
param: array $selects array of SQL select queries, each of them only returns fields with the names from $fields
param: string $fields comma-separated list of fields

replace_all_text_supported()   X-Ref
No description

session_lock_supported()   X-Ref
No description

get_session_lock($rowid, $timeout)   X-Ref
Obtain session lock

return: void
param: int $rowid id of the row with session record
param: int $timeout max allowed time to wait for the lock in seconds

release_session_lock($rowid)   X-Ref
No description

transactions_supported()   X-Ref
Are transactions supported?
It is not responsible to run productions servers
on databases without transaction support ;-)

MyISAM does not support support transactions.

You can override this via the dbtransactions option.

return: bool

begin_transaction()   X-Ref
Driver specific start of real database transaction,
this can not be used directly in code.

return: void

commit_transaction()   X-Ref
Driver specific commit of real database transaction,
this can not be used directly in code.

return: void

rollback_transaction()   X-Ref
Driver specific abort of real database transaction,
this can not be used directly in code.

return: void

convert_table_row_format($tablename)   X-Ref
Converts a table to either 'Compressed' or 'Dynamic' row format.

param: string $tablename Name of the table to convert to the new row format.

is_fulltext_search_supported()   X-Ref
Does this mysql instance support fulltext indexes?

return: bool

fix_table_name($tablename)   X-Ref
Fixes any table names that clash with reserved words.

return: string The fixed table name
param: string $tablename The table name