2015-08-18 00:00:26 +00:00
< ? php
/**
* @ file
* Core systems for the database layer .
*
* Classes required for basic functioning of the database system should be
* placed in this file . All utility functions should also be placed in this
* file only , as they cannot auto - load the way classes can .
*/
2015-08-27 19:03:05 +00:00
use Drupal\Core\Database\Database ;
use Drupal\Core\Database\Query\Condition ;
use Drupal\Core\Site\Settings ;
2015-08-18 00:00:26 +00:00
/**
* @ addtogroup database
* @ {
*/
/**
* Executes an arbitrary query string against the active database .
*
* Use this function for SELECT queries if it is just a simple query string .
* If the caller or other modules need to change the query , use db_select ()
* instead .
*
* Do not use this function for INSERT , UPDATE , or DELETE queries . Those should
* be handled via db_insert (), db_update () and db_delete () respectively .
*
2015-08-27 19:03:05 +00:00
* @ param string | \Drupal\Core\Database\StatementInterface $query
2015-08-18 00:00:26 +00:00
* The prepared statement query to run . Although it will accept both named and
* unnamed placeholders , named placeholders are strongly preferred as they are
* more self - documenting . If the argument corresponding to a placeholder is
2016-01-07 00:31:26 +00:00
* an array of values to be expanded ( for example , with an IN query ), the
* placeholder should be named with a trailing bracket like : example [] .
2015-08-27 19:03:05 +00:00
* @ param array $args
2015-08-18 00:00:26 +00:00
* An array of values to substitute into the query . If the query uses named
* placeholders , this is an associative array in any order . If the query uses
* unnamed placeholders ( ? ), this is an indexed array and the order must match
* the order of placeholders in the query string .
2015-08-27 19:03:05 +00:00
* @ param array $options
2015-08-18 00:00:26 +00:00
* An array of options to control how the query operates .
*
* @ return \Drupal\Core\Database\StatementInterface
* A prepared statement object , already executed .
*
2015-08-27 19:03:05 +00:00
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call query () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> query ( $query , $args , $options );
*
* @ see \Drupal\Core\Database\Connection :: query ()
2015-08-18 00:00:26 +00:00
* @ see \Drupal\Core\Database\Connection :: defaultOptions ()
*/
2017-04-13 14:53:35 +00:00
function db_query ( $query , array $args = [], array $options = []) {
2015-08-18 00:00:26 +00:00
if ( empty ( $options [ 'target' ])) {
$options [ 'target' ] = 'default' ;
}
return Database :: getConnection ( $options [ 'target' ]) -> query ( $query , $args , $options );
}
/**
* Executes a query against the active database , restricted to a range .
*
2015-08-27 19:03:05 +00:00
* @ param string $query
2015-08-18 00:00:26 +00:00
* The prepared statement query to run . Although it will accept both named and
* unnamed placeholders , named placeholders are strongly preferred as they are
* more self - documenting .
* @ param $from
* The first record from the result set to return .
* @ param $count
* The number of records to return from the result set .
2015-08-27 19:03:05 +00:00
* @ param array $args
2015-08-18 00:00:26 +00:00
* An array of values to substitute into the query . If the query uses named
* placeholders , this is an associative array in any order . If the query uses
* unnamed placeholders ( ? ), this is an indexed array and the order must match
* the order of placeholders in the query string .
2015-08-27 19:03:05 +00:00
* @ param array $options
2015-08-18 00:00:26 +00:00
* An array of options to control how the query operates .
*
* @ return \Drupal\Core\Database\StatementInterface
* A prepared statement object , already executed .
*
2015-08-27 19:03:05 +00:00
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call queryRange () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> queryRange ( $query , $from , $count , $args , $options );
*
* @ see \Drupal\Core\Database\Connection :: queryRange ()
2015-08-18 00:00:26 +00:00
* @ see \Drupal\Core\Database\Connection :: defaultOptions ()
*/
2017-04-13 14:53:35 +00:00
function db_query_range ( $query , $from , $count , array $args = [], array $options = []) {
2015-08-18 00:00:26 +00:00
if ( empty ( $options [ 'target' ])) {
$options [ 'target' ] = 'default' ;
}
return Database :: getConnection ( $options [ 'target' ]) -> queryRange ( $query , $from , $count , $args , $options );
}
/**
* Executes a SELECT query string and saves the result set to a temporary table .
*
* The execution of the query string happens against the active database .
*
2015-08-27 19:03:05 +00:00
* @ param string $query
2015-08-18 00:00:26 +00:00
* The prepared SELECT statement query to run . Although it will accept both
* named and unnamed placeholders , named placeholders are strongly preferred
* as they are more self - documenting .
2015-08-27 19:03:05 +00:00
* @ param array $args
2015-08-18 00:00:26 +00:00
* An array of values to substitute into the query . If the query uses named
* placeholders , this is an associative array in any order . If the query uses
* unnamed placeholders ( ? ), this is an indexed array and the order must match
* the order of placeholders in the query string .
2015-08-27 19:03:05 +00:00
* @ param array $options
2015-08-18 00:00:26 +00:00
* An array of options to control how the query operates .
*
* @ return
* The name of the temporary table .
*
2015-08-27 19:03:05 +00:00
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call queryTemporary () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> queryTemporary ( $query , $args , $options );
*
* @ see \Drupal\Core\Database\Connection :: queryTemporary ()
2015-08-18 00:00:26 +00:00
* @ see \Drupal\Core\Database\Connection :: defaultOptions ()
*/
2017-04-13 14:53:35 +00:00
function db_query_temporary ( $query , array $args = [], array $options = []) {
2015-08-18 00:00:26 +00:00
if ( empty ( $options [ 'target' ])) {
$options [ 'target' ] = 'default' ;
}
return Database :: getConnection ( $options [ 'target' ]) -> queryTemporary ( $query , $args , $options );
}
/**
* Returns a new InsertQuery object for the active database .
*
2015-08-27 19:03:05 +00:00
* @ param string $table
2015-08-18 00:00:26 +00:00
* The table into which to insert .
2015-08-27 19:03:05 +00:00
* @ param array $options
2015-08-18 00:00:26 +00:00
* An array of options to control how the query operates .
*
* @ return \Drupal\Core\Database\Query\Insert
* A new Insert object for this connection .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call insert () on it . For example ,
* $injected_database -> insert ( $table , $options );
2015-08-27 19:03:05 +00:00
*
* @ see \Drupal\Core\Database\Connection :: insert ()
* @ see \Drupal\Core\Database\Connection :: defaultOptions ()
2015-08-18 00:00:26 +00:00
*/
2017-04-13 14:53:35 +00:00
function db_insert ( $table , array $options = []) {
2015-08-18 00:00:26 +00:00
if ( empty ( $options [ 'target' ]) || $options [ 'target' ] == 'replica' ) {
$options [ 'target' ] = 'default' ;
}
return Database :: getConnection ( $options [ 'target' ]) -> insert ( $table , $options );
}
/**
* Returns a new MergeQuery object for the active database .
*
2015-08-27 19:03:05 +00:00
* @ param string $table
* Name of the table to associate with this query .
* @ param array $options
2015-08-18 00:00:26 +00:00
* An array of options to control how the query operates .
*
* @ return \Drupal\Core\Database\Query\Merge
* A new Merge object for this connection .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call merge () on it . For example ,
* $injected_database -> merge ( $table , $options );
2015-08-27 19:03:05 +00:00
*
* @ see \Drupal\Core\Database\Connection :: merge ()
* @ see \Drupal\Core\Database\Connection :: defaultOptions ()
2015-08-18 00:00:26 +00:00
*/
2017-04-13 14:53:35 +00:00
function db_merge ( $table , array $options = []) {
2015-08-18 00:00:26 +00:00
if ( empty ( $options [ 'target' ]) || $options [ 'target' ] == 'replica' ) {
$options [ 'target' ] = 'default' ;
}
return Database :: getConnection ( $options [ 'target' ]) -> merge ( $table , $options );
}
/**
* Returns a new UpdateQuery object for the active database .
*
2015-08-27 19:03:05 +00:00
* @ param string $table
2015-08-18 00:00:26 +00:00
* The table to update .
2015-08-27 19:03:05 +00:00
* @ param array $options
2015-08-18 00:00:26 +00:00
* An array of options to control how the query operates .
*
* @ return \Drupal\Core\Database\Query\Update
* A new Update object for this connection .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call update () on it . For example ,
* $injected_database -> update ( $table , $options );
2015-08-27 19:03:05 +00:00
*
* @ see \Drupal\Core\Database\Connection :: update ()
* @ see \Drupal\Core\Database\Connection :: defaultOptions ()
2015-08-18 00:00:26 +00:00
*/
2017-04-13 14:53:35 +00:00
function db_update ( $table , array $options = []) {
2015-08-18 00:00:26 +00:00
if ( empty ( $options [ 'target' ]) || $options [ 'target' ] == 'replica' ) {
$options [ 'target' ] = 'default' ;
}
return Database :: getConnection ( $options [ 'target' ]) -> update ( $table , $options );
}
/**
* Returns a new DeleteQuery object for the active database .
*
2015-08-27 19:03:05 +00:00
* @ param string $table
2015-08-18 00:00:26 +00:00
* The table from which to delete .
2015-08-27 19:03:05 +00:00
* @ param array $options
2015-08-18 00:00:26 +00:00
* An array of options to control how the query operates .
*
* @ return \Drupal\Core\Database\Query\Delete
* A new Delete object for this connection .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call delete () on it . For example ,
* $injected_database -> delete ( $table , $options );
2015-08-27 19:03:05 +00:00
*
* @ see \Drupal\Core\Database\Connection :: delete ()
* @ see \Drupal\Core\Database\Connection :: defaultOptions ()
2015-08-18 00:00:26 +00:00
*/
2017-04-13 14:53:35 +00:00
function db_delete ( $table , array $options = []) {
2015-08-18 00:00:26 +00:00
if ( empty ( $options [ 'target' ]) || $options [ 'target' ] == 'replica' ) {
$options [ 'target' ] = 'default' ;
}
return Database :: getConnection ( $options [ 'target' ]) -> delete ( $table , $options );
}
/**
* Returns a new TruncateQuery object for the active database .
*
2015-08-27 19:03:05 +00:00
* @ param string $table
* The table from which to truncate .
* @ param array $options
2015-08-18 00:00:26 +00:00
* An array of options to control how the query operates .
*
* @ return \Drupal\Core\Database\Query\Truncate
* A new Truncate object for this connection .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call truncate () on it . For example ,
* $injected_database -> truncate ( $table , $options );
2015-08-27 19:03:05 +00:00
*
* @ see \Drupal\Core\Database\Connection :: truncate ()
* @ see \Drupal\Core\Database\Connection :: defaultOptions ()
2015-08-18 00:00:26 +00:00
*/
2017-04-13 14:53:35 +00:00
function db_truncate ( $table , array $options = []) {
2015-08-18 00:00:26 +00:00
if ( empty ( $options [ 'target' ]) || $options [ 'target' ] == 'replica' ) {
$options [ 'target' ] = 'default' ;
}
return Database :: getConnection ( $options [ 'target' ]) -> truncate ( $table , $options );
}
/**
* Returns a new SelectQuery object for the active database .
*
2015-08-27 19:03:05 +00:00
* @ param string | \Drupal\Core\Database\Query\SelectInterface $table
* The base table for this query . May be a string or another SelectInterface
* object . If a SelectInterface object is passed , it will be used as a
* subselect .
* @ param string $alias
2015-08-18 00:00:26 +00:00
* ( optional ) The alias for the base table of this query .
2015-08-27 19:03:05 +00:00
* @ param array $options
2015-08-18 00:00:26 +00:00
* ( optional ) An array of options to control how the query operates .
*
* @ return \Drupal\Core\Database\Query\Select
* A new Select object for this connection .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call select () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> select ( $table , $alias , $options );
*
* @ see \Drupal\Core\Database\Connection :: select ()
* @ see \Drupal\Core\Database\Connection :: defaultOptions ()
2015-08-18 00:00:26 +00:00
*/
2017-04-13 14:53:35 +00:00
function db_select ( $table , $alias = NULL , array $options = []) {
2015-08-18 00:00:26 +00:00
if ( empty ( $options [ 'target' ])) {
$options [ 'target' ] = 'default' ;
}
return Database :: getConnection ( $options [ 'target' ]) -> select ( $table , $alias , $options );
}
/**
* Returns a new transaction object for the active database .
*
* @ param string $name
* Optional name of the transaction .
* @ param array $options
* An array of options to control how the transaction operates :
* - target : The database target name .
*
* @ return \Drupal\Core\Database\Transaction
* A new Transaction object for this connection .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call startTransaction () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> startTransaction ( $name );
*
* @ see \Drupal\Core\Database\Connection :: startTransaction ()
* @ see \Drupal\Core\Database\Connection :: defaultOptions ()
2015-08-18 00:00:26 +00:00
*/
2017-04-13 14:53:35 +00:00
function db_transaction ( $name = NULL , array $options = []) {
2015-08-18 00:00:26 +00:00
if ( empty ( $options [ 'target' ])) {
$options [ 'target' ] = 'default' ;
}
return Database :: getConnection ( $options [ 'target' ]) -> startTransaction ( $name );
}
/**
* Sets a new active database .
*
* @ param $key
* The key in the $databases array to set as the default database .
*
2015-08-27 19:03:05 +00:00
* @ return string | null
2015-08-18 00:00:26 +00:00
* The key of the formerly active database .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Use
* \Drupal\Core\Database\Database :: setActiveConnection () .
2015-08-18 00:00:26 +00:00
*/
function db_set_active ( $key = 'default' ) {
2018-11-23 12:29:20 +00:00
@ trigger_error ( 'db_set_active() is deprecated in Drupal 8.0.x and will be removed before Drupal 9.0.0. Use \Drupal\Core\Database\Database::setActiveConnection() instead. See https://www.drupal.org/node/2944084.' , E_USER_DEPRECATED );
2015-08-18 00:00:26 +00:00
return Database :: setActiveConnection ( $key );
}
/**
* Restricts a dynamic table name to safe characters .
*
* Only keeps alphanumeric and underscores .
*
* @ param $table
* The table name to escape .
*
2015-08-27 19:03:05 +00:00
* @ return string
2015-08-18 00:00:26 +00:00
* The escaped table name as a string .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call escapeTable () on it . For example ,
* $injected_database -> escapeTable ( $table );
2015-08-27 19:03:05 +00:00
*
* @ see \Drupal\Core\Database\Connection :: escapeTable ()
2015-08-18 00:00:26 +00:00
*/
function db_escape_table ( $table ) {
return Database :: getConnection () -> escapeTable ( $table );
}
/**
* Restricts a dynamic column or constraint name to safe characters .
*
* Only keeps alphanumeric and underscores .
*
2015-08-27 19:03:05 +00:00
* @ param string $field
2015-08-18 00:00:26 +00:00
* The field name to escape .
*
2015-08-27 19:03:05 +00:00
* @ return string
2015-08-18 00:00:26 +00:00
* The escaped field name as a string .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call escapeTable () on it . For example ,
* $injected_database -> escapeTable ( $table );
2015-08-27 19:03:05 +00:00
*
* @ see \Drupal\Core\Database\Connection :: escapeField ()
2015-08-18 00:00:26 +00:00
*/
function db_escape_field ( $field ) {
return Database :: getConnection () -> escapeField ( $field );
}
/**
* Escapes characters that work as wildcard characters in a LIKE pattern .
*
* The wildcard characters " % " and " _ " as well as backslash are prefixed with
* a backslash . Use this to do a search for a verbatim string without any
* wildcard behavior .
*
* You must use a query builder like db_select () in order to use db_like () on
* all supported database systems . Using db_like () with db_query () or
* db_query_range () is not supported .
*
* For example , the following does a case - insensitive query for all rows whose
* name starts with $prefix :
* @ code
* $result = db_select ( 'person' , 'p' )
* -> fields ( 'p' )
* -> condition ( 'name' , db_like ( $prefix ) . '%' , 'LIKE' )
* -> execute ()
* -> fetchAll ();
* @ endcode
*
* Backslash is defined as escape character for LIKE patterns in
* DatabaseCondition :: mapConditionOperator () .
*
2015-08-27 19:03:05 +00:00
* @ param string $string
2015-08-18 00:00:26 +00:00
* The string to escape .
*
2015-08-27 19:03:05 +00:00
* @ return string
2015-08-18 00:00:26 +00:00
* The escaped string .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call escapeLike () on it . For example ,
* $injected_database -> escapeLike ( $string );
2015-08-27 19:03:05 +00:00
*
* @ see \Drupal\Core\Database\Connection :: escapeLike ()
2015-08-18 00:00:26 +00:00
*/
function db_like ( $string ) {
return Database :: getConnection () -> escapeLike ( $string );
}
/**
* Retrieves the name of the currently active database driver .
*
2015-08-27 19:03:05 +00:00
* @ return string
2015-08-18 00:00:26 +00:00
* The name of the currently active database driver .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call driver () on it . For example , $injected_database -> driver ( $string );
2015-08-27 19:03:05 +00:00
*
* @ see \Drupal\Core\Database\Connection :: driver ()
2015-08-18 00:00:26 +00:00
*/
function db_driver () {
return Database :: getConnection () -> driver ();
}
/**
* Closes the active database connection .
*
2015-08-27 19:03:05 +00:00
* @ param array $options
2015-08-18 00:00:26 +00:00
* An array of options to control which connection is closed . Only the target
* key has any meaning in this case .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Use
* \Drupal\Core\Database\Database :: closeConnection ( $target ) .
*
* @ see \Drupal\Core\Database\Database :: closeConnection ()
2015-08-18 00:00:26 +00:00
*/
2017-04-13 14:53:35 +00:00
function db_close ( array $options = []) {
2015-08-18 00:00:26 +00:00
if ( empty ( $options [ 'target' ])) {
$options [ 'target' ] = NULL ;
}
Database :: closeConnection ( $options [ 'target' ]);
}
/**
* Retrieves a unique id .
*
* Use this function if for some reason you can ' t use a serial field . Using a
* serial field is preferred , and InsertQuery :: execute () returns the value of
* the last ID inserted .
*
2015-08-27 19:03:05 +00:00
* @ param int $existing_id
2015-08-18 00:00:26 +00:00
* After a database import , it might be that the sequences table is behind , so
* by passing in a minimum ID , it can be assured that we never issue the same
* ID .
*
2015-08-27 19:03:05 +00:00
* @ return int
2015-08-18 00:00:26 +00:00
* An integer number larger than any number returned before for this sequence .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container and
2016-01-07 00:31:26 +00:00
* call nextId () on it . For example , $injected_database -> nextId ( $existing_id );
2015-08-27 19:03:05 +00:00
*
* @ see \Drupal\Core\Database\Connection :: nextId ()
2015-08-18 00:00:26 +00:00
*/
function db_next_id ( $existing_id = 0 ) {
return Database :: getConnection () -> nextId ( $existing_id );
}
/**
* Returns a new DatabaseCondition , set to " OR " all conditions together .
*
* @ return \Drupal\Core\Database\Query\Condition
* A new Condition object , set to " OR " all conditions together .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Create
* a \Drupal\Core\Database\Query\Condition object , specifying an OR
* conjunction : new Condition ( 'OR' );
*
* @ see \Drupal\Core\Database\Query\Condition
2015-08-18 00:00:26 +00:00
*/
function db_or () {
return new Condition ( 'OR' );
}
/**
* Returns a new DatabaseCondition , set to " AND " all conditions together .
*
* @ return \Drupal\Core\Database\Query\Condition
* A new Condition object , set to " AND " all conditions together .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Create
* a \Drupal\Core\Database\Query\Condition object , specifying an AND
* conjunction : new Condition ( 'AND' );
*
* @ see \Drupal\Core\Database\Query\Condition
2015-08-18 00:00:26 +00:00
*/
function db_and () {
return new Condition ( 'AND' );
}
/**
* Returns a new DatabaseCondition , set to " XOR " all conditions together .
*
* @ return \Drupal\Core\Database\Query\Condition
* A new Condition object , set to " XOR " all conditions together .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Create
* a \Drupal\Core\Database\Query\Condition object , specifying an XOR
* conjunction : new Condition ( 'XOR' );
*
* @ see \Drupal\Core\Database\Query\Condition
2015-08-18 00:00:26 +00:00
*/
function db_xor () {
return new Condition ( 'XOR' );
}
/**
* Returns a new DatabaseCondition , set to the specified conjunction .
*
* Internal API function call . The db_and (), db_or (), and db_xor ()
* functions are preferred .
*
2015-08-27 19:03:05 +00:00
* @ param string $conjunction
2015-08-18 00:00:26 +00:00
* The conjunction to use for query conditions ( AND , OR or XOR ) .
*
* @ return \Drupal\Core\Database\Query\Condition
* A new Condition object , set to the specified conjunction .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Create
* a \Drupal\Core\Database\Query\Condition object , specifying the desired
* conjunction : new Condition ( $conjunctin );
*
* @ see \Drupal\Core\Database\Query\Condition
2015-08-18 00:00:26 +00:00
*/
function db_condition ( $conjunction ) {
return new Condition ( $conjunction );
}
/**
* @ } End of " addtogroup database " .
*/
/**
* @ addtogroup schemaapi
* @ {
*/
/**
* Creates a new table from a Drupal table definition .
*
2015-08-27 19:03:05 +00:00
* @ param string $name
2015-08-18 00:00:26 +00:00
* The name of the table to create .
2015-08-27 19:03:05 +00:00
* @ param array $table
2015-08-18 00:00:26 +00:00
* A Schema API table definition array .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call createTable () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> createTable ( $name , $table );
*
* @ see \Drupal\Core\Database\Schema :: createTable ()
2015-08-18 00:00:26 +00:00
*/
function db_create_table ( $name , $table ) {
return Database :: getConnection () -> schema () -> createTable ( $name , $table );
}
/**
* Returns an array of field names from an array of key / index column specifiers .
*
* This is usually an identity function but if a key / index uses a column prefix
* specification , this function extracts just the name .
*
2015-08-27 19:03:05 +00:00
* @ param array $fields
2015-08-18 00:00:26 +00:00
* An array of key / index column specifiers .
*
2015-08-27 19:03:05 +00:00
* @ return array
2015-08-18 00:00:26 +00:00
* An array of field names .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call fieldNames () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> fieldNames ( $fields );
*
* @ see \Drupal\Core\Database\Schema :: fieldNames ()
2015-08-18 00:00:26 +00:00
*/
function db_field_names ( $fields ) {
return Database :: getConnection () -> schema () -> fieldNames ( $fields );
}
/**
* Checks if an index exists in the given table .
*
2015-08-27 19:03:05 +00:00
* @ param string $table
2015-08-18 00:00:26 +00:00
* The name of the table in drupal ( no prefixing ) .
2015-08-27 19:03:05 +00:00
* @ param string $name
2015-08-18 00:00:26 +00:00
* The name of the index in drupal ( no prefixing ) .
*
2015-08-27 19:03:05 +00:00
* @ return bool
2015-08-18 00:00:26 +00:00
* TRUE if the given index exists , otherwise FALSE .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call indexExists () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> indexExists ( $table , $name );
*
* @ see \Drupal\Core\Database\Schema :: indexExists ()
2015-08-18 00:00:26 +00:00
*/
function db_index_exists ( $table , $name ) {
return Database :: getConnection () -> schema () -> indexExists ( $table , $name );
}
/**
* Checks if a table exists .
*
2015-08-27 19:03:05 +00:00
* @ param string $table
2015-08-18 00:00:26 +00:00
* The name of the table in drupal ( no prefixing ) .
*
2015-08-27 19:03:05 +00:00
* @ return bool
2015-08-18 00:00:26 +00:00
* TRUE if the given table exists , otherwise FALSE .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call tableExists () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> tableExists ( $table );
*
* @ see \Drupal\Core\Database\Schema :: tableExists ()
2015-08-18 00:00:26 +00:00
*/
function db_table_exists ( $table ) {
2018-11-23 12:29:20 +00:00
@ trigger_error (
'db_table_exists() is deprecated in Drupal 8.0.x and will be removed before Drupal 9.0.0. Use $injected_database->schema()->tableExists($table) instead. See https://www.drupal.org/node/2947929.' ,
E_USER_DEPRECATED
);
2015-08-18 00:00:26 +00:00
return Database :: getConnection () -> schema () -> tableExists ( $table );
}
/**
* Checks if a column exists in the given table .
*
* @ param $table
* The name of the table in drupal ( no prefixing ) .
* @ param $field
* The name of the field .
*
2015-08-27 19:03:05 +00:00
* @ return bool
2015-08-18 00:00:26 +00:00
* TRUE if the given column exists , otherwise FALSE .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call fieldExists () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> fieldExists ( $table , $field );
*
* @ see \Drupal\Core\Database\Schema :: fieldExists ()
2015-08-18 00:00:26 +00:00
*/
function db_field_exists ( $table , $field ) {
return Database :: getConnection () -> schema () -> fieldExists ( $table , $field );
}
/**
* Finds all tables that are like the specified base table name .
*
2015-08-27 19:03:05 +00:00
* @ param string $table_expression
2015-08-18 00:00:26 +00:00
* An SQL expression , for example " simpletest% " ( without the quotes ) .
*
2015-08-27 19:03:05 +00:00
* @ return array
2015-08-18 00:00:26 +00:00
* Array , both the keys and the values are the matching tables .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call findTables () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> findTables ( $table_expression );
*
* @ see \Drupal\Core\Database\Schema :: findTables ()
2015-08-18 00:00:26 +00:00
*/
function db_find_tables ( $table_expression ) {
return Database :: getConnection () -> schema () -> findTables ( $table_expression );
}
/**
* Renames a table .
*
* @ param $table
* The current name of the table to be renamed .
* @ param $new_name
* The new name for the table .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call renameTable () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> renameTable ( $table , $new_name );
*
* @ see \Drupal\Core\Database\Schema :: renameTable ()
2015-08-18 00:00:26 +00:00
*/
function db_rename_table ( $table , $new_name ) {
return Database :: getConnection () -> schema () -> renameTable ( $table , $new_name );
}
/**
* Drops a table .
*
* @ param $table
* The table to be dropped .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call dropTable () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> dropTable ( $table );
*
* @ see \Drupal\Core\Database\Schema :: dropTable ()
2015-08-18 00:00:26 +00:00
*/
function db_drop_table ( $table ) {
2018-11-23 12:29:20 +00:00
@ trigger_error ( 'db_drop_table() is deprecated in Drupal 8.0.x and will be removed before Drupal 9.0.0. Use \Drupal\Core\Database\Database::getConnection()->schema()->dropTable() instead. See https://www.drupal.org/node/2987737' , E_USER_DEPRECATED );
2015-08-18 00:00:26 +00:00
return Database :: getConnection () -> schema () -> dropTable ( $table );
}
/**
* Adds a new field to a table .
*
* @ param $table
* Name of the table to be altered .
* @ param $field
* Name of the field to be added .
2015-08-27 19:03:05 +00:00
* @ param array $spec
2015-08-18 00:00:26 +00:00
* The field specification array , as taken from a schema definition . The
* specification may also contain the key 'initial' ; the newly - created field
* will be set to the value of the key in all rows . This is most useful for
* creating NOT NULL columns with no default value in existing tables .
2015-08-27 19:03:05 +00:00
* @ param array $keys_new
2015-08-18 00:00:26 +00:00
* ( optional ) Keys and indexes specification to be created on the table along
* with adding the field . The format is the same as a table specification , but
* without the 'fields' element . If you are adding a type 'serial' field , you
* MUST specify at least one key or index including it in this array . See
* db_change_field () for more explanation why .
*
2015-08-27 19:03:05 +00:00
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call addField () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> addField ( $table , $field , $spec , $keys_new );
*
* @ see \Drupal\Core\Database\Schema :: addField ()
2015-08-18 00:00:26 +00:00
* @ see db_change_field ()
*/
2017-04-13 14:53:35 +00:00
function db_add_field ( $table , $field , $spec , $keys_new = []) {
2015-08-18 00:00:26 +00:00
return Database :: getConnection () -> schema () -> addField ( $table , $field , $spec , $keys_new );
}
/**
* Drops a field .
*
* @ param $table
* The table to be altered .
* @ param $field
* The field to be dropped .
2015-08-27 19:03:05 +00:00
*
* @ return bool
* TRUE if the field was successfully dropped , FALSE if there was no field by
* that name to begin with .
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call dropField () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> dropField ( $table , $field );
*
* @ see \Drupal\Core\Database\Schema :: dropField ()
2015-08-18 00:00:26 +00:00
*/
function db_drop_field ( $table , $field ) {
return Database :: getConnection () -> schema () -> dropField ( $table , $field );
}
/**
* Sets the default value for a field .
*
* @ param $table
* The table to be altered .
* @ param $field
* The field to be altered .
* @ param $default
* Default value to be set . NULL for 'default NULL' .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call fieldSetDefault () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> fieldSetDefault ( $table , $field , $default );
*
* @ see \Drupal\Core\Database\Schema :: fieldSetDefault ()
2015-08-18 00:00:26 +00:00
*/
function db_field_set_default ( $table , $field , $default ) {
return Database :: getConnection () -> schema () -> fieldSetDefault ( $table , $field , $default );
}
/**
* Sets a field to have no default value .
*
* @ param $table
* The table to be altered .
* @ param $field
* The field to be altered .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call fieldSetNoDefault () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> fieldSetNoDefault ( $table , $field );
*
* @ see \Drupal\Core\Database\Schema :: fieldSetNoDefault ()
2015-08-18 00:00:26 +00:00
*/
function db_field_set_no_default ( $table , $field ) {
return Database :: getConnection () -> schema () -> fieldSetNoDefault ( $table , $field );
}
/**
* Adds a primary key to a database table .
*
* @ param $table
* Name of the table to be altered .
* @ param $fields
* Array of fields for the primary key .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call addPrimaryKey () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> addPrimaryKey ( $table , $fields );
*
* @ see \Drupal\Core\Database\Schema :: addPrimaryKey ()
2015-08-18 00:00:26 +00:00
*/
function db_add_primary_key ( $table , $fields ) {
return Database :: getConnection () -> schema () -> addPrimaryKey ( $table , $fields );
}
/**
* Drops the primary key of a database table .
*
* @ param $table
* Name of the table to be altered .
2015-08-27 19:03:05 +00:00
*
* @ return bool
* TRUE if the primary key was successfully dropped , FALSE if there was no
* primary key on this table to begin with .
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call dropPrimaryKey () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> dropPrimaryKey ( $table );
*
* @ see \Drupal\Core\Database\Schema :: dropPrimaryKey ()
2015-08-18 00:00:26 +00:00
*/
function db_drop_primary_key ( $table ) {
return Database :: getConnection () -> schema () -> dropPrimaryKey ( $table );
}
/**
* Adds a unique key .
*
* @ param $table
* The table to be altered .
* @ param $name
* The name of the key .
2015-08-27 19:03:05 +00:00
* @ param array $fields
2015-08-18 00:00:26 +00:00
* An array of field names .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call addUniqueKey () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> addUniqueKey ( $table , $name , $fields );
*
* @ see \Drupal\Core\Database\Schema :: addUniqueKey ()
2015-08-18 00:00:26 +00:00
*/
function db_add_unique_key ( $table , $name , $fields ) {
return Database :: getConnection () -> schema () -> addUniqueKey ( $table , $name , $fields );
}
/**
* Drops a unique key .
*
* @ param $table
* The table to be altered .
* @ param $name
* The name of the key .
2015-08-27 19:03:05 +00:00
*
* @ return bool
* TRUE if the key was successfully dropped , FALSE if there was no key by
* that name to begin with .
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call dropUniqueKey () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> dropUniqueKey ( $table , $name );
*
* @ see \Drupal\Core\Database\Schema :: dropUniqueKey ()
2015-08-18 00:00:26 +00:00
*/
function db_drop_unique_key ( $table , $name ) {
return Database :: getConnection () -> schema () -> dropUniqueKey ( $table , $name );
}
/**
* Adds an index .
*
* @ param $table
* The table to be altered .
* @ param $name
* The name of the index .
2015-08-27 19:03:05 +00:00
* @ param array $fields
2015-08-18 00:00:26 +00:00
* An array of field names .
2015-09-04 20:20:09 +00:00
* @ param array $spec
* The table specification of the table to be altered , as taken from a schema
* definition . See \Drupal\Core\Database\Schema :: addIndex () for how to obtain
* this specification .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call addIndex () on it . For example ,
2015-09-04 20:20:09 +00:00
* $injected_database -> schema () -> addIndex ( $table , $name , $fields , $spec );
2015-08-27 19:03:05 +00:00
*
2015-09-04 20:20:09 +00:00
* @ see hook_schema ()
* @ see schemaapi
2015-08-27 19:03:05 +00:00
* @ see \Drupal\Core\Database\Schema :: addIndex ()
2015-08-18 00:00:26 +00:00
*/
2015-09-04 20:20:09 +00:00
function db_add_index ( $table , $name , $fields , array $spec ) {
return Database :: getConnection () -> schema () -> addIndex ( $table , $name , $fields , $spec );
2015-08-18 00:00:26 +00:00
}
/**
* Drops an index .
*
* @ param $table
* The table to be altered .
* @ param $name
* The name of the index .
2015-08-27 19:03:05 +00:00
*
* @ return bool
* TRUE if the index was successfully dropped , FALSE if there was no index
* by that name to begin with .
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call dropIndex () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> dropIndex ( $table , $name );
*
* @ see \Drupal\Core\Database\Schema :: dropIndex ()
2015-08-18 00:00:26 +00:00
*/
function db_drop_index ( $table , $name ) {
return Database :: getConnection () -> schema () -> dropIndex ( $table , $name );
}
/**
* Changes a field definition .
*
* IMPORTANT NOTE : To maintain database portability , you have to explicitly
* recreate all indices and primary keys that are using the changed field .
*
* That means that you have to drop all affected keys and indexes with
* db_drop_ { primary_key , unique_key , index }() before calling db_change_field () .
* To recreate the keys and indices , pass the key definitions as the optional
* $keys_new argument directly to db_change_field () .
*
* For example , suppose you have :
* @ code
* $schema [ 'foo' ] = array (
* 'fields' => array (
* 'bar' => array ( 'type' => 'int' , 'not null' => TRUE )
* ),
* 'primary key' => array ( 'bar' )
* );
* @ endcode
* and you want to change foo . bar to be type serial , leaving it as the primary
* key . The correct sequence is :
* @ code
* db_drop_primary_key ( 'foo' );
* db_change_field ( 'foo' , 'bar' , 'bar' ,
* array ( 'type' => 'serial' , 'not null' => TRUE ),
* array ( 'primary key' => array ( 'bar' )));
* @ endcode
*
* The reasons for this are due to the different database engines :
*
* On PostgreSQL , changing a field definition involves adding a new field and
* dropping an old one which causes any indices , primary keys and sequences
* ( from serial - type fields ) that use the changed field to be dropped .
*
* On MySQL , all type 'serial' fields must be part of at least one key or index
* as soon as they are created . You cannot use
* db_add_ { primary_key , unique_key , index }() for this purpose because the ALTER
* TABLE command will fail to add the column without a key or index
* specification . The solution is to use the optional $keys_new argument to
* create the key or index at the same time as field .
*
* You could use db_add_ { primary_key , unique_key , index }() in all cases unless you
* are converting a field to be type serial . You can use the $keys_new argument
* in all cases .
*
* @ param $table
* Name of the table .
* @ param $field
* Name of the field to change .
* @ param $field_new
* New name for the field ( set to the same as $field if you don ' t want to
* change the name ) .
* @ param $spec
* The field specification for the new field .
2015-08-27 19:03:05 +00:00
* @ param array $keys_new
2015-08-18 00:00:26 +00:00
* ( optional ) Keys and indexes specification to be created on the table along
* with changing the field . The format is the same as a table specification
* but without the 'fields' element .
2015-08-27 19:03:05 +00:00
*
* @ deprecated as of Drupal 8.0 . x , will be removed in Drupal 9.0 . 0. Instead , get
* a database connection injected into your service from the container , get
2016-01-07 00:31:26 +00:00
* its schema driver , and call changeField () on it . For example ,
2015-08-27 19:03:05 +00:00
* $injected_database -> schema () -> changeField ( $table , $field , $field_new , $spec , $keys_new );
*
* @ see \Drupal\Core\Database\Schema :: changeField ()
2015-08-18 00:00:26 +00:00
*/
2017-04-13 14:53:35 +00:00
function db_change_field ( $table , $field , $field_new , $spec , $keys_new = []) {
2015-08-18 00:00:26 +00:00
return Database :: getConnection () -> schema () -> changeField ( $table , $field , $field_new , $spec , $keys_new );
}
/**
* @ } End of " addtogroup schemaapi " .
*/
/**
* Sets a session variable specifying the lag time for ignoring a replica
* server ( A replica server is traditionally referred to as
* a " slave " in database server documentation ) .
* @ see https :// www . drupal . org / node / 2275877
*/
function db_ignore_replica () {
$connection_info = Database :: getConnectionInfo ();
// Only set ignore_replica_server if there are replica servers being used,
// which is assumed if there are more than one.
if ( count ( $connection_info ) > 1 ) {
// Five minutes is long enough to allow the replica to break and resume
// interrupted replication without causing problems on the Drupal site from
// the old data.
$duration = Settings :: get ( 'maximum_replication_lag' , 300 );
// Set session variable with amount of time to delay before using replica.
$_SESSION [ 'ignore_replica_server' ] = REQUEST_TIME + $duration ;
}
}