49 lines
1.4 KiB
Ruby
49 lines
1.4 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class EnsureUniqueDebianPackages < Gitlab::Database::Migration[2.1]
|
||
|
BATCH_SIZE = 1_000
|
||
|
|
||
|
disable_ddl_transaction!
|
||
|
|
||
|
restrict_gitlab_migration gitlab_schema: :gitlab_main
|
||
|
|
||
|
class Package < MigrationRecord
|
||
|
include EachBatch
|
||
|
|
||
|
self.table_name = 'packages_packages'
|
||
|
|
||
|
enum package_type: { debian: 9 }
|
||
|
|
||
|
enum status: { pending_destruction: 4 }
|
||
|
end
|
||
|
|
||
|
def up
|
||
|
Package.distinct_each_batch(column: :project_id) do |package_projects|
|
||
|
project_ids = package_projects.pluck(:project_id)
|
||
|
duplicates = Package.debian
|
||
|
.not_pending_destruction
|
||
|
.where(project_id: project_ids)
|
||
|
.select('project_id, name, version, MAX(id) as last_id')
|
||
|
.group(:project_id, :name, :version)
|
||
|
.having('count(id) > 1')
|
||
|
loop do
|
||
|
duplicates.limit(BATCH_SIZE).each do |duplicate|
|
||
|
Package.debian
|
||
|
.not_pending_destruction
|
||
|
.where(
|
||
|
project_id: duplicate.project_id,
|
||
|
name: duplicate.name,
|
||
|
version: duplicate.version,
|
||
|
id: ..duplicate.last_id - 1
|
||
|
).update_all status: :pending_destruction
|
||
|
end
|
||
|
break unless duplicates.exists?
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def down
|
||
|
# nothing to do
|
||
|
end
|
||
|
end
|