diff options
Diffstat (limited to 'includes')
-rw-r--r-- | includes/database/mysql/schema.inc | 19 | ||||
-rw-r--r-- | includes/database/pgsql/schema.inc | 41 | ||||
-rw-r--r-- | includes/database/sqlite/schema.inc | 22 |
3 files changed, 59 insertions, 23 deletions
diff --git a/includes/database/mysql/schema.inc b/includes/database/mysql/schema.inc index cba41eb5f..ff1d99ba8 100644 --- a/includes/database/mysql/schema.inc +++ b/includes/database/mysql/schema.inc @@ -132,7 +132,7 @@ class DatabaseSchema_mysql extends DatabaseSchema { protected function createFieldSql($name, $spec) { $sql = "`" . $name . "` " . $spec['mysql_type']; - if (in_array($spec['type'], array('varchar', 'char', 'text')) && isset($spec['length'])) { + if (in_array($spec['mysql_type'], array('VARCHAR', 'CHAR', 'TINYTEXT', 'MEDIUMTEXT', 'LONGTEXT', 'TEXT')) && isset($spec['length'])) { $sql .= '(' . $spec['length'] . ')'; } elseif (isset($spec['precision']) && isset($spec['scale'])) { @@ -143,8 +143,13 @@ class DatabaseSchema_mysql extends DatabaseSchema { $sql .= ' unsigned'; } - if (!empty($spec['not null'])) { - $sql .= ' NOT NULL'; + if (isset($spec['not null'])) { + if ($spec['not null']) { + $sql .= ' NOT NULL'; + } + else { + $sql .= ' NULL'; + } } if (!empty($spec['auto_increment'])) { @@ -187,12 +192,16 @@ class DatabaseSchema_mysql extends DatabaseSchema { } // Set the correct database-engine specific datatype. - if (!isset($field['mysql_type'])) { + // In case one is already provided, force it to uppercase. + if (isset($field['mysql_type'])) { + $field['mysql_type'] = drupal_strtoupper($field['mysql_type']); + } + else { $map = $this->getFieldTypeMap(); $field['mysql_type'] = $map[$field['type'] . ':' . $field['size']]; } - if ($field['type'] == 'serial') { + if (isset($field['type']) && $field['type'] == 'serial') { $field['auto_increment'] = TRUE; } diff --git a/includes/database/pgsql/schema.inc b/includes/database/pgsql/schema.inc index cfdb31277..2ad720ed7 100644 --- a/includes/database/pgsql/schema.inc +++ b/includes/database/pgsql/schema.inc @@ -145,11 +145,11 @@ class DatabaseSchema_pgsql extends DatabaseSchema { protected function createFieldSql($name, $spec) { $sql = $name . ' ' . $spec['pgsql_type']; - if ($spec['type'] == 'serial') { + if (isset($spec['type']) && $spec['type'] == 'serial') { unset($spec['not null']); } - if (in_array($spec['type'], array('varchar', 'char', 'text')) && isset($spec['length'])) { + if (in_array($spec['pgsql_type'], array('varchar', 'character', 'text')) && isset($spec['length'])) { $sql .= '(' . $spec['length'] . ')'; } elseif (isset($spec['precision']) && isset($spec['scale'])) { @@ -160,8 +160,13 @@ class DatabaseSchema_pgsql extends DatabaseSchema { $sql .= " CHECK ($name >= 0)"; } - if (isset($spec['not null']) && $spec['not null']) { - $sql .= ' NOT NULL'; + if (isset($spec['not null'])) { + if ($spec['not null']) { + $sql .= ' NOT NULL'; + } + else { + $sql .= ' NULL'; + } } if (isset($spec['default'])) { $default = is_string($spec['default']) ? "'" . $spec['default'] . "'" : $spec['default']; @@ -181,11 +186,17 @@ class DatabaseSchema_pgsql extends DatabaseSchema { if (!isset($field['size'])) { $field['size'] = 'normal'; } + // Set the correct database-engine specific datatype. - if (!isset($field['pgsql_type'])) { + // In case one is already provided, force it to lowercase. + if (isset($field['pgsql_type'])) { + $field['pgsql_type'] = drupal_strtolower($field['pgsql_type']); + } + else { $map = $this->getFieldTypeMap(); $field['pgsql_type'] = $map[$field['type'] . ':' . $field['size']]; } + if (!empty($field['unsigned'])) { // Unsigned datatypes are not supported in PostgreSQL 8.3. In MySQL, // they are used to ensure a positive number is inserted and it also @@ -205,7 +216,7 @@ class DatabaseSchema_pgsql extends DatabaseSchema { break; } } - if ($field['type'] == 'serial') { + if (isset($field['type']) && $field['type'] == 'serial') { unset($field['not null']); } return $field; @@ -462,19 +473,25 @@ class DatabaseSchema_pgsql extends DatabaseSchema { $spec['size'] = 'normal'; } + // Map type definition to the PostgreSQL type. + if (!isset($spec['pgsql_type'])) { + $map = $this->getFieldTypeMap(); + $spec['pgsql_type'] = $map[$spec['type'] . ':' . $spec['size']]; + } + // We need to typecast the new column to best be able to transfer the data // Schema_pgsql::getFieldTypeMap() will return possibilities that are not // 'cast-able' such as 'serial' - so they need to be casted int instead. - $map = $this->getFieldTypeMap(); - $typecast = $map[$spec['type'] . ':' . $spec['size']]; - if (in_array($typecast, array('serial', 'bigserial', 'numeric'))) { + if (in_array($spec['pgsql_type'], array('serial', 'bigserial', 'numeric'))) { $typecast = 'int'; } + else { + $typecast = $spec['pgsql_type']; + } + $this->connection->query('ALTER TABLE {' . $table . '} ALTER "' . $field . '" TYPE ' . $typecast . ' USING "' . $field . '"::' . $typecast); - // Map type definition to the PostgreSQL type. - $pgsql_type = $map[$spec['type'] . ':' . $spec['size']]; - if (in_array($pgsql_type, array('serial', 'bigserial'))) { + if (in_array($spec['pgsql_type'], array('serial', 'bigserial'))) { // Type "serial" is known to PostgreSQL, but *only* during table creation, // not when altering. Because of that, the sequence needs to be created // and initialized by hand. diff --git a/includes/database/sqlite/schema.inc b/includes/database/sqlite/schema.inc index 2d87de657..6830e6b19 100644 --- a/includes/database/sqlite/schema.inc +++ b/includes/database/sqlite/schema.inc @@ -74,7 +74,7 @@ class DatabaseSchema_sqlite extends DatabaseSchema { // Add the SQL statement for each field. foreach ($schema['fields'] as $name => $field) { - if ($field['type'] == 'serial') { + if (isset($field['type']) && $field['type'] == 'serial') { if (isset($schema['primary key']) && ($key = array_search($name, $schema['primary key'])) !== FALSE) { unset($schema['primary key'][$key]); } @@ -116,13 +116,18 @@ class DatabaseSchema_sqlite extends DatabaseSchema { if (!isset($field['size'])) { $field['size'] = 'normal'; } + // Set the correct database-engine specific datatype. - if (!isset($field['sqlite_type'])) { + // In case one is already provided, force it to uppercase. + if (isset($field['sqlite_type'])) { + $field['sqlite_type'] = drupal_strtoupper($field['sqlite_type']); + } + else { $map = $this->getFieldTypeMap(); $field['sqlite_type'] = $map[$field['type'] . ':' . $field['size']]; } - if ($field['type'] == 'serial') { + if (isset($field['type']) && $field['type'] == 'serial') { $field['auto_increment'] = TRUE; } @@ -150,12 +155,17 @@ class DatabaseSchema_sqlite extends DatabaseSchema { else { $sql = $name . ' ' . $spec['sqlite_type']; - if (in_array($spec['type'], array('varchar', 'char', 'text')) && isset($spec['length'])) { + if (in_array($spec['sqlite_type'], array('VARCHAR', 'TEXT')) && isset($spec['length'])) { $sql .= '(' . $spec['length'] . ')'; } - if (!empty($spec['not null'])) { - $sql .= ' NOT NULL'; + if (isset($spec['not null'])) { + if ($spec['not null']) { + $sql .= ' NOT NULL'; + } + else { + $sql .= ' NULL'; + } } if (!empty($spec['unsigned'])) { |