debian-mirror-gitlab/db/migrate/20220524184149_create_sync_project_namespace_details_trigger.rb
2022-08-27 11:52:29 +05:30

69 lines
2 KiB
Ruby

# frozen_string_literal: true
class CreateSyncProjectNamespaceDetailsTrigger < Gitlab::Database::Migration[2.0]
include Gitlab::Database::SchemaHelpers
UPDATE_TRIGGER_NAME = 'trigger_update_details_on_project_update'
INSERT_TRIGGER_NAME = 'trigger_update_details_on_project_insert'
FUNCTION_NAME = 'update_namespace_details_from_projects'
enable_lock_retries!
def up
create_trigger_function(FUNCTION_NAME, replace: true) do
<<~SQL
INSERT INTO
namespace_details (
description,
description_html,
cached_markdown_version,
updated_at,
created_at,
namespace_id
)
VALUES
(
NEW.description,
NEW.description_html,
NEW.cached_markdown_version,
NEW.updated_at,
NEW.updated_at,
NEW.project_namespace_id
) ON CONFLICT (namespace_id) DO
UPDATE
SET
description = NEW.description,
description_html = NEW.description_html,
cached_markdown_version = NEW.cached_markdown_version,
updated_at = NEW.updated_at
WHERE
namespace_details.namespace_id = NEW.project_namespace_id;RETURN NULL;
SQL
end
execute(<<~SQL)
CREATE TRIGGER #{UPDATE_TRIGGER_NAME}
AFTER UPDATE ON projects
FOR EACH ROW
WHEN (
OLD.description IS DISTINCT FROM NEW.description OR
OLD.description_html IS DISTINCT FROM NEW.description_html OR
OLD.cached_markdown_version IS DISTINCT FROM NEW.cached_markdown_version
)
EXECUTE PROCEDURE #{FUNCTION_NAME}();
SQL
execute(<<~SQL)
CREATE TRIGGER #{INSERT_TRIGGER_NAME}
AFTER INSERT ON projects
FOR EACH ROW
EXECUTE PROCEDURE #{FUNCTION_NAME}();
SQL
end
def down
drop_trigger(:projects, UPDATE_TRIGGER_NAME)
drop_trigger(:projects, INSERT_TRIGGER_NAME)
drop_function(FUNCTION_NAME)
end
end