function DatabaseSchema_sqlite::addField

Overrides DatabaseSchema::addField

File

includes/database/sqlite/schema.inc, line 279

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);
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.