3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
# File 'lib/pgtrigger/active_record/migration.rb', line 3
def create_trigger(table_name, trigger_name, after: nil, before: nil, declare: nil)
raise "Not defined after or before for create_trigger" unless after || before
raise "Define only on after or before" if after && before
trigger_name = Pgtrigger::Utils.build_trigger_name(table_name, trigger_name)
if declare
declare = "DECLARE \n\t\t#{declare.map{|var| var.to_a.join(" ")}.join(";\n\t\t")};"
end
execute(<<-TRIGGERSQL
CREATE OR REPLACE FUNCTION #{trigger_name}_func()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
#{declare}
BEGIN
#{yield}
END;
$function$
TRIGGERSQL
)
after = after.join(" OR ") if ["Array"].include?(after.class.to_s)
after = "AFTER #{after}" if after
before = before.join(" OR ") if ["Array"].include?(before.class.to_s)
before = "BEFORE #{before}" if before
execute(<<-TRIGGERSQL
CREATE TRIGGER #{trigger_name}_trigger
#{after} #{before} ON #{table_name}
FOR EACH ROW EXECUTE PROCEDURE #{trigger_name}_func()
TRIGGERSQL
)
end
|