from migrations.fixtures.delphi_tables.v8.triggers.base_trigger import TriggerType class TriggerMigrator: def __init__(self, bind, target): self.bind = bind self.target = target def upgrade(self): if hasattr(self.target, "type") and self.target.type == TriggerType.STATEMENT.value: self.bind.execute( f""" CREATE OR REPLACE FUNCTION {self.target.function_name}() RETURNS TRIGGER LANGUAGE PLPGSQL AS $$ BEGIN IF (TG_OP = 'DELETE') THEN {self.target.on_delete()} ELSIF (TG_OP = 'UPDATE') THEN {self.target.on_update()} ELSIF (TG_OP = 'INSERT') THEN {self.target.on_insert()} END IF; RETURN NULL; END $$; """ ) self.bind.execute( f""" CREATE TRIGGER {self.target.function_name}_insert_trigger AFTER INSERT ON "{self.target.table}" REFERENCING NEW TABLE AS new_table FOR EACH STATEMENT EXECUTE FUNCTION {self.target.function_name}(); CREATE TRIGGER {self.target.function_name}_delete_trigger AFTER DELETE ON "{self.target.table}" REFERENCING OLD TABLE AS old_table FOR EACH STATEMENT EXECUTE FUNCTION {self.target.function_name}(); """ ) else: self.bind.execute( f""" CREATE OR REPLACE FUNCTION {self.target.function_name}() RETURNS TRIGGER LANGUAGE PLPGSQL AS $$ BEGIN IF (TG_OP = 'DELETE') THEN {self.target.on_delete()} RETURN OLD; ELSIF (TG_OP = 'UPDATE') THEN {self.target.on_update()} RETURN NEW; ELSIF (TG_OP = 'INSERT') THEN {self.target.on_insert()} RETURN NEW; END IF; END $$; """ ) self.bind.execute( f""" CREATE TRIGGER {self.target.function_name}_trigger AFTER INSERT OR UPDATE OR DELETE ON "{self.target.table}" FOR EACH ROW EXECUTE PROCEDURE {self.target.function_name}(); """ ) def rollback(self): if hasattr(self.target, "type") and self.target.type == TriggerType.STATEMENT.value: self.bind.execute( f""" DROP TRIGGER IF EXISTS {self.target.function_name}_insert_trigger ON "{self.target.table}"; DROP TRIGGER IF EXISTS {self.target.function_name}_delete_trigger ON "{self.target.table}"; DROP TRIGGER IF EXISTS {self.target.function_name}_trigger ON "{self.target.table}"; DROP FUNCTION IF EXISTS {self.target.function_name}(); """ ) else: self.bind.execute( f""" DROP TRIGGER IF EXISTS {self.target.function_name}_trigger ON "{self.target.table}"; DROP FUNCTION IF EXISTS {self.target.function_name}(); """ )