summaryrefslogtreecommitdiff
path: root/modules/field/modules/field_sql_storage/field_sql_storage.module
diff options
context:
space:
mode:
Diffstat (limited to 'modules/field/modules/field_sql_storage/field_sql_storage.module')
-rw-r--r--modules/field/modules/field_sql_storage/field_sql_storage.module36
1 files changed, 30 insertions, 6 deletions
diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.module b/modules/field/modules/field_sql_storage/field_sql_storage.module
index 695561624..2ed783507 100644
--- a/modules/field/modules/field_sql_storage/field_sql_storage.module
+++ b/modules/field/modules/field_sql_storage/field_sql_storage.module
@@ -236,13 +236,37 @@ function field_sql_storage_field_update_forbid($field, $prior_field, $has_data)
function field_sql_storage_field_storage_update_field($field, $prior_field, $has_data) {
if (! $has_data) {
// There is no data. Re-create the tables completely.
- $prior_schema = _field_sql_storage_schema($prior_field);
- foreach ($prior_schema as $name => $table) {
- db_drop_table($name, $table);
+
+ if (Database::getConnection()->supportsTransactionalDDL()) {
+ // If the database supports transactional DDL, we can go ahead and rely
+ // on it. If not, we will have to rollback manually if something fails.
+ $transaction = db_transaction();
+ }
+
+ try {
+ $prior_schema = _field_sql_storage_schema($prior_field);
+ foreach ($prior_schema as $name => $table) {
+ db_drop_table($name, $table);
+ }
+ $schema = _field_sql_storage_schema($field);
+ foreach ($schema as $name => $table) {
+ db_create_table($name, $table);
+ }
}
- $schema = _field_sql_storage_schema($field);
- foreach ($schema as $name => $table) {
- db_create_table($name, $table);
+ catch (Exception $e) {
+ if (Database::getConnection()->supportsTransactionalDDL()) {
+ $transaction->rollback();
+ }
+ else {
+ // Recreate tables.
+ $prior_schema = _field_sql_storage_schema($prior_field);
+ foreach ($prior_schema as $name => $table) {
+ if (!db_table_exists($name)) {
+ db_create_table($name, $table);
+ }
+ }
+ }
+ throw $e;
}
}
else {