summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorick Peterse <yorickpeterse@gmail.com>2017-08-01 18:07:23 +0200
committerYorick Peterse <yorickpeterse@gmail.com>2017-08-02 13:03:21 +0200
commit0693905d2e586071b186be11ce9e31ab13cf3ae7 (patch)
tree176d9fdafee0dd6024287d81c978236ee85697a4
parent1b117e7f2d8cf4c2793bd2234688ad8739056894 (diff)
downloadgitlab-ce-project-foreign-keys-without-errors.tar.gz
Change project FK migration to skip existing FKsproject-foreign-keys-without-errors
This changes the migration ProjectForeignKeysWithCascadingDeletes so that it does not add already existing foreign keys and indexes, making it easier to re-run the migration.
-rw-r--r--changelogs/unreleased/project-foreign-keys-without-errors.yml4
-rw-r--r--db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb34
2 files changed, 30 insertions, 8 deletions
diff --git a/changelogs/unreleased/project-foreign-keys-without-errors.yml b/changelogs/unreleased/project-foreign-keys-without-errors.yml
new file mode 100644
index 00000000000..63c53c8ad8f
--- /dev/null
+++ b/changelogs/unreleased/project-foreign-keys-without-errors.yml
@@ -0,0 +1,4 @@
+---
+title: Change project FK migration to skip existing FKs
+merge_request:
+author:
diff --git a/db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb b/db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb
index 3eaafac321d..af6d10b5158 100644
--- a/db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb
+++ b/db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb
@@ -62,8 +62,8 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration
# These columns are not indexed yet, meaning a cascading delete would take
# forever.
- add_concurrent_index(:project_group_links, :project_id)
- add_concurrent_index(:pages_domains, :project_id)
+ add_index_if_not_exists(:project_group_links, :project_id)
+ add_index_if_not_exists(:pages_domains, :project_id)
end
def down
@@ -71,15 +71,15 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration
remove_foreign_key_without_error(source, column)
end
- add_concurrent_foreign_key(:boards, :projects, column: :project_id)
- add_concurrent_foreign_key(:lists, :labels, column: :label_id)
- add_concurrent_foreign_key(:lists, :boards, column: :board_id)
+ add_foreign_key_if_not_exists(:boards, :projects, column: :project_id)
+ add_foreign_key_if_not_exists(:lists, :labels, column: :label_id)
+ add_foreign_key_if_not_exists(:lists, :boards, column: :board_id)
- add_concurrent_foreign_key(:protected_branch_merge_access_levels,
+ add_foreign_key_if_not_exists(:protected_branch_merge_access_levels,
:protected_branches,
column: :protected_branch_id)
- add_concurrent_foreign_key(:protected_branch_push_access_levels,
+ add_foreign_key_if_not_exists(:protected_branch_push_access_levels,
:protected_branches,
column: :protected_branch_id)
@@ -89,7 +89,7 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration
def add_foreign_keys
TABLES.each do |(source, target, column)|
- add_concurrent_foreign_key(source, target, column: column)
+ add_foreign_key_if_not_exists(source, target, column: column)
end
end
@@ -153,6 +153,18 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration
EOF
end
+ def add_foreign_key_if_not_exists(source, target, column:)
+ return if foreign_key_exists?(source, column)
+
+ add_concurrent_foreign_key(source, target, column: column)
+ end
+
+ def add_index_if_not_exists(table, column)
+ return if index_exists?(table, column)
+
+ add_concurrent_index(table, column)
+ end
+
def remove_foreign_key_without_error(table, column)
remove_foreign_key(table, column: column)
rescue ArgumentError
@@ -163,6 +175,12 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration
rescue ArgumentError
end
+ def foreign_key_exists?(table, column)
+ foreign_keys(table).any? do |key|
+ key.options[:column] == column.to_s
+ end
+ end
+
def connection
# Rails memoizes connection objects, but this causes them to be shared
# amongst threads; we don't want that.