4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
# 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
[number_of_inserts, []]
end
|