activerecord_save_many 0.6.2 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/activerecord_save_many/save_many.rb +9 -6
- data/spec/activerecord_save_many_spec.rb +21 -0
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.7.0
|
@@ -4,10 +4,10 @@ module ActiveRecord
|
|
4
4
|
module SaveMany
|
5
5
|
MAX_QUERY_SIZE = 1024 * 1024
|
6
6
|
# options for the create_many method
|
7
|
-
OPTIONS_KEYS = [:columns, :max_rows, :async, :ignore, :update, :updates].to_set
|
7
|
+
OPTIONS_KEYS = [:columns, :max_rows, :replace, :async, :ignore, :update, :updates].to_set
|
8
8
|
|
9
|
-
# options for the
|
10
|
-
SQL_OPTIONS_KEYS = [:async, :ignore, :update, :updates].to_set
|
9
|
+
# options for the save_many_sql method
|
10
|
+
SQL_OPTIONS_KEYS = [:replace, :async, :ignore, :update, :updates].to_set
|
11
11
|
|
12
12
|
class << self
|
13
13
|
attr_accessor :default_max_rows
|
@@ -29,6 +29,7 @@ module ActiveRecord
|
|
29
29
|
def check_options(permitted, options)
|
30
30
|
unknown_keys = options.keys.to_set - permitted
|
31
31
|
raise "unknown options: #{unknown_keys.to_a.join(", ")}" if !unknown_keys.empty?
|
32
|
+
raise "can't :replace and :ignore||:update||:async" if options[:replace] && (options[:ignore] || options[:update] || options[:updates] || options[:async])
|
32
33
|
end
|
33
34
|
module_function :check_options
|
34
35
|
|
@@ -91,7 +92,8 @@ module ActiveRecord
|
|
91
92
|
table_name,
|
92
93
|
columns,
|
93
94
|
rows,
|
94
|
-
{ :
|
95
|
+
{ :replace=>options[:replace],
|
96
|
+
:ignore=>options[:ignore],
|
95
97
|
:async=>options[:async] && !Functions::disable_async?(),
|
96
98
|
:update=>options[:update] || options[:updates],
|
97
99
|
:updates=>options[:updates] || {} })
|
@@ -103,9 +105,10 @@ module ActiveRecord
|
|
103
105
|
|
104
106
|
module MySQL
|
105
107
|
def save_many_sql(klass, table_name, columns, rows, options)
|
106
|
-
Functions::check_options(SQL_OPTIONS_KEYS, options)
|
107
108
|
|
108
|
-
sql = [
|
109
|
+
sql = [(if options[:replace] then "replace" else "insert" end),
|
110
|
+
("delayed" if options[:async]),
|
111
|
+
("ignore" if options[:ignore])].compact.join(' ') +
|
109
112
|
" into #{table_name} (#{columns.join(',')}) values " +
|
110
113
|
rows.map{|vals| "(" + vals.map{|v| klass.quote_value(v)}.join(",") +")"}.join(",") +
|
111
114
|
(" on duplicate key update "+columns.map{|c| options[:updates][c] || "#{c}=values(#{c})"}.join(",") if options[:update]).to_s
|
@@ -40,6 +40,21 @@ module ActiveRecord
|
|
40
40
|
SaveMany::Functions::check_options(ActiveRecord::SaveMany::OPTIONS_KEYS, :foo=>100)
|
41
41
|
end.should raise_error(RuntimeError)
|
42
42
|
end
|
43
|
+
|
44
|
+
it "should refuse :replace with :ignore, :async, :update or :updates" do
|
45
|
+
lambda do
|
46
|
+
SaveMany::Functions::check_options(ActiveRecord::SaveMany::OPTIONS_KEYS, :replace=>true, :ignore=>true)
|
47
|
+
end.should raise_error(RuntimeError)
|
48
|
+
lambda do
|
49
|
+
SaveMany::Functions::check_options(ActiveRecord::SaveMany::OPTIONS_KEYS, :replace=>true, :async=>true)
|
50
|
+
end.should raise_error(RuntimeError)
|
51
|
+
lambda do
|
52
|
+
SaveMany::Functions::check_options(ActiveRecord::SaveMany::OPTIONS_KEYS, :replace=>true, :update=>true)
|
53
|
+
end.should raise_error(RuntimeError)
|
54
|
+
lambda do
|
55
|
+
SaveMany::Functions::check_options(ActiveRecord::SaveMany::OPTIONS_KEYS, :replace=>true, :updates=>true)
|
56
|
+
end.should raise_error(RuntimeError)
|
57
|
+
end
|
43
58
|
end
|
44
59
|
|
45
60
|
describe "slice_array" do
|
@@ -176,6 +191,12 @@ module ActiveRecord
|
|
176
191
|
k.save_many([kinst], :columns=>["foo"], :ignore=>true)
|
177
192
|
end
|
178
193
|
|
194
|
+
it "should generate replace sql if :replace param given" do
|
195
|
+
k=new_ar_stub("Foo", [:foo], "foos", "replace into foos (foo) values ('foofoo')")
|
196
|
+
kinst = new_ar_inst(k, nil, true, {"foo"=>"foofoo"})
|
197
|
+
k.save_many([kinst], :columns=>["foo"], :replace=>true)
|
198
|
+
end
|
199
|
+
|
179
200
|
it "should generate update sql with all columns if :update given" do
|
180
201
|
k=new_ar_stub("Foo", [:foo], "foos",
|
181
202
|
"insert into foos (foo) values ('foofoo') on duplicate key update foo=values(foo)")
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 7
|
8
|
+
- 0
|
9
|
+
version: 0.7.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- mccraigmccraig
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-03-
|
17
|
+
date: 2010-03-15 00:00:00 +00:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|