lib/lhm/table.rb in lhm-1.1.0 vs lib/lhm/table.rb in lhm-1.2.0
- old
+ new
@@ -1,6 +1,6 @@
-# Copyright (c) 2011, SoundCloud Ltd., Rany Keddo, Tobias Bielohlawek, Tobias
+# Copyright (c) 2011 - 2013, SoundCloud Ltd., Rany Keddo, Tobias Bielohlawek, Tobias
# Schmidt
require 'lhm/sql_helper'
module Lhm
@@ -35,25 +35,26 @@
@schema_name = connection.current_database
@connection = connection
end
def ddl
- sql = "show create table `#{ @table_name }`"
- specification = nil
- @connection.execute(sql).each { |row| specification = row.last }
- specification
+ @connection.show_create(@table_name)
end
def parse
schema = read_information_schema
Table.new(@table_name, extract_primary_key(schema), ddl).tap do |table|
schema.each do |defn|
- table.columns[defn["COLUMN_NAME"]] = {
- :type => defn["COLUMN_TYPE"],
- :is_nullable => defn["IS_NULLABLE"],
- :column_default => defn["COLUMN_DEFAULT"]
+ column_name = struct_key(defn, "COLUMN_NAME")
+ column_type = struct_key(defn, "COLUMN_TYPE")
+ is_nullable = struct_key(defn, "IS_NULLABLE")
+ column_default = struct_key(defn, "COLUMN_DEFAULT")
+ table.columns[defn[column_name]] = {
+ :type => defn[column_type],
+ :is_nullable => defn[is_nullable],
+ :column_default => defn[column_default]
}
end
extract_indices(read_indices).each do |idx, columns|
table.indices[idx] = columns
@@ -65,32 +66,45 @@
def read_information_schema
@connection.select_all %Q{
select *
from information_schema.columns
- where table_name = "#{ @table_name }"
- and table_schema = "#{ @schema_name }"
+ where table_name = '#{ @table_name }'
+ and table_schema = '#{ @schema_name }'
}
end
def read_indices
@connection.select_all %Q{
show indexes from `#{ @schema_name }`.`#{ @table_name }`
- where key_name != "PRIMARY"
+ where key_name != 'PRIMARY'
}
end
def extract_indices(indices)
- indices.map { |row| [row["Key_name"], row["Column_name"]] }.
+ indices.
+ map do |row|
+ key_name = struct_key(row, "Key_name")
+ column_name = struct_key(row, "COLUMN_NAME")
+ [row[key_name], row[column_name]]
+ end.
inject(Hash.new { |h, k| h[k] = []}) do |memo, (idx, column)|
memo[idx] << column
memo
end
end
def extract_primary_key(schema)
- cols = schema.select { |defn| defn["COLUMN_KEY"] == "PRI" }
- keys = cols.map { |defn| defn["COLUMN_NAME"] }
+ cols = schema.select do |defn|
+ column_key = struct_key(defn, "COLUMN_KEY")
+ defn[column_key] == "PRI"
+ end
+
+ keys = cols.map do |defn|
+ column_name = struct_key(defn, "COLUMN_NAME")
+ defn[column_name]
+ end
+
keys.length == 1 ? keys.first : keys
end
end
end
end