class KPM::Database
def generate_insert_statement(tables)
def generate_insert_statement(tables) statements = [] @logger.info "\e[32mGenerating statements\e[0m" tables.each_key do |table_name| table = tables[table_name] next unless !table[:rows].nil? && !table[:rows].empty? columns_names = table[:col_names].join(',').gsub(/'/, '') rows = [] table[:rows].each do |row| rows << row.map do |value| case value when Symbol value.to_s when Blob value.value else escaped_value = value.to_s.gsub(/['"]/, "'" => "\\'", '"' => '\\"') .gsub('\N{LINE FEED}', "\n") .gsub('\N{VERTICAL LINE}', '|') "'#{escaped_value}'" end end.join(',') end # Break the insert statement into small chunks to avoid timeouts rows.each_slice(1000).each do |subset_of_rows| value_data = subset_of_rows.map { |row| "(#{row})" }.join(',') statements << { query: build_insert_statement(table_name, columns_names, value_data, subset_of_rows.size), qty_to_insert: subset_of_rows.size, table_name: table_name, table_data: table } end end statements end