gitlab-org--gitlab-foss/db/migrate/20220506154054_create_sync_namespace_details_trigger.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

71 lines
2.1 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
class CreateSyncNamespaceDetailsTrigger < Gitlab::Database::Migration[2.0]
include Gitlab::Database::SchemaHelpers
UPDATE_TRIGGER_NAME = 'trigger_update_details_on_namespace_update'
INSERT_TRIGGER_NAME = 'trigger_update_details_on_namespace_insert'
FUNCTION_NAME = 'update_namespace_details_from_namespaces'
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.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.id;RETURN NULL;
SQL
end
execute(<<~SQL)
CREATE TRIGGER #{UPDATE_TRIGGER_NAME}
AFTER UPDATE ON namespaces
FOR EACH ROW
WHEN (
NEW.type <> 'Project' AND (
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 namespaces
FOR EACH ROW
WHEN (NEW.type <> 'Project')
EXECUTE PROCEDURE #{FUNCTION_NAME}();
SQL
end
def down
drop_trigger(:namespaces, UPDATE_TRIGGER_NAME)
drop_trigger(:namespaces, INSERT_TRIGGER_NAME)
drop_function(FUNCTION_NAME)
end
end