You are here

class SchemaDatabaseSchema_mysql in Schema 7

@file Schema module enhancements to DatabaseSchema_mysql

Hierarchy

Expanded class hierarchy of SchemaDatabaseSchema_mysql

File

engines/mysql.inc, line 8
Schema module enhancements to DatabaseSchema_mysql

View source
class SchemaDatabaseSchema_mysql extends DatabaseSchema_mysql {

  /**
   * Retrieve generated SQL to create a new table from a Drupal schema definition.
   *
   * @param $name
   *   The name of the table to create.
   * @param $table
   *   A Schema API table definition array.
   * @return
   *   An array of SQL statements to create the table.
   */
  public function getCreateTableSql($name, $table) {
    return parent::createTableSql($name, $table);
  }
  public function schema_type_map() {
    static $map;
    if (!isset($map)) {
      $map = array_flip(array_map('strtolower', $this
        ->getFieldTypeMap()));
    }
    return $map;
  }

  /**
   * Overrides DatabaseSchema_mysql::getPrefixInfo().
   *
   * @todo Remove when https://drupal.org/node/2223073 is fixed in core.
   */
  protected function getPrefixInfo($table = 'default', $add_prefix = TRUE) {
    $info = array(
      'prefix' => $this->connection
        ->tablePrefix($table),
    );
    if ($add_prefix) {
      $table = $info['prefix'] . $table;
    }
    if (($pos = strpos($table, '.')) !== FALSE) {
      $info['database'] = substr($table, 0, $pos);
      $info['table'] = substr($table, ++$pos);
    }
    else {
      $db_info = $this->connection
        ->getConnectionOptions();
      $info['database'] = $db_info['database'];
      $info['table'] = $table;
    }
    return $info;
  }

  /**
   * Overrides DatabaseSchema_mysql::getFieldTypeMap().
   */
  public function getFieldTypeMap() {
    $map =& drupal_static('SchemaDatabaseSchema_mysql::getFieldTypeMap');
    if (!isset($map)) {
      $map = parent::getFieldTypeMap();
      drupal_alter('schema_field_type_map', $map, $this, $this->connection);
    }
    return $map;
  }

