80 lines
2.1 KiB
Ruby
80 lines
2.1 KiB
Ruby
![]() |
# frozen_string_literal: true
|
||
|
|
||
|
class AddHasIssuesOnVulnerabilityReadsTrigger < Gitlab::Database::Migration[1.0]
|
||
|
include Gitlab::Database::SchemaHelpers
|
||
|
|
||
|
TRIGGER_ON_INSERT = 'trigger_update_has_issues_on_vulnerability_issue_links_update'
|
||
|
INSERT_FUNCTION_NAME = 'set_has_issues_on_vulnerability_reads'
|
||
|
|
||
|
TRIGGER_ON_DELETE = 'trigger_update_has_issues_on_vulnerability_issue_links_delete'
|
||
|
DELETE_FUNCTION_NAME = 'unset_has_issues_on_vulnerability_reads'
|
||
|
|
||
|
def up
|
||
|
create_trigger_function(INSERT_FUNCTION_NAME, replace: true) do
|
||
|
<<~SQL
|
||
|
UPDATE
|
||
|
vulnerability_reads
|
||
|
SET
|
||
|
has_issues = true
|
||
|
WHERE
|
||
|
vulnerability_id = NEW.vulnerability_id AND has_issues IS FALSE;
|
||
|
RETURN NULL;
|
||
|
SQL
|
||
|
end
|
||
|
|
||
|
execute(<<~SQL)
|
||
|
CREATE OR REPLACE FUNCTION #{DELETE_FUNCTION_NAME}()
|
||
|
RETURNS TRIGGER
|
||
|
LANGUAGE plpgsql
|
||
|
AS $$
|
||
|
DECLARE
|
||
|
has_issue_links integer;
|
||
|
BEGIN
|
||
|
PERFORM 1
|
||
|
FROM
|
||
|
vulnerability_reads
|
||
|
WHERE
|
||
|
vulnerability_id = OLD.vulnerability_id
|
||
|
FOR UPDATE;
|
||
|
|
||
|
SELECT 1 INTO has_issue_links FROM vulnerability_issue_links WHERE vulnerability_id = OLD.vulnerability_id LIMIT 1;
|
||
|
|
||
|
IF (has_issue_links = 1) THEN
|
||
|
RETURN NULL;
|
||
|
END IF;
|
||
|
|
||
|
UPDATE
|
||
|
vulnerability_reads
|
||
|
SET
|
||
|
has_issues = false
|
||
|
WHERE
|
||
|
vulnerability_id = OLD.vulnerability_id;
|
||
|
|
||
|
RETURN NULL;
|
||
|
END
|
||
|
$$;
|
||
|
SQL
|
||
|
|
||
|
execute(<<~SQL)
|
||
|
CREATE TRIGGER #{TRIGGER_ON_INSERT}
|
||
|
AFTER INSERT ON vulnerability_issue_links
|
||
|
FOR EACH ROW
|
||
|
EXECUTE FUNCTION #{INSERT_FUNCTION_NAME}();
|
||
|
SQL
|
||
|
|
||
|
execute(<<~SQL)
|
||
|
CREATE TRIGGER #{TRIGGER_ON_DELETE}
|
||
|
AFTER DELETE ON vulnerability_issue_links
|
||
|
FOR EACH ROW
|
||
|
EXECUTE FUNCTION #{DELETE_FUNCTION_NAME}();
|
||
|
SQL
|
||
|
end
|
||
|
|
||
|
def down
|
||
|
drop_trigger(:vulnerability_issue_links, TRIGGER_ON_INSERT)
|
||
|
drop_function(INSERT_FUNCTION_NAME)
|
||
|
drop_trigger(:vulnerability_issue_links, TRIGGER_ON_DELETE)
|
||
|
drop_function(DELETE_FUNCTION_NAME)
|
||
|
end
|
||
|
end
|