sequel 3.44.0 → 3.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|