Class: MysqlDumpToJson::MySQL::Reader

Inherits:
Object
  • Object
show all
Defined in:
lib/mysql_dump_to_json/mysql/reader.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(database, opts = {}) ⇒ Reader

Returns a new instance of Reader.



12
13
14
15
16
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 12

def initialize(database, opts = {})
  @database = database
  @tables = {}
  @opts = opts
end

Instance Attribute Details

#databaseObject (readonly)

Returns the value of attribute database.



10
11
12
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 10

def database
  @database
end

#optsObject (readonly)

Returns the value of attribute opts.



10
11
12
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 10

def opts
  @opts
end

#source_dumpObject (readonly)

Returns the value of attribute source_dump.



10
11
12
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 10

def source_dump
  @source_dump
end

#statementsObject (readonly)

Returns the value of attribute statements.



10
11
12
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 10

def statements
  @statements
end

Instance Method Details

#build_databaseObject

Creating the database as objects



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 26

def build_database
  @statements.each_with_index do |sql_statement|
    case sql_statement
    when /^CREATE +DATABASE/i,
        /^USE/i,
        /^DROP +TABLE/i,
        /^LOCK TABLES/i,
        /^UNLOCK TABLES/i, ';'
      next
    when /^CREATE +TABLE/i
      create_table(sql_statement)
    when /^INSERT +INTO/i
      insert_into(sql_statement)
    else
      warn " !!! SQL statement found that is not handled by this gem: #{sql_statement.split("\n").first}"
    end
  end
  @database
end

#compress_sql_into_statementsObject

Compressing the source into distinct SQL statements



115
116
117
118
119
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 115

def compress_sql_into_statements
  str = remove_block_comments(@source_dump)
  uncommented = strip_comments(str)
  uncommented.split(/(?<=;)[\r\n]/)
end

#create_table(sql_statement) ⇒ Object



46
47
48
49
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 46

def create_table(sql_statement)
  table = create_table_definition(sql_statement)
  @database.create_table(table[:name], table[:fields], table[:keys])
end

#create_table_definition(sql_statement) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 51

def create_table_definition(sql_statement)
  table = { name: nil, fields: [], keys: [] }
  sql_statement.split("\n").each do |line|
    case line.strip
    when /^CREATE +TABLE +/i
      table[:name] = table_name_from_create(line)
    when /^PRIMARY +KEY/i, /^FOREIGN +KEY/i
      table[:keys] << line.strip.delete_suffix(',')
    when ');'
    else
      table[:fields] << field_from_line(line)
    end
  end
  table
end

#field_from_line(line) ⇒ Object



71
72
73
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 71

def field_from_line(line)
  line.strip.scan(/[a-z0-9_$]+/i).first
end

#fields_from_insert(sql_statement) ⇒ Object



88
89
90
91
92
93
94
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 88

def fields_from_insert(sql_statement)
  before_values_section = sql_statement.split(/values/i).first
  field_section = before_values_section.gsub(/^INSERT INTO ['`]?#{table_name_from_insert(sql_statement)}['`]?/i,'').strip
  return false if field_section.empty? || field_section.nil?

  sql_statement.split(/[()]/)[1].split(',')
end

#ingest(mysql_string) ⇒ Object



18
19
20
21
22
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 18

def ingest(mysql_string)
  @source_dump = mysql_string
  @statements = compress_sql_into_statements
  build_database
end

#insert_into(sql_statement) ⇒ Object



75
76
77
78
79
80
81
82
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 75

def insert_into(sql_statement)
  table_name = table_name_from_insert(sql_statement)
  table = @database.tables.fetch(table_name)
  insert_fields = fields_from_insert(sql_statement) || table.fields
  value_chunks_from_insert(sql_statement).each do |row_ary|
    table.add_row(insert_fields, row_ary)
  end
end

#parse_values_row_with_escape(values_row) ⇒ Object



104
105
106
107
108
109
110
111
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 104

def parse_values_row_with_escape(values_row)
  values = values_row.scan(/('.*?'(?=,)|NULL)/).flatten
  values.map do |value|
    value.delete_suffix("'") # Remove the enacapsulating quotes
         .delete_prefix("'")
         .gsub("\\'", "'") # Remove the double escaped interior single quotes
  end
end

#remove_block_comments(str) ⇒ Object



129
130
131
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 129

def remove_block_comments(str)
  str.gsub(/\/\*.*?\*\//m,'')
end

#strip_comments(str) ⇒ Object



121
122
123
124
125
126
127
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 121

def strip_comments(str)
  str.split(/[\n\r]+/).reject do |line|
    line.nil? ||
        line.empty? ||
        line.start_with?('--')
  end.join("\n")
end

#table_name_from_create(str) ⇒ Object



67
68
69
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 67

def table_name_from_create(str)
  str.strip.gsub(/CREATE +TABLE +`?/i,'').delete_suffix("(").strip.delete_suffix('`')
end

#table_name_from_insert(sql_statement) ⇒ Object



84
85
86
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 84

def table_name_from_insert(sql_statement)
  sql_statement.split(/[ ()`]+/)[2]
end

#value_chunks_from_insert(sql_statement) ⇒ Object



96
97
98
99
100
101
102
# File 'lib/mysql_dump_to_json/mysql/reader.rb', line 96

def value_chunks_from_insert(sql_statement)
  values_str = sql_statement.split(/ VALUES +/i).last
  values_ary = values_str[1..-3].split(/\)\s*,\s*\(/)
  values_ary.map do |values_row|
    parse_values_row_with_escape(values_row)
  end
end