  /**
   * Retrieves the schema for the database's actual structure.
   *
   * @param $connection
   *  (optional) The name of a database connection. If omitted, 'default' is
   *  used.
   * @param $table_name
   *  (optional) The name of a table to limit the returned data to. If omitted,
   *  data on all tables is returned.
   *
   * @return
   *  An array of data about the database, in the same format as used by the
   *  Schema API.
   */
  public function inspect($connection = NULL, $table_name = NULL) {

    // Support the deprecated connection parameter.
    if (isset($connection) && $connection != $this->connection
      ->getKey()) {
      $this->connection = Database::getConnection('default', $connection);
    }

    // Get the current database name
    $info = $this->connection
      ->getConnectionOptions();
    $database = $info['database'];

    // Apply table prefixes.
    if (isset($table_name)) {
      $table_info = $this
        ->getPrefixInfo($table_name);
      if (!empty($table_info['database']) && $database != $table_info['database']) {
        $database = $table_info['database'];
      }
      $table_name = $table_info['table'];
    }
    $tables = array();
    $args = array(
      ':database' => $database,
    );
    $sql = 'SELECT table_name, table_comment
            FROM information_schema.tables
            WHERE table_schema=:database ';
    if (isset($table_name)) {
      $sql .= 'AND table_name = :table ';
      $args[':table'] = $table_name;
    }
    $res = $this->connection
      ->query($sql, $args);
    foreach ($res as $r) {
      $tables[$r->table_name]['description'] = $r->table_comment;
    }
    $sql = 'SELECT table_name, column_type, column_name, column_default,
                   extra, is_nullable, numeric_scale, column_comment
            FROM information_schema.columns
            WHERE table_schema=:database ';
    if (isset($table_name)) {
      $sql .= 'AND table_name = :table ';
    }
    $sql .= 'ORDER BY table_name, ordinal_position';
    $res = $this->connection
      ->query($sql, $args);
    foreach ($res as $r) {
      $r->new_table_name = schema_unprefix_table($r->table_name, $this->connection);
      $numeric = !is_null($r->numeric_scale);
      $col = array();
      $col['type'] = $r->column_type;
      if (preg_match('@([a-z]+)(?:\\((\\d+)(?:,(\\d+))?\\))?\\s*(unsigned)?@', $col['type'], $matches)) {
        list($col['type'], $col['size']) = schema_schema_type($matches[1], $r->table_name, $r->column_name, 'mysql');
        if (isset($matches[2])) {
          if ($col['type'] == 'numeric' || $col['type'] == 'float' || $col['type'] == 'double') {
            $col['precision'] = $matches[2];
            $col['scale'] = $matches[3];
          }
          elseif (!$numeric) {
            $col['length'] = $matches[2];
          }
        }
        if (isset($matches[4])) {
          $col['unsigned'] = TRUE;
        }
      }
      if ($col['type'] == 'int' && isset($r->extra) && $r->extra == 'auto_increment') {
        $col['type'] = 'serial';
      }
      $col['not null'] = $r->is_nullable == 'YES' ? FALSE : TRUE;
      if (!is_null($r->column_default)) {
        if ($numeric) {

          // XXX floats!
          $col['default'] = intval($r->column_default);
        }
        else {
          $col['default'] = $r->column_default;
        }
      }
      $col['description'] = $r->column_comment;
      $tables[$r->table_name]['fields'][$r->column_name] = $col;

      // At this point, $tables is indexed by the raw db table name - save the unprefixed
      // name for later use
      $tables[$r->table_name]['name'] = $r->new_table_name;
    }
    $sql = 'SELECT table_name, column_name, index_name, sub_part, non_unique
            FROM information_schema.statistics
            WHERE table_schema=:database ';
    if (isset($table_name)) {
      $sql .= 'AND table_name = :table ';
    }
    $sql .= 'ORDER BY table_name, index_name, seq_in_index';
    $res = $this->connection
      ->query($sql, $args);
    foreach ($res as $r) {
      if (isset($r->sub_part) && !is_null($r->sub_part)) {
        $col = array(
          $r->column_name,
          intval($r->sub_part),
        );
      }
      else {
        $col = $r->column_name;
      }
      if ($r->index_name == 'PRIMARY') {
        $type = 'primary key';
        $tables[$r->table_name][$type][] = $col;
        continue;
      }
      elseif ($r->non_unique == 0) {
        $type = 'unique keys';
      }
      else {
        $type = 'indexes';
      }
      $tables[$r->table_name][$type][$r->index_name][] = $col;
    }

    // Add information about foreign keys by querying tables in the
    // information_schema. This adds a 'foreign keys' key to the array for each
    // table.
    $sql = 'SELECT *
            FROM information_schema.KEY_COLUMN_USAGE
            WHERE table_schema = :database';
    if (isset($table_name)) {
      $sql .= ' AND table_name = :table';
    }
    $res = $this->connection
      ->query($sql, $args);
    foreach ($res as $r) {
      if ($r->REFERENCED_TABLE_NAME) {
        if (empty($tables[$r->TABLE_NAME]['foreign keys'][$r->CONSTRAINT_NAME])) {
          $tables[$r->TABLE_NAME]['foreign keys'][$r->CONSTRAINT_NAME] = array(
            'table' => $r->REFERENCED_TABLE_NAME,
            'columns' => array(),
          );
        }
        $tables[$r->TABLE_NAME]['foreign keys'][$r->CONSTRAINT_NAME]['columns'][$r->COLUMN_NAME] = $r->REFERENCED_COLUMN_NAME;
      }
    }

    // Now, for tables which we have unprefixed, index $tables by the unprefixed name
    foreach ($tables as $tablename => $table) {
      $newname = $tables[$tablename]['name'];
      if ($tablename != $newname) {
        $tables[$newname] = $table;
        unset($tables[$tablename]);
      }
    }
    return $tables;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DatabaseSchema::$connection protected property The database connection.
DatabaseSchema::$defaultSchema protected property Definition of prefixInfo array structure. 1
DatabaseSchema::$placeholder protected property The placeholder counter.
DatabaseSchema::$uniqueIdentifier protected property A unique identifier for this query object.
DatabaseSchema::createTable public function Create a new table from a Drupal table definition.
DatabaseSchema::fieldNames public function Return an array of field names from an array of key/index column specifiers.
DatabaseSchema::findTables public function Find all tables that are like the specified base table name. 1
DatabaseSchema::findTablesD8 public function Finds all tables that are like the specified base table name. This is a backport of the change made to findTables in Drupal 8 to work with virtual, un-prefixed table names. The original function is retained for Backwards Compatibility. 1
DatabaseSchema::nextPlaceholder public function Implements QueryPlaceHolderInterface::nextPlaceholder(). Overrides QueryPlaceholderInterface::nextPlaceholder
DatabaseSchema::prefixNonTable function Create names for indexes, primary keys and constraints.
DatabaseSchema::uniqueIdentifier public function Implements QueryPlaceHolderInterface::uniqueIdentifier(). Overrides QueryPlaceholderInterface::uniqueIdentifier
DatabaseSchema::__clone public function Implements the magic __clone function.
DatabaseSchema::__construct public function
DatabaseSchema_mysql::addField public function Add a new field to a table. Overrides DatabaseSchema::addField
DatabaseSchema_mysql::addIndex public function Add an index. Overrides DatabaseSchema::addIndex
DatabaseSchema_mysql::addPrimaryKey public function Add a primary key. Overrides DatabaseSchema::addPrimaryKey
DatabaseSchema_mysql::addUniqueKey public function Add a unique key. Overrides DatabaseSchema::addUniqueKey
DatabaseSchema_mysql::buildTableNameCondition protected function Build a condition to match a table name against a standard information_schema. Overrides DatabaseSchema::buildTableNameCondition
DatabaseSchema_mysql::changeField public function Change a field definition. Overrides DatabaseSchema::changeField
DatabaseSchema_mysql::COMMENT_MAX_COLUMN constant Maximum length of a column comment in MySQL.
DatabaseSchema_mysql::COMMENT_MAX_TABLE constant Maximum length of a table comment in MySQL.
DatabaseSchema_mysql::createFieldSql protected function Create an SQL string for a field to be used in table creation or alteration.
DatabaseSchema_mysql::createKeySql protected function
DatabaseSchema_mysql::createKeysSql protected function
DatabaseSchema_mysql::createKeysSqlHelper protected function
DatabaseSchema_mysql::createTableSql protected function Generate SQL to create a new table from a Drupal schema definition.
DatabaseSchema_mysql::dropField public function Drop a field. Overrides DatabaseSchema::dropField
DatabaseSchema_mysql::dropIndex public function Drop an index. Overrides DatabaseSchema::dropIndex
DatabaseSchema_mysql::dropPrimaryKey public function Drop the primary key. Overrides DatabaseSchema::dropPrimaryKey
DatabaseSchema_mysql::dropTable public function Drop a table. Overrides DatabaseSchema::dropTable
DatabaseSchema_mysql::dropUniqueKey public function Drop a unique key. Overrides DatabaseSchema::dropUniqueKey
DatabaseSchema_mysql::fieldExists public function Check if a column exists in the given table. Overrides DatabaseSchema::fieldExists
DatabaseSchema_mysql::fieldSetDefault public function Set the default value for a field. Overrides DatabaseSchema::fieldSetDefault
DatabaseSchema_mysql::fieldSetNoDefault public function Set a field to have no default value. Overrides DatabaseSchema::fieldSetNoDefault
DatabaseSchema_mysql::getComment public function Retrieve a table or column comment.
DatabaseSchema_mysql::indexExists public function Checks if an index exists in the given table. Overrides DatabaseSchema::indexExists
DatabaseSchema_mysql::prepareComment public function Prepare a table or column comment for database query. Overrides DatabaseSchema::prepareComment
DatabaseSchema_mysql::processField protected function Set database-engine specific properties for a field.
DatabaseSchema_mysql::renameTable public function Rename a table. Overrides DatabaseSchema::renameTable
DatabaseSchema_mysql::tableExists public function Check if a table exists. Overrides DatabaseSchema::tableExists
SchemaDatabaseSchema_mysql::getCreateTableSql public function Retrieve generated SQL to create a new table from a Drupal schema definition.
SchemaDatabaseSchema_mysql::getFieldTypeMap public function Overrides DatabaseSchema_mysql::getFieldTypeMap(). Overrides DatabaseSchema_mysql::getFieldTypeMap
SchemaDatabaseSchema_mysql::getPrefixInfo protected function Overrides DatabaseSchema_mysql::getPrefixInfo(). Overrides DatabaseSchema_mysql::getPrefixInfo
SchemaDatabaseSchema_mysql::inspect public function Retrieves the schema for the database's actual structure.
SchemaDatabaseSchema_mysql::schema_type_map public function