class DumpTruck::Mysql::Translator
Constants
- FLOAT
- INTEGER
- NON_QUOTE
- NUMBER
- TABLE_FIELDS_REGEX
- TABLE_NAME_REGEX
- TABLE_VALUES_REGEX
Public Instance Methods
extract_insert(line)
click to toggle source
# File lib/dump_truck/mysql/translator.rb, line 24 def extract_insert(line) fields = extract_fields(line) [fields, extract_rows(line, fields)] end
extract_table(line)
click to toggle source
# File lib/dump_truck/mysql/translator.rb, line 16 def extract_table(line) line.scan(TABLE_NAME_REGEX).flatten.first end
generate_insert(table, keys, data)
click to toggle source
# File lib/dump_truck/mysql/translator.rb, line 29 def generate_insert(table, keys, data) "INSERT INTO `#{table}` (#{stringify_keys(keys)}) VALUES #{stringify_values(keys, data)};\n" end
insert?(line)
click to toggle source
# File lib/dump_truck/mysql/translator.rb, line 20 def insert?(line) line =~ TABLE_FIELDS_REGEX end
table?(line)
click to toggle source
# File lib/dump_truck/mysql/translator.rb, line 12 def table?(line) line =~ TABLE_NAME_REGEX end
Private Instance Methods
extract_fields(line)
click to toggle source
# File lib/dump_truck/mysql/translator.rb, line 35 def extract_fields(line) fields_string = line.scan(TABLE_FIELDS_REGEX).flatten.first fields_string.split(', ').map{|field| field[1..-2]} end
extract_null(scanner)
click to toggle source
# File lib/dump_truck/mysql/translator.rb, line 92 def extract_null(scanner) scanner.scan(/NULL/) nil end
extract_number(scanner)
click to toggle source
# File lib/dump_truck/mysql/translator.rb, line 76 def extract_number(scanner) if (number = scanner.scan(FLOAT)) number.to_f else scanner.scan(INTEGER).to_i end end
extract_rows(line, fields)
click to toggle source
# File lib/dump_truck/mysql/translator.rb, line 40 def extract_rows(line, fields) values_string = line.scan(TABLE_VALUES_REGEX).flatten.first data = extract_values(values_string, fields, line) data.map{|values| Hash[fields.zip(values)]} end
extract_string(scanner)
click to toggle source
# File lib/dump_truck/mysql/translator.rb, line 84 def extract_string(scanner) scanner.getch string = scanner.scan(NON_QUOTE) scanner.getch string end
extract_values(values_string, fields, line)
click to toggle source
# File lib/dump_truck/mysql/translator.rb, line 46 def extract_values(values_string, fields, line) scanner = StringScanner.new(values_string) data = [] values = [] until(scanner.eos?) values << case scanner.peek(1) when NUMBER extract_number(scanner) when "'" extract_string(scanner) when 'N' extract_null(scanner) when ')' scanner.getch data << values values = [] next when /[(, ]/ scanner.getch next else context = scanner.pre_match[-60..-1] + scanner.peek(1) + scanner.rest[0..60] raise "Unexpected character #{scanner.peek(1).inspect} at #{scanner.pos}. Last values: #{values.inspect}. Context: #{context.inspect}. Line: #{line.inspect}" end end data end
stringify_field(value)
click to toggle source
# File lib/dump_truck/mysql/translator.rb, line 109 def stringify_field(value) case value when nil 'NULL' when Numeric value.to_s when String "'#{value}'" else raise "Unable to stringify #{value.inspect}" end end
stringify_keys(keys)
click to toggle source
# File lib/dump_truck/mysql/translator.rb, line 97 def stringify_keys(keys) keys.map{|key| "`#{key}`"}.join(', ') end
stringify_values(keys, data)
click to toggle source
# File lib/dump_truck/mysql/translator.rb, line 101 def stringify_values(keys, data) data.map do |datum| values = datum.values_at(*keys) values_string = values.map{|value| stringify_field(value)}.join(',') "(#{values_string})" end.join(',') end