70 lines
2.1 KiB
Ruby
70 lines
2.1 KiB
Ruby
# 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
|