Commit 0693905d authored by Yorick Peterse's avatar Yorick Peterse

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.
parent 1b117e7f
---
title: Change project FK migration to skip existing FKs
merge_request:
author:
...@@ -62,8 +62,8 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration ...@@ -62,8 +62,8 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration
# These columns are not indexed yet, meaning a cascading delete would take # These columns are not indexed yet, meaning a cascading delete would take
# forever. # forever.
add_concurrent_index(:project_group_links, :project_id) add_index_if_not_exists(:project_group_links, :project_id)
add_concurrent_index(:pages_domains, :project_id) add_index_if_not_exists(:pages_domains, :project_id)
end end
def down def down
...@@ -71,15 +71,15 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration ...@@ -71,15 +71,15 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration
remove_foreign_key_without_error(source, column) remove_foreign_key_without_error(source, column)
end end
add_concurrent_foreign_key(:boards, :projects, column: :project_id) add_foreign_key_if_not_exists(:boards, :projects, column: :project_id)
add_concurrent_foreign_key(:lists, :labels, column: :label_id) add_foreign_key_if_not_exists(:lists, :labels, column: :label_id)
add_concurrent_foreign_key(:lists, :boards, column: :board_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, :protected_branches,
column: :protected_branch_id) 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, :protected_branches,
column: :protected_branch_id) column: :protected_branch_id)
...@@ -89,7 +89,7 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration ...@@ -89,7 +89,7 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration
def add_foreign_keys def add_foreign_keys
TABLES.each do |(source, target, column)| 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
end end
...@@ -153,6 +153,18 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration ...@@ -153,6 +153,18 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration
EOF EOF
end 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) def remove_foreign_key_without_error(table, column)
remove_foreign_key(table, column: column) remove_foreign_key(table, column: column)
rescue ArgumentError rescue ArgumentError
...@@ -163,6 +175,12 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration ...@@ -163,6 +175,12 @@ class ProjectForeignKeysWithCascadingDeletes < ActiveRecord::Migration
rescue ArgumentError rescue ArgumentError
end end
def foreign_key_exists?(table, column)
foreign_keys(table).any? do |key|
key.options[:column] == column.to_s
end
end
def connection def connection
# Rails memoizes connection objects, but this causes them to be shared # Rails memoizes connection objects, but this causes them to be shared
# amongst threads; we don't want that. # amongst threads; we don't want that.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment