Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorick Peterse <yorickpeterse@gmail.com>2017-08-01 19:07:23 +0300
committerYorick Peterse <yorickpeterse@gmail.com>2017-08-02 14:03:21 +0300
commit0693905d2e586071b186be11ce9e31ab13cf3ae7 (patch)
tree176d9fdafee0dd6024287d81c978236ee85697a4 /db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb
parent1b117e7f2d8cf4c2793bd2234688ad8739056894 (diff)
Change project FK migration to skip existing FKs
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.
Diffstat (limited to 'db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb')
-rw-r--r--db/migrate/20170530130129_project_foreign_keys_with_cascading_deletes.rb34
1 files changed, 26 insertions, 8 deletions
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.