Files
gitlab-foss/db/migrate/20250220093911_add_active_context_migrations.rb
2025-02-24 18:09:28 +00:00

44 lines
1.7 KiB
Ruby

# frozen_string_literal: true
class AddActiveContextMigrations < Gitlab::Database::Migration[2.2]
milestone '17.10'
FAILED_STATE_ENUM = 255
INDEX_NAME = 'index_ai_active_context_migrations_on_connection_and_status'
UNIQUE_INDEX_NAME = 'index_ai_active_context_migrations_on_connection_and_version'
CONSTRAINT_NAME = 'c_ai_active_context_migrations_on_retries_left'
VERSION_CONSTRAINT_NAME = 'c_ai_active_context_migrations_version_format'
CONSTRAINT_QUERY = <<~SQL
(retries_left > 0) OR (retries_left = 0 AND status = #{FAILED_STATE_ENUM})
SQL
def change
create_table :ai_active_context_migrations do |t|
# Fixed size columns (8 bytes)
t.references :connection, index: false,
foreign_key: { to_table: :ai_active_context_connections, on_delete: :cascade }, null: false
t.datetime_with_timezone :started_at
t.datetime_with_timezone :completed_at
t.timestamps_with_timezone
# Fixed size columns (4 bytes)
t.integer :status, limit: 2, null: false, default: 0
t.integer :retries_left, limit: 2, null: false
# Variable size columns
t.text :version, null: false, limit: 255
t.jsonb :metadata, null: false, default: {}
t.text :error_message, limit: 1024
t.index [:connection_id, :status], name: INDEX_NAME
t.index [:connection_id, :version], unique: true, name: UNIQUE_INDEX_NAME
# Check constraint ensures retries_left is only non-zero for non-failed migrations
t.check_constraint CONSTRAINT_QUERY, name: CONSTRAINT_NAME
# Check constraint ensures version is a 14-digit timestamp format (YYYYMMDDHHMMSS)
t.check_constraint "version ~ '^[0-9]{14}$'", name: VERSION_CONSTRAINT_NAME
end
end
end