class KPM::Database
def execute_insert_statement(table_name, query, qty_to_insert, _table_data, record_id = nil)
def execute_insert_statement(table_name, query, qty_to_insert, _table_data, record_id = nil) query = "set #{record_id[:variable]}=#{record_id[:value]}; #{query}" unless record_id.nil? query = "SET sql_mode = ''; SET autocommit=0; #{query} COMMIT; SHOW WARNINGS;" File.open(STATEMENT_TMP_FILE, 'w') do |s| s.puts query end response = `#{@mysql_command_line} < "#{STATEMENT_TMP_FILE}" 2>&1` if response.include? 'ERROR' @logger.error "\e[91;1mTransaction that fails to be executed (first 1,000 chars)\e[0m" # Queries can be really big (bulk imports) @logger.error "\e[91m#{query[0..1000]}\e[0m" if response.include?('Table') && response.include?('doesn\'t exist') @logger.warn "Skipping unknown table #{table_name}...." else raise Interrupt, "Importing table #{table_name}...... \e[91;1m#{response}\e[0m" end end if response.include? 'LAST_INSERT_ID' @logger.info "\e[32mImporting table #{table_name}...... Row 1 of #{qty_to_insert} success\e[0m" return response.split("\n")[1] end if response.include? 'ROW_COUNT' # Typically, something like: "mysql: [Warning] Using a password on the command line interface can be insecure.\nROW_COUNT()\n3\n" # With warning: "mysql: [Warning] Using a password on the command line interface can be insecure.\nROW_COUNT()\n1743\nLevel\tCode\tMessage\nWarning\t1264\tOut of range value for column 'amount' at row 582\n" response_msg = response.split("\n") idx_row_count_inserted = response_msg.index('ROW_COUNT()') + 1 row_count_inserted = response_msg[idx_row_count_inserted] @logger.info "\e[32mImporting table #{table_name}...... Row #{row_count_inserted || 1} of #{qty_to_insert} success\e[0m" if idx_row_count_inserted < response_msg.size - 1 warning_msg = response_msg[response_msg.size - 1] @logger.warn "\e[91m#{warning_msg}\e[0m" end end true end