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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
# File 'lib/arjdbc/postgresql/schema_statements.rb', line 9
def foreign_keys(table_name)
scope = quoted_scope(table_name)
fk_info = internal_exec_query(" SELECT t2.oid::regclass::text AS to_table, a1.attname AS column, a2.attname AS primary_key, c.conname AS name, c.confupdtype AS on_update, c.confdeltype AS on_delete, c.convalidated AS valid, c.condeferrable AS deferrable, c.condeferred AS deferred, c.conkey, c.confkey, c.conrelid, c.confrelid\n FROM pg_constraint c\n JOIN pg_class t1 ON c.conrelid = t1.oid\n JOIN pg_class t2 ON c.confrelid = t2.oid\n JOIN pg_attribute a1 ON a1.attnum = c.conkey[1] AND a1.attrelid = t1.oid\n JOIN pg_attribute a2 ON a2.attnum = c.confkey[1] AND a2.attrelid = t2.oid\n JOIN pg_namespace t3 ON c.connamespace = t3.oid\n WHERE c.contype = 'f'\n AND t1.relname = \#{scope[:name]}\n AND t3.nspname = \#{scope[:schema]}\n ORDER BY c.conname\n SQL\n\n fk_info.map do |row|\n to_table = Utils.unquote_identifier(row[\"to_table\"])\n # conkey = row[\"conkey\"].scan(/\\d+/).map(&:to_i)\n # confkey = row[\"confkey\"].scan(/\\d+/).map(&:to_i)\n conkey = row[\"conkey\"]\n confkey = row[\"confkey\"]\n\n if conkey.size > 1\n column = column_names_from_column_numbers(row[\"conrelid\"], conkey)\n primary_key = column_names_from_column_numbers(row[\"confrelid\"], confkey)\n else\n column = Utils.unquote_identifier(row[\"column\"])\n primary_key = row[\"primary_key\"]\n end\n\n options = {\n column: column,\n name: row[\"name\"],\n primary_key: primary_key\n }\n\n options[:on_delete] = extract_foreign_key_action(row[\"on_delete\"])\n options[:on_update] = extract_foreign_key_action(row[\"on_update\"])\n options[:deferrable] = extract_constraint_deferrable(row[\"deferrable\"], row[\"deferred\"])\n\n options[:validate] = row[\"valid\"]\n\n ForeignKeyDefinition.new(table_name, to_table, options)\n end\nend\n", "SCHEMA", allow_retry: true, materialize_transactions: false)
|