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