class JunglePath::DBAccess::Import::Insert

Attributes

db[R]

Public Class Methods

new(config, logger=nil) click to toggle source
# File lib/jungle_path/db_access/import/insert.rb, line 10
def initialize(config, logger=nil)
  @logger = logger
  @path = config.import_file_path
  #@db = nil
  #if config.postgresql
    @db = JunglePath::DBAccess::IO::DB.new(config, logger)
  #end
  reset
end

Public Instance Methods

_model(model) click to toggle source
# File lib/jungle_path/db_access/import/insert.rb, line 20
def _model(model)
  table_name = model.class.table_name
  file = open_file(model)
  @counters[table_name] += 1
  if model.respond_to?(:id) and model.id == nil
    model.id = @counters[table_name]
  end
  file.puts model_values_to_string(model)
  puts "    #{table_name} rows processed count: #{@counters[table_name]}." if @counters[table_name] % 1000 == 0
  model
end
close_files() click to toggle source
# File lib/jungle_path/db_access/import/insert.rb, line 45
def close_files
  @files.each do |key, file|
    unless file.closed?
      file.fsync
      file.close
      puts "    #{key} rows processed count: #{@counters[key]}."
    end
  end
end
json_dump(value) click to toggle source
# File lib/jungle_path/db_access/import/insert.rb, line 92
def json_dump(value)
  if value.class == Hash
    json_dump_hash(value)
  elsif value.class == Array
    json_dump_array(value)
  else
    value_to_string(value, true)
  end
end
json_dump_array(array) click to toggle source
# File lib/jungle_path/db_access/import/insert.rb, line 118
def json_dump_array(array)
  values = []
  array.each do |value|
    if value.class == Hash
      #a << json_dump_hash(value)
      a << "\"#{key}\":#{json_dump_hash(value)}"
    elsif value.class == Array
      #a << json_dump_array(value)
      a << "\"#{key}\":#{json_dump_array(value)}"
    else
      values << "#{value_to_string(value, true)}"
    end
  end
  "[#{values.join(',')}]"
end
json_dump_hash(hash) click to toggle source
# File lib/jungle_path/db_access/import/insert.rb, line 102
def json_dump_hash(hash)
  a = []
  hash.each do |key, value|
    if value.class == Hash
      #a << json_dump_hash(value)
      a << "\"#{key}\":#{json_dump_hash(value)}"
    elsif value.class == Array
      #a << json_dump_array(value)
      a << "\"#{key}\":#{json_dump_array(value)}"
    else
      a << "\"#{key}\":#{value_to_string(value, true)}"
    end
  end
  "{#{a.join(',')}}"
end
model_values_to_string(model) click to toggle source
# File lib/jungle_path/db_access/import/insert.rb, line 71
def model_values_to_string(model)
  values = []
  model._columns.each do |key, column|
    value = model._values[key]
    if column.base_type == :json or column.base_type == :jsonb
      values << json_dump(value)
    else
      values << value_to_string(value)
    end
  end
  values.join("\t")
end
open_file(model) click to toggle source
# File lib/jungle_path/db_access/import/insert.rb, line 32
def open_file(model)
  table_name = model.class.table_name
  file = @files[table_name]
  unless file
    file = File.open(JunglePath::DBAccess::Import.data_file_name(@path, table_name), 'a')
    @models[table_name] = model
    @files[table_name] = file
    @counters[table_name] = 0
    puts "writing file: #{table_name}."
  end
  file
end
reset() click to toggle source
# File lib/jungle_path/db_access/import/insert.rb, line 55
def reset
  @models = {}
  @files = {}
  @counters = {}
end
string_fix(value) click to toggle source
# File lib/jungle_path/db_access/import/insert.rb, line 84
def string_fix(value)
  v = value.gsub('\\', '\\\\\\\\')
  v = v.gsub('"', '\\\\\"')
  v = v.gsub("\n", '\n')
  v = v.gsub("\r", '\r')
  v = v.gsub("\t", '\t')
end
value_to_string(value, json=false) click to toggle source
# File lib/jungle_path/db_access/import/insert.rb, line 134
def value_to_string value, json=false
  v = nil
  if value == nil
    v = '\N'
  elsif value.class == String
    v = string_fix(value)
    v = "\"#{v}\"" if json
  elsif value.class == DateTime
    v = value.strftime("%Y-%m-%d %H:%M:%S.%6N")
    v = "\"#{v}\"" if json
  elsif value.class == Date
    v = value.strftime("%Y-%m-%d")
    v = "\"#{v}\"" if json
  elsif value.class == Fixnum
    v = "#{value}"
  elsif value.class == Float
    v = "#{value}"
  elsif value.class == Integer
    v = "#{value}"
  elsif value.class == TrueClass
    v = "t"
    v = "\"#{v}\"" if json
  elsif value.class == FalseClass
    v = "f"
    v = "\"#{v}\"" if json
  else
    v = "#{value}"
    v = "\"#{v}\"" if json
  end
  v
end
write_to_db() click to toggle source
# File lib/jungle_path/db_access/import/insert.rb, line 61
def write_to_db
  if @db
    @models.each do |key, model|
      file_name = JunglePath::DBAccess::Import.data_file_name(@path, model.class.table_name)
      @db.copy.into_table model.class, file_name
      File.delete file_name
    end
  end
end