d3d9077830
This works the same way as change_column_type_using_background_migration, but for renaming a column. It takes a table, not a relation, to match its concurrent counterpart. Also, generalise the cleanup migrations to reduce code duplication.
52 lines
1.5 KiB
Ruby
52 lines
1.5 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module BackgroundMigration
|
|
# Base class for cleaning up concurrent schema changes.
|
|
class CleanupConcurrentSchemaChange
|
|
include Database::MigrationHelpers
|
|
|
|
# table - The name of the table the migration is performed for.
|
|
# old_column - The name of the old (to drop) column.
|
|
# new_column - The name of the new column.
|
|
def perform(table, old_column, new_column)
|
|
return unless column_exists?(table, new_column)
|
|
|
|
rows_to_migrate = define_model_for(table)
|
|
.where(new_column => nil)
|
|
.where
|
|
.not(old_column => nil)
|
|
|
|
if rows_to_migrate.any?
|
|
BackgroundMigrationWorker.perform_in(
|
|
RESCHEDULE_DELAY,
|
|
self.class.name,
|
|
[table, old_column, new_column]
|
|
)
|
|
else
|
|
cleanup_concurrent_schema_change(table, old_column, new_column)
|
|
end
|
|
end
|
|
|
|
# These methods are necessary so we can re-use the migration helpers in
|
|
# this class.
|
|
def connection
|
|
ActiveRecord::Base.connection
|
|
end
|
|
|
|
def method_missing(name, *args, &block)
|
|
connection.__send__(name, *args, &block) # rubocop: disable GitlabSecurity/PublicSend
|
|
end
|
|
|
|
def respond_to_missing?(*args)
|
|
connection.respond_to?(*args) || super
|
|
end
|
|
|
|
def define_model_for(table)
|
|
Class.new(ActiveRecord::Base) do
|
|
self.table_name = table
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|