module ActiveRecord::Import::SQLServerAdapter

Public Instance Methods

insert_many( sql, values, options = {}, *args ) click to toggle source
# File lib/activerecord-import/adapters/sqlserver_adapter.rb, line 4
def insert_many( sql, values, options = {}, *args )
  base_sql, post_sql = if sql.is_a?( String )
    [sql, '']
  elsif sql.is_a?( Array )
    [sql.shift, sql.join( ' ' )]
  end

  columns_names = base_sql.match(/INSERT INTO (\[.*\]) (\(.*\)) VALUES /)[2][1..-1].split(',')
  sql_id_index  = columns_names.index('[id]')
  sql_noid      = if sql_id_index.nil?
    nil
  else
    (sql_id_index == (columns_names.length - 1) ? base_sql.clone.gsub(/\[id\]/, '') : base_sql.clone.gsub(/\[id\],/, ''))
  end

  max = max_allowed_packet

  number_of_inserts = 0
  while !(batch = values.shift(max)).blank? do
    if sql_id_index
      null_ids     = []
      supplied_ids = []

      batch.each do |value|
        values_sql = value[1..-2].split(',')
        if values_sql[sql_id_index] == "NULL"
          values_sql.delete_at(sql_id_index)
          null_ids << "(#{values_sql.join(',')})"
        else
          supplied_ids << value
        end
      end

      unless null_ids.empty?
        number_of_inserts += 1
        sql2insert = sql_noid + null_ids.join( ',' ) + post_sql
        insert( sql2insert, *args )
      end
      unless supplied_ids.empty?
        number_of_inserts += 1
        sql2insert = base_sql + supplied_ids.join( ',' ) + post_sql
        insert( sql2insert, *args )
      end
    else
      number_of_inserts += 1
      sql2insert = base_sql + batch.join( ',' ) + post_sql
      insert( sql2insert, *args )
    end
  end

  ActiveRecord::Import::Result.new([], number_of_inserts, [], [])
end
max_allowed_packet() click to toggle source
# File lib/activerecord-import/adapters/sqlserver_adapter.rb, line 57
def max_allowed_packet
  1000
end