sequel 3.44.0 → 3.45.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +44 -0
- data/Rakefile +12 -4
- data/doc/reflection.rdoc +3 -3
- data/doc/release_notes/3.45.0.txt +179 -0
- data/doc/schema_modification.rdoc +1 -1
- data/doc/transactions.rdoc +23 -0
- data/lib/sequel/adapters/db2.rb +1 -0
- data/lib/sequel/adapters/ibmdb.rb +19 -3
- data/lib/sequel/adapters/jdbc.rb +15 -0
- data/lib/sequel/adapters/jdbc/derby.rb +1 -5
- data/lib/sequel/adapters/jdbc/h2.rb +1 -0
- data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -1
- data/lib/sequel/adapters/jdbc/jtds.rb +5 -0
- data/lib/sequel/adapters/jdbc/mysql.rb +5 -0
- data/lib/sequel/adapters/jdbc/oracle.rb +7 -1
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -1
- data/lib/sequel/adapters/jdbc/transactions.rb +28 -1
- data/lib/sequel/adapters/mysql.rb +4 -0
- data/lib/sequel/adapters/mysql2.rb +5 -1
- data/lib/sequel/adapters/oracle.rb +18 -0
- data/lib/sequel/adapters/postgres.rb +11 -1
- data/lib/sequel/adapters/shared/access.rb +14 -2
- data/lib/sequel/adapters/shared/cubrid.rb +1 -11
- data/lib/sequel/adapters/shared/db2.rb +11 -6
- data/lib/sequel/adapters/shared/mssql.rb +10 -10
- data/lib/sequel/adapters/shared/mysql.rb +11 -1
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +17 -1
- data/lib/sequel/adapters/shared/oracle.rb +16 -15
- data/lib/sequel/adapters/shared/postgres.rb +91 -59
- data/lib/sequel/adapters/shared/sqlite.rb +1 -4
- data/lib/sequel/adapters/tinytds.rb +15 -0
- data/lib/sequel/connection_pool/threaded.rb +1 -1
- data/lib/sequel/core.rb +10 -0
- data/lib/sequel/database/connecting.rb +2 -0
- data/lib/sequel/database/misc.rb +46 -4
- data/lib/sequel/database/query.rb +33 -14
- data/lib/sequel/database/schema_methods.rb +0 -5
- data/lib/sequel/dataset/misc.rb +9 -0
- data/lib/sequel/dataset/mutation.rb +9 -7
- data/lib/sequel/dataset/sql.rb +13 -0
- data/lib/sequel/exceptions.rb +3 -0
- data/lib/sequel/extensions/connection_validator.rb +1 -1
- data/lib/sequel/extensions/date_arithmetic.rb +0 -8
- data/lib/sequel/extensions/eval_inspect.rb +2 -0
- data/lib/sequel/extensions/named_timezones.rb +18 -2
- data/lib/sequel/extensions/pg_array.rb +5 -1
- data/lib/sequel/extensions/pg_array_ops.rb +2 -0
- data/lib/sequel/extensions/pg_hstore.rb +2 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
- data/lib/sequel/extensions/pg_json.rb +3 -1
- data/lib/sequel/extensions/pg_range.rb +2 -0
- data/lib/sequel/extensions/pg_range_ops.rb +2 -0
- data/lib/sequel/extensions/pg_row.rb +2 -0
- data/lib/sequel/extensions/pg_row_ops.rb +2 -0
- data/lib/sequel/extensions/query.rb +18 -22
- data/lib/sequel/model/associations.rb +3 -4
- data/lib/sequel/model/base.rb +2 -0
- data/lib/sequel/plugins/force_encoding.rb +2 -0
- data/lib/sequel/plugins/json_serializer.rb +155 -39
- data/lib/sequel/plugins/serialization.rb +14 -2
- data/lib/sequel/plugins/unlimited_update.rb +31 -0
- data/lib/sequel/plugins/validation_class_methods.rb +6 -4
- data/lib/sequel/plugins/xml_serializer.rb +133 -30
- data/lib/sequel/sql.rb +2 -0
- data/lib/sequel/timezones.rb +4 -0
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mysql_spec.rb +0 -11
- data/spec/adapters/postgres_spec.rb +86 -54
- data/spec/adapters/spec_helper.rb +6 -0
- data/spec/core/connection_pool_spec.rb +16 -0
- data/spec/core/database_spec.rb +77 -1
- data/spec/core/dataset_spec.rb +30 -15
- data/spec/core/expression_filters_spec.rb +55 -13
- data/spec/core/mock_adapter_spec.rb +4 -0
- data/spec/core/schema_spec.rb +0 -2
- data/spec/core/spec_helper.rb +5 -0
- data/spec/core_extensions_spec.rb +33 -28
- data/spec/extensions/constraint_validations_spec.rb +2 -2
- data/spec/extensions/core_refinements_spec.rb +12 -12
- data/spec/extensions/json_serializer_spec.rb +137 -31
- data/spec/extensions/named_timezones_spec.rb +10 -0
- data/spec/extensions/pg_auto_parameterize_spec.rb +5 -0
- data/spec/extensions/pg_json_spec.rb +14 -0
- data/spec/extensions/pg_row_spec.rb +11 -0
- data/spec/extensions/pretty_table_spec.rb +2 -2
- data/spec/extensions/query_spec.rb +11 -8
- data/spec/extensions/serialization_spec.rb +20 -0
- data/spec/extensions/spec_helper.rb +8 -2
- data/spec/extensions/sql_expr_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +20 -0
- data/spec/extensions/xml_serializer_spec.rb +68 -16
- data/spec/integration/dataset_test.rb +28 -0
- data/spec/integration/spec_helper.rb +6 -0
- data/spec/integration/transaction_test.rb +39 -0
- data/spec/model/model_spec.rb +1 -1
- data/spec/sequel_coverage.rb +15 -0
- metadata +8 -3
@@ -8,14 +8,20 @@ if defined?(RSpec)
|
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
+
if ENV['COVERAGE']
|
12
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "../sequel_coverage")
|
13
|
+
SimpleCov.sequel_coverage(:filter=>%r{lib/sequel/(extensions|plugins)/\w+\.rb\z})
|
14
|
+
end
|
15
|
+
|
11
16
|
unless Object.const_defined?('Sequel') && Sequel.const_defined?('Model')
|
12
17
|
$:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
|
13
18
|
require 'sequel/no_core_ext'
|
14
19
|
end
|
15
20
|
|
16
21
|
begin
|
17
|
-
# Attempt to load ActiveSupport inflector first, so Sequel
|
18
|
-
# can override
|
22
|
+
# Attempt to load ActiveSupport blank extension and inflector first, so Sequel
|
23
|
+
# can override them.
|
24
|
+
require 'active_support/core_ext/object/blank'
|
19
25
|
require 'active_support/inflector'
|
20
26
|
require 'active_support/core_ext/string/inflections'
|
21
27
|
rescue LoadError
|
@@ -14,7 +14,7 @@ describe "Sequel sql_expr extension" do
|
|
14
14
|
@ds.literal(s & true).should == "(foo AND 't')"
|
15
15
|
@ds.literal(s < 1).should == "(foo < 1)"
|
16
16
|
@ds.literal(s.sql_subscript(1)).should == "foo[1]"
|
17
|
-
@ds.literal(s.like('a')).should == "(foo LIKE 'a')"
|
17
|
+
@ds.literal(s.like('a')).should == "(foo LIKE 'a' ESCAPE '\\')"
|
18
18
|
@ds.literal(s.as(:a)).should == "foo AS a"
|
19
19
|
@ds.literal(s.cast(Integer)).should == "CAST(foo AS integer)"
|
20
20
|
@ds.literal(s.desc).should == "foo DESC"
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
2
|
+
|
3
|
+
describe "Sequel::Plugins::UnlimitedUpdate" do
|
4
|
+
before do
|
5
|
+
@db = Sequel.mock(:host=>'mysql', :numrows=>1)
|
6
|
+
@c = Class.new(Sequel::Model(@db[:test]))
|
7
|
+
@c.columns :id, :name
|
8
|
+
@o = @c.load(:id=>1, :name=>'a')
|
9
|
+
@db.sqls
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should remove limit from update dataset" do
|
13
|
+
@o.save
|
14
|
+
@db.sqls.should == ["UPDATE test SET name = 'a' WHERE (id = 1) LIMIT 1"]
|
15
|
+
|
16
|
+
@c.plugin :unlimited_update
|
17
|
+
@o.save
|
18
|
+
@db.sqls.should == ["UPDATE test SET name = 'a' WHERE (id = 1)"]
|
19
|
+
end
|
20
|
+
end
|
@@ -8,12 +8,14 @@ else
|
|
8
8
|
describe "Sequel::Plugins::XmlSerializer" do
|
9
9
|
before do
|
10
10
|
class ::Artist < Sequel::Model
|
11
|
+
unrestrict_primary_key
|
11
12
|
plugin :xml_serializer
|
12
13
|
columns :id, :name
|
13
14
|
@db_schema = {:id=>{:type=>:integer}, :name=>{:type=>:string}}
|
14
15
|
one_to_many :albums
|
15
16
|
end
|
16
17
|
class ::Album < Sequel::Model
|
18
|
+
unrestrict_primary_key
|
17
19
|
attr_accessor :blah
|
18
20
|
plugin :xml_serializer
|
19
21
|
columns :id, :name, :artist_id
|
@@ -39,9 +41,10 @@ describe "Sequel::Plugins::XmlSerializer" do
|
|
39
41
|
it "should round trip successfully for namespaced models" do
|
40
42
|
module XmlSerializerTest
|
41
43
|
class Artist < Sequel::Model
|
42
|
-
|
43
|
-
|
44
|
-
|
44
|
+
unrestrict_primary_key
|
45
|
+
plugin :xml_serializer
|
46
|
+
columns :id, :name
|
47
|
+
@db_schema = {:id=>{:type=>:integer}, :name=>{:type=>:string}}
|
45
48
|
end
|
46
49
|
end
|
47
50
|
artist = XmlSerializerTest::Artist.load(:id=>2, :name=>'YJM')
|
@@ -69,8 +72,8 @@ describe "Sequel::Plugins::XmlSerializer" do
|
|
69
72
|
end
|
70
73
|
|
71
74
|
it "should handle the :include option for associations" do
|
72
|
-
Artist.from_xml(@artist.to_xml(:include=>:albums)).albums.should == [@album]
|
73
|
-
Album.from_xml(@album.to_xml(:include=>:artist)).artist.should == @artist
|
75
|
+
Artist.from_xml(@artist.to_xml(:include=>:albums), :associations=>:albums).albums.should == [@album]
|
76
|
+
Album.from_xml(@album.to_xml(:include=>:artist), :associations=>:artist).artist.should == @artist
|
74
77
|
end
|
75
78
|
|
76
79
|
it "should handle the :include option for arbitrary attributes" do
|
@@ -78,24 +81,28 @@ describe "Sequel::Plugins::XmlSerializer" do
|
|
78
81
|
end
|
79
82
|
|
80
83
|
it "should handle multiple inclusions using an array for the :include option" do
|
81
|
-
a = Album.from_xml(@album.to_xml(:include=>[:blah, :artist]))
|
84
|
+
a = Album.from_xml(@album.to_xml(:include=>[:blah, :artist]), :associations=>:artist)
|
82
85
|
a.blah.should == @album.blah
|
83
86
|
a.artist.should == @artist
|
84
87
|
end
|
85
88
|
|
86
89
|
it "should handle cascading using a hash for the :include option" do
|
87
|
-
Artist.from_xml(@artist.to_xml(:include=>{:albums=>{:include=>:artist}})).albums.map{|a| a.artist}.should == [@artist]
|
88
|
-
Album.from_xml(@album.to_xml(:include=>{:artist=>{:include=>:albums}})).artist.albums.should == [@album]
|
90
|
+
Artist.from_xml(@artist.to_xml(:include=>{:albums=>{:include=>:artist}}), :associations=>{:albums=>{:associations=>:artist}}).albums.map{|a| a.artist}.should == [@artist]
|
91
|
+
Album.from_xml(@album.to_xml(:include=>{:artist=>{:include=>:albums}}), :associations=>{:artist=>{:associations=>:albums}}).artist.albums.should == [@album]
|
89
92
|
|
90
|
-
Artist.from_xml(@artist.to_xml(:include=>{:albums=>{:only=>:name}})).albums.should == [Album.load(:name=>@album.name)]
|
91
|
-
Album.from_xml(@album.to_xml(:include=>{:artist=>{:except=>:name}})).artist.should == Artist.load(:id=>@artist.id)
|
93
|
+
Artist.from_xml(@artist.to_xml(:include=>{:albums=>{:only=>:name}}), :associations=>{:albums=>{:fields=>%w'name'}}).albums.should == [Album.load(:name=>@album.name)]
|
94
|
+
Album.from_xml(@album.to_xml(:include=>{:artist=>{:except=>:name}}), :associations=>:artist).artist.should == Artist.load(:id=>@artist.id)
|
92
95
|
|
93
|
-
Artist.from_xml(@artist.to_xml(:include=>{:albums=>{:include=>{:artist=>{:include=>:albums}}}})).albums.map{|a| a.artist.albums}.should == [[@album]]
|
94
|
-
Album.from_xml(@album.to_xml(:include=>{:artist=>{:include=>{:albums=>{:only=>:name}}}})).artist.albums.should == [Album.load(:name=>@album.name)]
|
96
|
+
Artist.from_xml(@artist.to_xml(:include=>{:albums=>{:include=>{:artist=>{:include=>:albums}}}}), :associations=>{:albums=>{:associations=>{:artist=>{:associations=>:albums}}}}).albums.map{|a| a.artist.albums}.should == [[@album]]
|
97
|
+
Album.from_xml(@album.to_xml(:include=>{:artist=>{:include=>{:albums=>{:only=>:name}}}}), :associations=>{:artist=>{:associations=>{:albums=>{:fields=>%w'name'}}}}).artist.albums.should == [Album.load(:name=>@album.name)]
|
95
98
|
end
|
96
99
|
|
100
|
+
it "should automatically cascade parsing for all associations if :all_associations is used" do
|
101
|
+
Artist.from_xml(@artist.to_xml(:include=>{:albums=>{:include=>:artist}}), :all_associations=>true).albums.map{|a| a.artist}.should == [@artist]
|
102
|
+
end
|
103
|
+
|
97
104
|
it "should handle the :include option cascading with an empty hash" do
|
98
|
-
Album.from_xml(@album.to_xml(:include=>{:artist=>{}})).artist.should == @artist
|
105
|
+
Album.from_xml(@album.to_xml(:include=>{:artist=>{}}), :associations=>:artist).artist.should == @artist
|
99
106
|
Album.from_xml(@album.to_xml(:include=>{:blah=>{}})).blah.should == @album.blah
|
100
107
|
end
|
101
108
|
|
@@ -153,7 +160,7 @@ describe "Sequel::Plugins::XmlSerializer" do
|
|
153
160
|
album = @album
|
154
161
|
Album.dataset.meta_def(:all){[album]}
|
155
162
|
Album.array_from_xml(Album.to_xml).should == [@album]
|
156
|
-
Album.array_from_xml(Album.to_xml(:include=>:artist)).map{|x| x.artist}.should == [@artist]
|
163
|
+
Album.array_from_xml(Album.to_xml(:include=>:artist), :associations=>:artist).map{|x| x.artist}.should == [@artist]
|
157
164
|
Album.array_from_xml(Album.dataset.to_xml(:only=>:name)).should == [Album.load(:name=>@album.name)]
|
158
165
|
end
|
159
166
|
|
@@ -162,10 +169,10 @@ describe "Sequel::Plugins::XmlSerializer" do
|
|
162
169
|
Album.array_from_xml(Album.to_xml(:array=>[a])).should == [a]
|
163
170
|
|
164
171
|
a.associations[:artist] = artist = Artist.load(:id=>3, :name=>'YJM')
|
165
|
-
Album.array_from_xml(Album.to_xml(:array=>[a], :include=>:artist)).first.artist.should == artist
|
172
|
+
Album.array_from_xml(Album.to_xml(:array=>[a], :include=>:artist), :associations=>:artist).first.artist.should == artist
|
166
173
|
|
167
174
|
artist.associations[:albums] = [a]
|
168
|
-
x = Artist.array_from_xml(Artist.to_xml(:array=>[artist], :include=>:albums))
|
175
|
+
x = Artist.array_from_xml(Artist.to_xml(:array=>[artist], :include=>:albums), :associations=>:albums)
|
169
176
|
x.should == [artist]
|
170
177
|
x.first.albums.should == [a]
|
171
178
|
end
|
@@ -173,5 +180,50 @@ describe "Sequel::Plugins::XmlSerializer" do
|
|
173
180
|
it "should raise an error if the dataset does not have a row_proc" do
|
174
181
|
proc{Album.dataset.naked.to_xml}.should raise_error(Sequel::Error)
|
175
182
|
end
|
183
|
+
|
184
|
+
it "should have :associations option take precedence over :all_assocations" do
|
185
|
+
Artist.from_xml(@artist.to_xml(:include=>:albums), :associations=>[], :all_associations=>true, :fields=>[]).associations.should == {}
|
186
|
+
end
|
187
|
+
|
188
|
+
it "should allow overriding of :all_columns options in associated objects" do
|
189
|
+
Album.restrict_primary_key
|
190
|
+
Artist.from_xml(@artist.to_xml(:include=>:albums), :associations=>{:albums=>{:fields=>[:id, :name, :artist_id], :missing=>:raise}}, :all_columns=>true).albums
|
191
|
+
end
|
192
|
+
|
193
|
+
it "should allow setting columns that are restricted if :all_columns is used" do
|
194
|
+
Artist.restrict_primary_key
|
195
|
+
Artist.from_xml(@artist.to_xml, :all_columns=>true).should == @artist
|
196
|
+
end
|
197
|
+
|
198
|
+
it "should raise an error if using parsing empty xml" do
|
199
|
+
proc{Artist.from_xml("<?xml version=\"1.0\"?>\n")}.should raise_error(Sequel::Error)
|
200
|
+
proc{Artist.array_from_xml("<?xml version=\"1.0\"?>\n")}.should raise_error(Sequel::Error)
|
201
|
+
end
|
202
|
+
|
203
|
+
it "should raise an error if using :all_columns and non-column is in the XML" do
|
204
|
+
proc{Artist.from_xml("<?xml version=\"1.0\"?>\n<artist>\n <foo>bar</foo>\n <id>2</id>\n</artist>\n", :all_columns=>true)}.should raise_error(Sequel::Error)
|
205
|
+
end
|
206
|
+
|
207
|
+
it "should raise an error if attempting to set a restricted column and :all_columns is not used" do
|
208
|
+
Artist.restrict_primary_key
|
209
|
+
proc{Artist.from_xml(@artist.to_xml)}.should raise_error(Sequel::Error)
|
210
|
+
end
|
211
|
+
|
212
|
+
it "should raise an error if an unsupported association is passed in the :associations option" do
|
213
|
+
Artist.association_reflections.delete(:albums)
|
214
|
+
proc{Artist.from_xml(@artist.to_xml(:include=>:albums), :associations=>:albums)}.should raise_error(Sequel::Error)
|
215
|
+
end
|
216
|
+
|
217
|
+
it "should raise an error if using from_xml and XML represents an array" do
|
218
|
+
proc{Artist.from_xml(Artist.to_xml(:array=>[@artist]))}.should raise_error(Sequel::Error)
|
219
|
+
end
|
220
|
+
|
221
|
+
it "should raise an error if using array_from_xml and XML does not represent an array" do
|
222
|
+
proc{Artist.array_from_xml(@artist.to_xml)}.should raise_error(Sequel::Error)
|
223
|
+
end
|
224
|
+
|
225
|
+
it "should raise an error if using an unsupported :associations option" do
|
226
|
+
proc{Artist.from_xml(@artist.to_xml, :associations=>'')}.should raise_error(Sequel::Error)
|
227
|
+
end
|
176
228
|
end
|
177
229
|
end
|
@@ -1464,6 +1464,34 @@ describe "Dataset string methods" do
|
|
1464
1464
|
@ds.exclude(Sequel.expr(:a).ilike('FOO', 'BAR')).all.should == []
|
1465
1465
|
end
|
1466
1466
|
|
1467
|
+
it "#escape_like should escape any metacharacters" do
|
1468
|
+
@ds.insert('foo', 'bar')
|
1469
|
+
@ds.insert('foo.', 'bar..')
|
1470
|
+
@ds.insert('foo\\..', 'bar\\..')
|
1471
|
+
@ds.insert('foo\\_', 'bar\\%')
|
1472
|
+
@ds.insert('foo_', 'bar%')
|
1473
|
+
@ds.insert('foo_.', 'bar%.')
|
1474
|
+
@ds.insert('foo_..', 'bar%..')
|
1475
|
+
@ds.insert('[f#*?oo_]', '[bar%]')
|
1476
|
+
@ds.filter(Sequel.expr(:a).like(@ds.escape_like('foo_'))).select_order_map(:a).should == ['foo_']
|
1477
|
+
@ds.filter(Sequel.expr(:b).like(@ds.escape_like('bar%'))).select_order_map(:b).should == ['bar%']
|
1478
|
+
@ds.filter(Sequel.expr(:a).like(@ds.escape_like('foo\\_'))).select_order_map(:a).should == ['foo\\_']
|
1479
|
+
@ds.filter(Sequel.expr(:b).like(@ds.escape_like('bar\\%'))).select_order_map(:b).should == ['bar\\%']
|
1480
|
+
@ds.filter(Sequel.expr(:a).like(@ds.escape_like('[f#*?oo_]'))).select_order_map(:a).should == ['[f#*?oo_]']
|
1481
|
+
@ds.filter(Sequel.expr(:b).like(@ds.escape_like('[bar%]'))).select_order_map(:b).should == ['[bar%]']
|
1482
|
+
@ds.filter(Sequel.expr(:b).like("#{@ds.escape_like('bar%')}_")).select_order_map(:b).should == ['bar%.']
|
1483
|
+
@ds.filter(Sequel.expr(:b).like("#{@ds.escape_like('bar%')}%")).select_order_map(:b).should == ['bar%', 'bar%.', 'bar%..']
|
1484
|
+
|
1485
|
+
@ds.filter(Sequel.expr(:a).ilike(@ds.escape_like('Foo_'))).select_order_map(:a).should == ['foo_']
|
1486
|
+
@ds.filter(Sequel.expr(:b).ilike(@ds.escape_like('Bar%'))).select_order_map(:b).should == ['bar%']
|
1487
|
+
@ds.filter(Sequel.expr(:a).ilike(@ds.escape_like('Foo\\_'))).select_order_map(:a).should == ['foo\\_']
|
1488
|
+
@ds.filter(Sequel.expr(:b).ilike(@ds.escape_like('Bar\\%'))).select_order_map(:b).should == ['bar\\%']
|
1489
|
+
@ds.filter(Sequel.expr(:a).ilike(@ds.escape_like('[F#*?oo_]'))).select_order_map(:a).should == ['[f#*?oo_]']
|
1490
|
+
@ds.filter(Sequel.expr(:b).ilike(@ds.escape_like('[Bar%]'))).select_order_map(:b).should == ['[bar%]']
|
1491
|
+
@ds.filter(Sequel.expr(:b).ilike("#{@ds.escape_like('Bar%')}_")).select_order_map(:b).should == ['bar%.']
|
1492
|
+
@ds.filter(Sequel.expr(:b).ilike("#{@ds.escape_like('Bar%')}%")).select_order_map(:b).should == ['bar%', 'bar%.', 'bar%..']
|
1493
|
+
end
|
1494
|
+
|
1467
1495
|
if INTEGRATION_DB.dataset.supports_regexp?
|
1468
1496
|
it "#like with regexp return matching rows" do
|
1469
1497
|
@ds.insert('foo', 'bar')
|
@@ -1,5 +1,11 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'logger'
|
3
|
+
|
4
|
+
if ENV['COVERAGE']
|
5
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "../sequel_coverage")
|
6
|
+
SimpleCov.sequel_coverage(:group=>%r{lib/sequel/adapters})
|
7
|
+
end
|
8
|
+
|
3
9
|
unless Object.const_defined?('Sequel')
|
4
10
|
$:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
|
5
11
|
require 'sequel/no_core_ext'
|
@@ -310,3 +310,42 @@ if (! defined?(RUBY_ENGINE) or RUBY_ENGINE == 'ruby' or (RUBY_ENGINE == 'rbx' &&
|
|
310
310
|
end
|
311
311
|
end
|
312
312
|
end
|
313
|
+
|
314
|
+
describe "Database transaction retrying" do
|
315
|
+
before(:all) do
|
316
|
+
@db = INTEGRATION_DB
|
317
|
+
@db.create_table!(:items, :engine=>'InnoDB'){String :a, :unique=>true, :null=>false}
|
318
|
+
@d = @db[:items]
|
319
|
+
end
|
320
|
+
before do
|
321
|
+
@d.delete
|
322
|
+
end
|
323
|
+
after(:all) do
|
324
|
+
@db.drop_table?(:items)
|
325
|
+
end
|
326
|
+
|
327
|
+
cspecify "should be supported using the :retry_on option", [:db2] do
|
328
|
+
@d.insert('b')
|
329
|
+
@d.insert('c')
|
330
|
+
s = 'a'
|
331
|
+
@db.transaction(:retry_on=>Sequel::ConstraintViolation) do
|
332
|
+
s = s.succ
|
333
|
+
@d.insert(s)
|
334
|
+
end
|
335
|
+
@d.select_order_map(:a).should == %w'b c d'
|
336
|
+
end
|
337
|
+
|
338
|
+
cspecify "should limit number of retries via the :num_retries option", [:db2] do
|
339
|
+
@d.insert('b')
|
340
|
+
@d.insert('c')
|
341
|
+
s = 'a'
|
342
|
+
lambda do
|
343
|
+
@db.transaction(:num_retries=>1, :retry_on=>Sequel::ConstraintViolation) do
|
344
|
+
s = s.succ
|
345
|
+
@d.insert(s)
|
346
|
+
end
|
347
|
+
end.should raise_error(Sequel::ConstraintViolation)
|
348
|
+
@d.select_order_map(:a).should == %w'b c'
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
data/spec/model/model_spec.rb
CHANGED
@@ -394,7 +394,7 @@ describe Sequel::Model, ".find" do
|
|
394
394
|
MODEL_DB.sqls.should == ["SELECT * FROM items WHERE (name = 'sharon') LIMIT 1"]
|
395
395
|
|
396
396
|
@c.find(Sequel.expr(:name).like('abc%')).should be_a_kind_of(@c)
|
397
|
-
MODEL_DB.sqls.should == ["SELECT * FROM items WHERE (name LIKE 'abc%') LIMIT 1"]
|
397
|
+
MODEL_DB.sqls.should == ["SELECT * FROM items WHERE (name LIKE 'abc%' ESCAPE '\\') LIMIT 1"]
|
398
398
|
end
|
399
399
|
|
400
400
|
specify "should accept filter blocks" do
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'coverage'
|
2
|
+
require 'simplecov'
|
3
|
+
|
4
|
+
def SimpleCov.sequel_coverage(opts = {})
|
5
|
+
start do
|
6
|
+
add_filter "/spec/"
|
7
|
+
add_group('Missing-Revelent'){|src| src.filename =~ opts[:group] && src.covered_percent < 100} if opts[:group]
|
8
|
+
add_group('Missing'){|src| src.covered_percent < 100}
|
9
|
+
add_group('Covered'){|src| src.covered_percent == 100}
|
10
|
+
add_filter{|src| src.filename !~ opts[:filter]} if opts[:filter]
|
11
|
+
yield self if block_given?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
ENV.delete('COVERAGE')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.45.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-03-01 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: The Database Toolkit for Ruby
|
15
15
|
email: code@jeremyevans.net
|
@@ -107,6 +107,7 @@ extra_rdoc_files:
|
|
107
107
|
- doc/release_notes/3.42.0.txt
|
108
108
|
- doc/release_notes/3.43.0.txt
|
109
109
|
- doc/release_notes/3.44.0.txt
|
110
|
+
- doc/release_notes/3.45.0.txt
|
110
111
|
files:
|
111
112
|
- MIT-LICENSE
|
112
113
|
- CHANGELOG
|
@@ -188,6 +189,7 @@ files:
|
|
188
189
|
- doc/release_notes/3.42.0.txt
|
189
190
|
- doc/release_notes/3.43.0.txt
|
190
191
|
- doc/release_notes/3.44.0.txt
|
192
|
+
- doc/release_notes/3.45.0.txt
|
191
193
|
- doc/sharding.rdoc
|
192
194
|
- doc/sql.rdoc
|
193
195
|
- doc/validations.rdoc
|
@@ -265,6 +267,7 @@ files:
|
|
265
267
|
- spec/extensions/association_pks_spec.rb
|
266
268
|
- spec/extensions/json_serializer_spec.rb
|
267
269
|
- spec/extensions/eager_each_spec.rb
|
270
|
+
- spec/extensions/pg_json_spec.rb
|
268
271
|
- spec/extensions/list_spec.rb
|
269
272
|
- spec/extensions/tree_spec.rb
|
270
273
|
- spec/extensions/xml_serializer_spec.rb
|
@@ -293,7 +296,6 @@ files:
|
|
293
296
|
- spec/extensions/static_cache_spec.rb
|
294
297
|
- spec/extensions/query_literals_spec.rb
|
295
298
|
- spec/extensions/dirty_spec.rb
|
296
|
-
- spec/extensions/pg_json_spec.rb
|
297
299
|
- spec/extensions/pg_inet_spec.rb
|
298
300
|
- spec/extensions/eval_inspect_spec.rb
|
299
301
|
- spec/extensions/pg_range_spec.rb
|
@@ -311,6 +313,7 @@ files:
|
|
311
313
|
- spec/extensions/validation_class_methods_spec.rb
|
312
314
|
- spec/extensions/meta_def_spec.rb
|
313
315
|
- spec/extensions/core_refinements_spec.rb
|
316
|
+
- spec/extensions/unlimited_update_spec.rb
|
314
317
|
- spec/integration/associations_test.rb
|
315
318
|
- spec/integration/database_test.rb
|
316
319
|
- spec/integration/dataset_test.rb
|
@@ -384,6 +387,7 @@ files:
|
|
384
387
|
- spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb
|
385
388
|
- spec/files/transaction_unspecified_migrations/002_create_basic.rb
|
386
389
|
- spec/core_extensions_spec.rb
|
390
|
+
- spec/sequel_coverage.rb
|
387
391
|
- lib/sequel.rb
|
388
392
|
- lib/sequel/adapters/ado.rb
|
389
393
|
- lib/sequel/adapters/ado/mssql.rb
|
@@ -576,6 +580,7 @@ files:
|
|
576
580
|
- lib/sequel/plugins/pg_row.rb
|
577
581
|
- lib/sequel/plugins/pg_typecast_on_load.rb
|
578
582
|
- lib/sequel/plugins/constraint_validations.rb
|
583
|
+
- lib/sequel/plugins/unlimited_update.rb
|
579
584
|
- lib/sequel/timezones.rb
|
580
585
|
- lib/sequel/ast_transformer.rb
|
581
586
|
- lib/sequel/no_core_ext.rb
|