Sha256: 14519829621eff35c0dbf850f1973a97238f24b6ec69164ddcc8126145547344

Contents?: true

Size: 1.53 KB

Versions: 12

Compression:

Stored size: 1.53 KB

Contents

class ActiveRecord::Base

  def self.bulk_insert!(record_list)
    return if record_list.empty?
    
    adapter_type = connection.adapter_name.downcase.to_sym
    case adapter_type
    when :mysql
      raise NotImplementedError, "Not implemented type '#{adapter_type}'"
    when :sqlite
      sqlite_bulk_insert(record_list)
    when :postgresql
      postgresql_bulk_insert(record_list)
    when :oracle_enhanced
      oracle_bulk_insert(record_list)
    else
      raise NotImplementedError, "Unknown adapter type '#{adapter_type}'"
    end
    
  end
  
  protected
  def self.convert_record_list(record_list)
    key_list = record_list.map(&:keys).flatten.uniq.sort

    value_list = record_list.map do |rec|
      list = []
      key_list.each {|key| list <<  ActiveRecord::Base.connection.quote(rec[key]) }
      list
    end

    return [key_list, value_list]
  end
  
  def self.sqlite_bulk_insert(record_list)
    self.create record_list
  end
  
  def self.postgresql_bulk_insert(record_list)
    key_list, value_list = convert_record_list(record_list)        
    sql = "INSERT INTO #{self.table_name} (#{key_list.join(", ")}) VALUES #{value_list.map {|rec| "(#{rec.join(", ")})" }.join(" ,")}"
    self.connection.insert_sql(sql)
  end
  
  def self.oracle_bulk_insert(record_list)
    key_list, value_list = convert_record_list(record_list)        
    sql = "INSERT INTO #{self.table_name} (#{key_list.join(", ")}) VALUES (bind variables #{value_list.map {|rec| "(#{rec.join(", ")})" }.join(" ,")})"
    self.connection.insert_sql(sql)
  end
  
end

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
notifiable-rails-0.19.0 lib/notifiable/active_record.rb
notifiable-rails-0.18.0 lib/notifiable/active_record.rb
notifiable-rails-0.17.0 lib/notifiable/active_record.rb
notifiable-rails-0.16.0 lib/notifiable/active_record.rb
notifiable-rails-0.15.3 lib/notifiable/active_record.rb
notifiable-rails-0.15.2 lib/notifiable/active_record.rb
notifiable-rails-0.15.1 lib/notifiable/active_record.rb
notifiable-rails-0.15.0 lib/notifiable/active_record.rb
notifiable-rails-0.14.1 lib/notifiable/active_record.rb
notifiable-rails-0.14.0 lib/notifiable/active_record.rb
notifiable-rails-0.13.0 lib/notifiable/active_record.rb
notifiable-rails-0.12.1 lib/notifiable/active_record.rb