Module: ForeignKeyChecker::Utils

Defined in:
lib/foreign_key_checker/utils.rb,
lib/foreign_key_checker/utils/belongs_to.rb

Defined Under Namespace

Modules: BelongsTo Classes: Result, UnsupportedConnectionAdapter

Class Method Summary collapse

Class Method Details

.get_columns(connection) ⇒ Object



126
127
128
129
130
# File 'lib/foreign_key_checker/utils.rb', line 126

def self.get_columns(connection)
  get_tables.each_with_object({}) do |table, object|
    object[table] = connection.columns(table)
  end
end

.get_foreign_keys(model = ActiveRecord::Base) ⇒ Object



10
11
12
13
14
15
16
# File 'lib/foreign_key_checker/utils.rb', line 10

def self.get_foreign_keys(model = ActiveRecord::Base)
  adapter = model.connection_db_config.configuration_hash[:adapter]
  raise(UnsupportedConnectionAdapter, adapter) unless %w[postgresql mysql2 sqlserver sqlite3].include?(adapter)

  connection = model.connection
  send("get_#{adapter}_foreign_keys", connection)
end

.get_foreign_keys_hash(model = ActiveRecord::Base) ⇒ Object



18
19
20
21
22
23
# File 'lib/foreign_key_checker/utils.rb', line 18

def self.get_foreign_keys_hash(model = ActiveRecord::Base)
  get_foreign_keys(model).to_a.each_with_object({}) do |datum, obj|
    obj[datum.to_table] ||= []
    obj[datum.to_table].push(datum)
  end
end

.get_mysql2_foreign_keys(connection) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/foreign_key_checker/utils.rb', line 41

def self.get_mysql2_foreign_keys(connection)
  res = connection.select_all <<-SQL
    SELECT
      fks.TABLE_NAME AS from_table,
      fks.COLUMN_NAME AS from_column,
      fks.REFERENCED_TABLE_NAME AS to_table,
      fks.REFERENCED_COLUMN_NAME AS to_column
    FROM information_schema.KEY_COLUMN_USAGE AS fks
    INNER JOIN information_schema.REFERENTIAL_CONSTRAINTS rules ON rules.CONSTRAINT_NAME = fks.CONSTRAINT_NAME
    WHERE
      fks.CONSTRAINT_SCHEMA = DATABASE()
      AND rules.CONSTRAINT_SCHEMA = DATABASE();
  SQL
  res.to_a.map{|i| Result.new(i) }
end

.get_mysql2_tables(connection) ⇒ Object



110
111
112
# File 'lib/foreign_key_checker/utils.rb', line 110

def self.get_mysql2_tables(connection)
  connection.select_all("SELECT table_name FROM information_schema.tables WHERE TABLE_SCHEMA = '#{connection.current_database}'").to_a.pluck('table_name')
end

.get_postgresql_foreign_keys(connection) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/foreign_key_checker/utils.rb', line 57

def self.get_postgresql_foreign_keys(connection)
  res = connection.select_all <<-SQL
    SELECT
      tc.table_name AS from_table,
      kcu.column_name AS from_column,
      ccu.table_name AS to_table,
      ccu.column_name AS to_column
    FROM
      information_schema.table_constraints AS tc
      JOIN information_schema.key_column_usage AS kcu
        ON tc.constraint_name = kcu.constraint_name
        AND tc.table_schema = kcu.table_schema
      JOIN information_schema.constraint_column_usage AS ccu
        ON ccu.constraint_name = tc.constraint_name
        AND ccu.table_schema = tc.table_schema
    WHERE tc.constraint_type = 'FOREIGN KEY';
  SQL
  res.to_a.map{ |i| Result.new(i) }
end

.get_postgresql_tables(connection) ⇒ Object



114
115
116
# File 'lib/foreign_key_checker/utils.rb', line 114

def self.get_postgresql_tables(connection)
  connection.select_all("SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema'").to_a.pluck('tablename')
end

.get_sqlite3_foreign_keys(connection) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/foreign_key_checker/utils.rb', line 25

def self.get_sqlite3_foreign_keys(connection)
  res = connection.select_all <<-SQL
    SELECT
      m.name as from_table,
      p."from" as from_column,
      p."table" as to_table,
      p."to" as to_column
    FROM
      sqlite_master m
      JOIN pragma_foreign_key_list(m.name) p ON 1
    WHERE m.type = 'table'
    ORDER BY m.name ;
  SQL
  res.to_a.map{|i| Result.new(i) }
end

.get_sqlite3_tables(connection) ⇒ Object



118
119
120
# File 'lib/foreign_key_checker/utils.rb', line 118

def self.get_sqlite3_tables(connection)
  connection.select_all("SELECT name FROM sqlite_master WHERE type='table'").to_a.pluck('name') - ['sqlite_sequence']
end

.get_sqlserver_foreign_keys(connection) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/foreign_key_checker/utils.rb', line 77

def self.get_sqlserver_foreign_keys(connection)
  res = connection.select_all <<-SQL
    SELECT  obj.name AS FK_NAME,
        sch.name AS [schema_name],
        tab1.name AS [from_table],
        col1.name AS [from_column],
        tab2.name AS [to_table],
        col2.name AS [to_column]
    FROM sys.foreign_key_columns fkc
    INNER JOIN sys.objects obj
        ON obj.object_id = fkc.constraint_object_id
    INNER JOIN sys.tables tab1
        ON tab1.object_id = fkc.parent_object_id
    INNER JOIN sys.schemas sch
        ON tab1.schema_id = sch.schema_id
    INNER JOIN sys.columns col1
        ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id
    INNER JOIN sys.tables tab2
        ON tab2.object_id = fkc.referenced_object_id
    INNER JOIN sys.columns col2
        ON col2.column_id = referenced_column_id AND col2.object_id = tab2.object_id
  SQL
  res.to_a.map { |i| Result.new(i) }
end

.get_sqlserver_tables(connection) ⇒ Object



122
123
124
# File 'lib/foreign_key_checker/utils.rb', line 122

def self.get_sqlserver_tables(connection)
  connection.tables
end

.get_tables(model = ActiveRecord::Base) ⇒ Object



102
103
104
105
106
107
108
# File 'lib/foreign_key_checker/utils.rb', line 102

def self.get_tables(model = ActiveRecord::Base)
  adapter = model.connection_db_config.configuration_hash[:adapter]
  raise(UnsupportedConnectionAdapter, adapter) unless %w[postgresql mysql2 sqlite3 sqlserver].include?(adapter)

  connection = model.connection
  send("get_#{adapter}_tables", connection)
end