public function DatabaseSchema_sqlite::addField

cis7 schema.inc public DatabaseSchema_sqlite::addField($table, $field, $specification, $keys_new = array())
cle7 schema.inc public DatabaseSchema_sqlite::addField($table, $field, $specification, $keys_new = array())
elmsmedia7 schema.inc public DatabaseSchema_sqlite::addField($table, $field, $specification, $keys_new = array())
icor7 schema.inc public DatabaseSchema_sqlite::addField($table, $field, $specification, $keys_new = array())
meedjum_blog7 schema.inc public DatabaseSchema_sqlite::addField($table, $field, $specification, $keys_new = array())
mooc7 schema.inc public DatabaseSchema_sqlite::addField($table, $field, $specification, $keys_new = array())

Add a new field to a table.

Parameters

$table: Name of the table to be altered.

$field: Name of the field to be added.

$spec: 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.

$keys_new: 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.

Overrides DatabaseSchema::addField

Throws

DatabaseSchemaObjectDoesNotExistException If the specified table doesn't exist.

DatabaseSchemaObjectExistsException If the specified table already has a field by that name.

File

includes/database/sqlite/schema.inc, line 279
Database schema code for SQLite databases.

Class

DatabaseSchema_sqlite

Code

public function addField($table, $field, $specification, $keys_new = array()) {
  if (!$this->tableExists($table)) {
    throw new DatabaseSchemaObjectDoesNotExistException(t("Cannot add field %table.%field: table doesn't exist.", array('%field' => $field, '%table' => $table)));
  }
  if ($this->fieldExists($table, $field)) {
    throw new DatabaseSchemaObjectExistsException(t("Cannot add field %table.%field: field already exists.", array('%field' => $field, '%table' => $table)));
  }

  // SQLite doesn't have a full-featured ALTER TABLE statement. It only
  // supports adding new fields to a table, in some simple cases. In most
  // cases, we have to create a new table and copy the data over.
  if (empty($keys_new) && (empty($specification['not null']) || isset($specification['default']))) {
    // When we don't have to create new keys and we are not creating a
    // NOT NULL column without a default value, we can use the quicker version.
    $query = 'ALTER TABLE {' . $table . '} ADD ' . $this->createFieldSql($field, $this->processField($specification));
    $this->connection->query($query);

    // Apply the initial value if set.
    if (isset($specification['initial'])) {
      $this->connection->update($table)->fields(array($field => $specification['initial']))->execute();
    }
  }
  else {
    // We cannot add the field directly. Use the slower table alteration
    // method, starting from the old schema.
    $old_schema = $this->introspectSchema($table);
    $new_schema = $old_schema;

    // Add the new field.
    $new_schema['fields'][$field] = $specification;

    // Build the mapping between the old fields and the new fields.
    $mapping = array();
    if (isset($specification['initial'])) {
      // If we have a initial value, copy it over.
      $mapping[$field] = array(
        'expression' => ':newfieldinitial',
        'arguments' => array(':newfieldinitial' => $specification['initial']),
      );
    }
    else {
      // Else use the default of the field.
      $mapping[$field] = NULL;
    }

    // Add the new indexes.
    $new_schema += $keys_new;

    $this->alterTable($table, $old_schema, $new_schema, $mapping);
  }
}