function drupal_get_complete_schema

Gets the whole database schema.

The returned schema will include any modifications made by any module that implements hook_schema_alter().

Parameters

bool $rebuild: If TRUE, the schema will be rebuilt instead of retrieved from the cache.

Related topics

2 calls to drupal_get_complete_schema()
drupal_get_schema in drupal/core/includes/schema.inc
Gets the schema definition of a table, or the whole database schema.
SchemaCache::resolveCacheMiss in drupal/core/lib/Drupal/Core/Utility/SchemaCache.php
Implements CacheArray::resolveCacheMiss().

File

drupal/core/includes/schema.inc, line 68
Schema API handling functions.

Code

function drupal_get_complete_schema($rebuild = FALSE) {
  static $schema;
  if (!isset($schema) || $rebuild) {

    // Try to load the schema from cache.
    if (!$rebuild && ($cached = cache()
      ->get('schema'))) {
      $schema = $cached->data;
    }
    else {
      $schema = array();

      // Load the .install files to get hook_schema.
      // On some databases this function may be called before bootstrap has
      // been completed, so we force the functions we need to load just in case.
      if (function_exists('module_load_all_includes')) {

        // This function can be called very early in the bootstrap process, so
        // we force the system_list() static cache to be refreshed to ensure
        // that it contains the complete list of modules before we go on to call
        // module_load_all_includes().
        system_list_reset();
        module_load_all_includes('install');
      }
      require_once DRUPAL_ROOT . '/core/includes/common.inc';

      // Invoke hook_schema for all modules.
      foreach (module_implements('schema') as $module) {

        // Cast the result of hook_schema() to an array, as a NULL return value
        // would cause array_merge() to set the $schema variable to NULL as well.
        // That would break modules which use $schema further down the line.
        $current = (array) module_invoke($module, 'schema');

        // Set 'module' and 'name' keys for each table, and remove descriptions,
        // as they needlessly slow down cache()->get() for every single request.
        _drupal_schema_initialize($current, $module);
        $schema = array_merge($schema, $current);
      }
      drupal_alter('schema', $schema);
      if ($rebuild) {
        cache()
          ->deleteTags(array(
          'schema' => TRUE,
        ));
      }

      // If the schema is empty, avoid saving it: some database engines require
      // the schema to perform queries, and this could lead to infinite loops.
      if (!empty($schema) && drupal_get_bootstrap_phase() == DRUPAL_BOOTSTRAP_FULL) {
        cache()
          ->set('schema', $schema, CacheBackendInterface::CACHE_PERMANENT, array(
          'schema' => TRUE,
        ));
      }
    }
  }
  return $schema;
}