15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
# File 'lib/hair_trigger/adapter.rb', line 15
def triggers(options = {})
triggers = {}
name_clause = options[:only] ? "IN ('" + options[:only].join("', '") + "')" : nil
adapter_name = HairTrigger.adapter_name_for(self)
case adapter_name
when :sqlite
select_rows("SELECT name, sql FROM sqlite_master WHERE type = 'trigger' #{name_clause ? " AND name " + name_clause : ""}").each do |(name, definition)|
triggers[name] = definition + ";\n"
end
when :mysql
select_rows("SHOW TRIGGERS").each do |(name, event, table, actions, timing, created, sql_mode, definer)|
next if options[:only] && !options[:only].include?(name)
triggers[name.strip] = "CREATE \#{definer != \"\#{@config[:username] || 'root'}@\#{@config[:host] || 'localhost'}\" ? \"DEFINER = \#{definer} \" : \"\"}TRIGGER \#{name} \#{timing} \#{event} ON \#{table}\nFOR EACH ROW\n\#{actions}\n SQL\n end\n when :postgresql, :postgis\n function_conditions = \"(SELECT typname FROM pg_type WHERE oid = prorettype) = 'trigger'\"\n function_conditions << <<-SQL unless options[:simple_check]\n AND oid IN (\n SELECT tgfoid\n FROM pg_trigger\n WHERE NOT tgisinternal AND tgconstrrelid = 0 AND tgrelid IN (\n SELECT oid FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public')\n )\n )\n SQL\n function_conditions = \n sql = <<-SQL\n SELECT tgname::varchar, pg_get_triggerdef(oid, true)\n FROM pg_trigger\n WHERE NOT tgisinternal AND tgconstrrelid = 0 AND tgrelid IN (\n SELECT oid FROM pg_class WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'public')\n )\n \n \#{name_clause ? \" AND tgname::varchar \" + name_clause : \"\"}\n UNION\n SELECT proname || '()', pg_get_functiondef(oid)\n FROM pg_proc\n WHERE \#{function_conditions}\n \#{name_clause ? \" AND (proname || '()')::varchar \" + name_clause : \"\"}\n SQL\n select_rows(sql).each do |(name, definition)|\n triggers[name] = definition\n end\n else\n raise \"don't know how to retrieve \#{adapter_name} triggers yet\"\n end\n triggers\nend\n"
|