2012-03-14 15:29:10 +00:00
< ? php
/**
* @ file
* Schema API handling functions .
*/
2019-05-07 10:00:58 +00:00
use Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema ;
2012-03-14 15:29:10 +00:00
/**
2012-05-17 12:58:49 +00:00
* @ addtogroup schemaapi
2012-03-14 15:29:10 +00:00
* @ {
*/
2012-10-09 20:32:40 +00:00
/**
* Indicates that a module has not been installed yet .
*/
const SCHEMA_UNINSTALLED = - 1 ;
2012-03-14 15:29:10 +00:00
/**
* Returns an array of available schema versions for a module .
*
* @ param string $module
* A module name .
*
* @ return array | bool
2013-01-10 23:50:55 +00:00
* If the module has updates , an array of available updates sorted by
* version . Otherwise , FALSE .
2012-03-14 15:29:10 +00:00
*/
function drupal_get_schema_versions ( $module ) {
$updates = & drupal_static ( __FUNCTION__ , NULL );
if ( ! isset ( $updates [ $module ])) {
2017-03-04 01:20:24 +00:00
$updates = [];
2013-09-16 03:58:06 +00:00
foreach ( \Drupal :: moduleHandler () -> getModuleList () as $loaded_module => $filename ) {
2017-03-04 01:20:24 +00:00
$updates [ $loaded_module ] = [];
2012-03-14 15:29:10 +00:00
}
// Prepare regular expression to match all possible defined hook_update_N().
2013-06-09 14:15:21 +00:00
$regexp = '/^(?<module>.+)_update_(?<version>\d+)$/' ;
2012-03-14 15:29:10 +00:00
$functions = get_defined_functions ();
// Narrow this down to functions ending with an integer, since all
// hook_update_N() functions end this way, and there are other
// possible functions which match '_update_'. We use preg_grep() here
// instead of foreaching through all defined functions, since the loop
// through all PHP functions can take significant page execution time
// and this function is called on every administrative page via
// system_requirements().
foreach ( preg_grep ( '/_\d+$/' , $functions [ 'user' ]) as $function ) {
// If this function is a module update function, add it to the list of
// module updates.
if ( preg_match ( $regexp , $function , $matches )) {
$updates [ $matches [ 'module' ]][] = $matches [ 'version' ];
}
}
// Ensure that updates are applied in numerical order.
foreach ( $updates as & $module_updates ) {
sort ( $module_updates , SORT_NUMERIC );
}
}
return empty ( $updates [ $module ]) ? FALSE : $updates [ $module ];
}
/**
* Returns the currently installed schema version for a module .
*
* @ param string $module
* A module name .
* @ param bool $reset
2012-10-09 20:32:40 +00:00
* Set to TRUE after installing or uninstalling an extension .
2012-03-14 15:29:10 +00:00
* @ param bool $array
* Set to TRUE if you want to get information about all modules in the
* system .
*
* @ return string | int
* The currently installed schema version , or SCHEMA_UNINSTALLED if the
* module is not installed .
*/
function drupal_get_installed_schema_version ( $module , $reset = FALSE , $array = FALSE ) {
2017-03-04 01:20:24 +00:00
$versions = & drupal_static ( __FUNCTION__ , []);
2012-03-14 15:29:10 +00:00
if ( $reset ) {
2017-03-04 01:20:24 +00:00
$versions = [];
2012-03-14 15:29:10 +00:00
}
if ( ! $versions ) {
2013-09-16 03:58:06 +00:00
if ( ! $versions = \Drupal :: keyValue ( 'system.schema' ) -> getAll ()) {
2017-03-04 01:20:24 +00:00
$versions = [];
2012-03-14 15:29:10 +00:00
}
}
if ( $array ) {
return $versions ;
}
else {
return isset ( $versions [ $module ]) ? $versions [ $module ] : SCHEMA_UNINSTALLED ;
}
}
/**
* Updates the installed version information for a module .
*
* @ param string $module
* A module name .
* @ param string $version
* The new schema version .
*/
function drupal_set_installed_schema_version ( $module , $version ) {
2013-09-16 03:58:06 +00:00
\Drupal :: keyValue ( 'system.schema' ) -> set ( $module , $version );
2012-03-14 15:29:10 +00:00
// Reset the static cache of module schema versions.
drupal_get_installed_schema_version ( NULL , TRUE );
}
/**
* Creates all tables defined in a module ' s hook_schema () .
*
* @ param string $module
* The module for which the tables will be created .
*/
function drupal_install_schema ( $module ) {
2015-06-13 20:22:27 +00:00
$schema = drupal_get_module_schema ( $module );
2012-03-14 15:29:10 +00:00
_drupal_schema_initialize ( $schema , $module , FALSE );
foreach ( $schema as $name => $table ) {
2017-04-18 12:14:45 +00:00
\Drupal :: database () -> schema () -> createTable ( $name , $table );
2012-03-14 15:29:10 +00:00
}
}
/**
* Removes all tables defined in a module ' s hook_schema () .
*
* @ param string $module
* The module for which the tables will be removed .
*/
function drupal_uninstall_schema ( $module ) {
Issue #2848479 by voleger, yogeshmpawar, marvin_B8, gaurav.kapoor, hgunicamp, mondrake, daffie, alexpott, xjm, cilefen: Replace all calls to db_drop_table, which is deprecated
2018-07-24 13:57:22 +00:00
$tables = drupal_get_module_schema ( $module );
_drupal_schema_initialize ( $tables , $module , FALSE );
$schema = \Drupal :: database () -> schema ();
foreach ( $tables as $table ) {
Issue #2848817 by voleger, andypost, hgunicamp, JacobSanford, techtud, alexpott, vidhatanand, Sharique, JayKandari, kiamlaluno, cilefen, borisson_: Replace all calls to db_table_exists, which is deprecated
2018-08-06 09:41:05 +00:00
if ( $schema -> tableExists ( $table [ 'name' ])) {
Issue #2848479 by voleger, yogeshmpawar, marvin_B8, gaurav.kapoor, hgunicamp, mondrake, daffie, alexpott, xjm, cilefen: Replace all calls to db_drop_table, which is deprecated
2018-07-24 13:57:22 +00:00
$schema -> dropTable ( $table [ 'name' ]);
2012-03-14 15:29:10 +00:00
}
}
}
/**
2015-06-13 20:22:27 +00:00
* Returns a module ' s schema .
2012-03-14 15:29:10 +00:00
*
* This function can be used to retrieve a schema specification in
* hook_schema (), so it allows you to derive your tables from existing
* specifications .
*
* @ param string $module
* The module to which the table belongs .
* @ param string $table
* The name of the table . If not given , the module ' s complete schema
* is returned .
*/
2015-06-13 20:22:27 +00:00
function drupal_get_module_schema ( $module , $table = NULL ) {
2012-03-14 15:29:10 +00:00
// Load the .install file to get hook_schema.
module_load_install ( $module );
2014-02-15 10:06:58 +00:00
$schema = \Drupal :: moduleHandler () -> invoke ( $module , 'schema' );
2012-03-14 15:29:10 +00:00
2012-11-19 11:39:30 +00:00
if ( isset ( $table )) {
if ( isset ( $schema [ $table ])) {
return $schema [ $table ];
}
2017-03-04 01:20:24 +00:00
return [];
2012-03-14 15:29:10 +00:00
}
elseif ( ! empty ( $schema )) {
return $schema ;
}
2017-03-04 01:20:24 +00:00
return [];
2012-03-14 15:29:10 +00:00
}
/**
* Fills in required default values for table definitions from hook_schema () .
*
* @ param array $schema
* The schema definition array as it was returned by the module ' s
* hook_schema () .
* @ param string $module
* The module for which hook_schema () was invoked .
* @ param bool $remove_descriptions
* ( optional ) Whether to additionally remove 'description' keys of all tables
* and fields to improve performance of serialize () and unserialize () .
* Defaults to TRUE .
*/
function _drupal_schema_initialize ( & $schema , $module , $remove_descriptions = TRUE ) {
// Set the name and module key for all tables.
foreach ( $schema as $name => & $table ) {
if ( empty ( $table [ 'module' ])) {
$table [ 'module' ] = $module ;
}
if ( ! isset ( $table [ 'name' ])) {
$table [ 'name' ] = $name ;
}
if ( $remove_descriptions ) {
unset ( $table [ 'description' ]);
foreach ( $table [ 'fields' ] as & $field ) {
unset ( $field [ 'description' ]);
}
}
}
}
2013-05-26 20:18:10 +00:00
/**
2018-05-15 08:25:04 +00:00
* Typecasts values to proper data types .
2013-05-26 20:18:10 +00:00
*
* MySQL PDO silently casts , e . g . FALSE and '' to 0 , when inserting the value
* into an integer column , but PostgreSQL PDO does not . Look up the schema
* information and use that to correctly typecast the value .
*
* @ param array $info
* An array describing the schema field info .
* @ param mixed $value
* The value to be converted .
*
* @ return mixed
* The converted value .
2019-05-07 10:00:58 +00:00
*
2019-11-14 09:08:15 +00:00
* @ deprecated in drupal : 8.8 . 0 and is removed from drupal : 9.0 . 0. Use
2019-05-07 10:00:58 +00:00
* \Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema :: castValue () instead .
*
* @ see https :// www . drupal . org / node / 3051983
2013-05-26 20:18:10 +00:00
*/
function drupal_schema_get_field_value ( array $info , $value ) {
2019-05-07 10:00:58 +00:00
@ trigger_error ( 'drupal_schema_get_field_value() is deprecated in drupal:8.8.0. It will be removed from drupal:9.0.0. Use \Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema::castValue($info, $value) instead. See https://www.drupal.org/node/3051983' , E_USER_DEPRECATED );
return SqlContentEntityStorageSchema :: castValue ( $info , $value );
2013-05-26 20:18:10 +00:00
}
2012-03-14 15:29:10 +00:00
/**
2012-05-17 12:58:49 +00:00
* @ } End of " addtogroup schemaapi " .
2012-03-14 15:29:10 +00:00
*/