class DBLeftovers::MysqlDatabaseInterface
Public Class Methods
new(conn=nil, database_name=nil)
click to toggle source
# File lib/db_leftovers/mysql_database_interface.rb, line 5 def initialize(conn=nil, database_name=nil) @conn = conn || ActiveRecord::Base.connection @db_name = database_name || ActiveRecord::Base.configurations[Rails.env]['database'] end
Public Instance Methods
execute_drop_foreign_key(constraint_name, from_table, from_column)
click to toggle source
# File lib/db_leftovers/mysql_database_interface.rb, line 78 def execute_drop_foreign_key(constraint_name, from_table, from_column) execute_sql %{ALTER TABLE #{from_table} DROP FOREIGN KEY #{constraint_name}} end
execute_drop_index(table_name, index_name)
click to toggle source
# File lib/db_leftovers/mysql_database_interface.rb, line 71 def execute_drop_index(table_name, index_name) sql = <<-EOQ DROP INDEX #{index_name} ON #{table_name} EOQ execute_sql(sql) end
lookup_all_constraints()
click to toggle source
# File lib/db_leftovers/mysql_database_interface.rb, line 65 def lookup_all_constraints # TODO: Constrain it to the database for the current Rails project: # MySQL doesn't support CHECK constraints: return [] end
lookup_all_foreign_keys()
click to toggle source
# File lib/db_leftovers/mysql_database_interface.rb, line 37 def lookup_all_foreign_keys # TODO: Support multi-column foreign keys: ret = {} sql = <<-EOQ SELECT c.constraint_name, c.table_name, k.column_name, c.referenced_table_name, k.referenced_column_name, c.delete_rule FROM information_schema.referential_constraints c, information_schema.key_column_usage k WHERE c.constraint_schema = k.constraint_schema AND c.constraint_name = k.constraint_name AND c.constraint_schema IN (#{target_databases_quoted}) EOQ @conn.select_rows(sql).each do |constr_name, from_table, from_column, to_table, to_column, del_type| del_type = case del_type when 'RESTRICT'; nil when 'CASCADE'; :cascade when 'SET NULL'; :set_null else; raise "Unknown del type: #{del_type}" end ret[constr_name] = ForeignKey.new(from_table, from_column, to_table, to_column, :name => constr_name, :on_delete => del_type) end return ret end
lookup_all_indexes()
click to toggle source
# File lib/db_leftovers/mysql_database_interface.rb, line 10 def lookup_all_indexes ret = {} @conn.select_values("SHOW TABLES").each do |table_name| indexes = {} # Careful, MySQL automatically creates indexes whenever you define a foreign key. # Use our foreign key naming convention to ignore these: @conn.select_rows("SHOW INDEXES FROM #{table_name} WHERE key_name NOT LIKE 'fk_%'").each do |_, non_unique, key_name, seq_in_index, column_name, collation, cardinality, sub_part, packed, has_nulls, index_type, comment| unless key_name == 'PRIMARY' # Combine rows for multi-column indexes h = (indexes[key_name] ||= { unique: non_unique == 0, name: key_name, columns: {} }) h[:columns][seq_in_index.to_i] = column_name end end indexes.each do |index_name, h| ret[index_name] = Index.new( table_name, h[:columns].sort.map{|k, v| v}, unique: h[:unique], name: h[:name] ) end end return ret end
Private Instance Methods
target_databases_quoted()
click to toggle source
# File lib/db_leftovers/mysql_database_interface.rb, line 84 def target_databases_quoted case @db_name when Array @db_name.map{|x| "'#{x}'"}.join(", ") else "'#{@db_name}'" end end