diff options
Diffstat (limited to 'lib/gitlab/database/background_migration_job.rb')
-rw-r--r-- | lib/gitlab/database/background_migration_job.rb | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/gitlab/database/background_migration_job.rb b/lib/gitlab/database/background_migration_job.rb new file mode 100644 index 00000000000..445735b232a --- /dev/null +++ b/lib/gitlab/database/background_migration_job.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +module Gitlab + module Database + class BackgroundMigrationJob < ActiveRecord::Base # rubocop:disable Rails/ApplicationRecord + self.table_name = :background_migration_jobs + + scope :for_migration_class, -> (class_name) { where(class_name: normalize_class_name(class_name)) } + scope :for_migration_execution, -> (class_name, arguments) do + for_migration_class(class_name).where('arguments = ?', arguments.to_json) + end + + scope :for_partitioning_migration, -> (class_name, table_name) do + for_migration_class(class_name).where('arguments ->> 2 = ?', table_name) + end + + enum status: { + pending: 0, + succeeded: 1 + } + + def self.mark_all_as_succeeded(class_name, arguments) + self.pending.for_migration_execution(class_name, arguments) + .update_all("status = #{statuses[:succeeded]}, updated_at = NOW()") + end + + def self.normalize_class_name(class_name) + return class_name unless class_name.present? && class_name.start_with?('::') + + class_name[2..] + end + + def class_name=(value) + write_attribute(:class_name, self.class.normalize_class_name(value)) + end + end + end +end |