sequel 4.11.0 → 4.12.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.
- checksums.yaml +4 -4
- data/CHANGELOG +32 -0
- data/Rakefile +1 -5
- data/doc/opening_databases.rdoc +5 -1
- data/doc/release_notes/4.12.0.txt +105 -0
- data/lib/sequel/adapters/jdbc.rb +1 -0
- data/lib/sequel/adapters/oracle.rb +1 -0
- data/lib/sequel/adapters/postgres.rb +17 -8
- data/lib/sequel/adapters/shared/cubrid.rb +2 -1
- data/lib/sequel/adapters/shared/db2.rb +1 -0
- data/lib/sequel/adapters/shared/mssql.rb +1 -0
- data/lib/sequel/adapters/shared/postgres.rb +23 -2
- data/lib/sequel/adapters/shared/sqlanywhere.rb +1 -0
- data/lib/sequel/adapters/sqlite.rb +11 -5
- data/lib/sequel/database/query.rb +14 -1
- data/lib/sequel/dataset/prepared_statements.rb +2 -1
- data/lib/sequel/dataset/query.rb +48 -37
- data/lib/sequel/dataset/sql.rb +0 -39
- data/lib/sequel/extensions/pg_interval.rb +1 -1
- data/lib/sequel/extensions/pg_static_cache_updater.rb +11 -5
- data/lib/sequel/model/associations.rb +2 -2
- data/lib/sequel/plugins/auto_validations.rb +16 -4
- data/lib/sequel/plugins/hook_class_methods.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +72 -59
- data/lib/sequel/plugins/prepared_statements.rb +16 -5
- data/lib/sequel/plugins/prepared_statements_associations.rb +14 -0
- data/lib/sequel/sql.rb +2 -43
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/postgres_spec.rb +49 -20
- data/spec/bin_spec.rb +2 -2
- data/spec/core/dataset_spec.rb +18 -6
- data/spec/core/schema_spec.rb +2 -1
- data/spec/extensions/auto_validations_spec.rb +23 -2
- data/spec/extensions/nested_attributes_spec.rb +32 -1
- data/spec/extensions/pg_static_cache_updater_spec.rb +12 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +17 -17
- data/spec/extensions/prepared_statements_spec.rb +11 -8
- data/spec/integration/plugin_test.rb +43 -0
- data/spec/integration/schema_test.rb +7 -0
- data/spec/model/eager_loading_spec.rb +9 -0
- metadata +4 -2
@@ -5,6 +5,7 @@ describe "prepared_statements plugin" do
|
|
5
5
|
@db = Sequel.mock(:fetch=>{:id=>1, :name=>'foo', :i=>2}, :autoid=>proc{|sql| 1}, :numrows=>1, :servers=>{:read_only=>{}})
|
6
6
|
@c = Class.new(Sequel::Model(@db[:people]))
|
7
7
|
@c.columns :id, :name, :i
|
8
|
+
@columns = "id, name, i"
|
8
9
|
@c.plugin :prepared_statements
|
9
10
|
@p = @c.load(:id=>1, :name=>'foo', :i=>2)
|
10
11
|
@ds = @c.dataset
|
@@ -13,7 +14,7 @@ describe "prepared_statements plugin" do
|
|
13
14
|
|
14
15
|
specify "should correctly lookup by primary key" do
|
15
16
|
@c[1].should == @p
|
16
|
-
@db.sqls.should == ["SELECT
|
17
|
+
@db.sqls.should == ["SELECT id, name, i FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
|
17
18
|
end
|
18
19
|
|
19
20
|
shared_examples_for "prepared_statements plugin" do
|
@@ -29,7 +30,7 @@ describe "prepared_statements plugin" do
|
|
29
30
|
|
30
31
|
specify "should correctly create instance" do
|
31
32
|
@c.create(:name=>'foo').should == @c.load(:id=>1, :name=>'foo', :i => 2)
|
32
|
-
@db.sqls.should == ["INSERT INTO people (name) VALUES ('foo')", "SELECT
|
33
|
+
@db.sqls.should == ["INSERT INTO people (name) VALUES ('foo')", "SELECT #{@columns} FROM people WHERE (id = 1) LIMIT 1"]
|
33
34
|
end
|
34
35
|
|
35
36
|
specify "should correctly create instance if dataset supports insert_select" do
|
@@ -39,14 +40,15 @@ describe "prepared_statements plugin" do
|
|
39
40
|
end
|
40
41
|
def insert_select(h)
|
41
42
|
self._fetch = {:id=>1, :name=>'foo', :i => 2}
|
42
|
-
returning
|
43
|
+
ds = opts[:returning] ? self : returning
|
44
|
+
ds.server(:default).with_sql(:insert_sql, h).first
|
43
45
|
end
|
44
46
|
def insert_sql(*)
|
45
|
-
"#{super}#{
|
47
|
+
"#{super}#{" RETURNING #{opts[:returning] && !opts[:returning].empty? ? opts[:returning].map{|c| literal(c)}.join(', ') : '*'}" if opts.has_key?(:returning)}"
|
46
48
|
end
|
47
49
|
end
|
48
50
|
@c.create(:name=>'foo').should == @c.load(:id=>1, :name=>'foo', :i => 2)
|
49
|
-
@db.sqls.should == ["INSERT INTO people (name) VALUES ('foo') RETURNING
|
51
|
+
@db.sqls.should == ["INSERT INTO people (name) VALUES ('foo') RETURNING #{@columns}"]
|
50
52
|
end
|
51
53
|
end
|
52
54
|
|
@@ -54,6 +56,7 @@ describe "prepared_statements plugin" do
|
|
54
56
|
|
55
57
|
describe "when #use_prepared_statements_for? returns false" do
|
56
58
|
before do
|
59
|
+
@columns = "*"
|
57
60
|
@c.class_eval{def use_prepared_statements_for?(type) false end}
|
58
61
|
end
|
59
62
|
|
@@ -63,7 +66,7 @@ describe "prepared_statements plugin" do
|
|
63
66
|
specify "should work correctly when subclassing" do
|
64
67
|
c = Class.new(@c)
|
65
68
|
c[1].should == c.load(:id=>1, :name=>'foo', :i=>2)
|
66
|
-
@db.sqls.should == ["SELECT
|
69
|
+
@db.sqls.should == ["SELECT id, name, i FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
|
67
70
|
end
|
68
71
|
|
69
72
|
describe " with placeholder type specifiers" do
|
@@ -73,7 +76,7 @@ describe "prepared_statements plugin" do
|
|
73
76
|
|
74
77
|
specify "should correctly handle without schema type" do
|
75
78
|
@c[1].should == @p
|
76
|
-
@db.sqls.should == ["SELECT
|
79
|
+
@db.sqls.should == ["SELECT id, name, i FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
|
77
80
|
end
|
78
81
|
|
79
82
|
specify "should correctly handle with schema type" do
|
@@ -92,7 +95,7 @@ describe "prepared_statements plugin" do
|
|
92
95
|
end
|
93
96
|
end
|
94
97
|
@c[1].should == @p
|
95
|
-
@db.sqls.should == ["SELECT
|
98
|
+
@db.sqls.should == ["SELECT id, name, i FROM people WHERE (id = 1) LIMIT 1 -- read_only"]
|
96
99
|
end
|
97
100
|
end
|
98
101
|
end
|
@@ -1761,6 +1761,49 @@ describe "Sequel::Plugins::PreparedStatements" do
|
|
1761
1761
|
end
|
1762
1762
|
end
|
1763
1763
|
|
1764
|
+
describe "Sequel::Plugins::PreparedStatements with schema changes" do
|
1765
|
+
before do
|
1766
|
+
@db = DB
|
1767
|
+
@db.create_table!(:ps_test) do
|
1768
|
+
primary_key :id
|
1769
|
+
String :name
|
1770
|
+
end
|
1771
|
+
@c = Class.new(Sequel::Model(@db[:ps_test]))
|
1772
|
+
@c.many_to_one :ps_test, :key=>:id, :class=>@c
|
1773
|
+
@c.one_to_many :ps_tests, :key=>:id, :class=>@c
|
1774
|
+
@c.many_to_many :mps_tests, :left_key=>:id, :right_key=>:id, :class=>@c, :join_table=>:ps_test___x
|
1775
|
+
@c.plugin :prepared_statements
|
1776
|
+
@c.plugin :prepared_statements_associations
|
1777
|
+
end
|
1778
|
+
after do
|
1779
|
+
@db.drop_table?(:ps_test)
|
1780
|
+
end
|
1781
|
+
|
1782
|
+
it "should handle added columns" do
|
1783
|
+
foo = @c.create(:name=>'foo')
|
1784
|
+
@c[foo.id].name.should == 'foo'
|
1785
|
+
foo.ps_test.name.should == 'foo'
|
1786
|
+
foo.ps_tests.map{|x| x.name}.should == %w'foo'
|
1787
|
+
foo.mps_tests.map{|x| x.name}.should == %w'foo'
|
1788
|
+
foo.update(:name=>'foo2')
|
1789
|
+
@c[foo.id].name.should == 'foo2'
|
1790
|
+
foo.delete
|
1791
|
+
foo.exists?.should == false
|
1792
|
+
|
1793
|
+
@db.alter_table(:ps_test){add_column :i, Integer}
|
1794
|
+
|
1795
|
+
foo = @c.create(:name=>'foo')
|
1796
|
+
@c[foo.id].name.should == 'foo'
|
1797
|
+
foo.ps_test.name.should == 'foo'
|
1798
|
+
foo.ps_tests.map{|x| x.name}.should == %w'foo'
|
1799
|
+
foo.mps_tests.map{|x| x.name}.should == %w'foo'
|
1800
|
+
foo.update(:name=>'foo2')
|
1801
|
+
@c[foo.id].name.should == 'foo2'
|
1802
|
+
foo.delete
|
1803
|
+
foo.exists?.should == false
|
1804
|
+
end
|
1805
|
+
end
|
1806
|
+
|
1764
1807
|
describe "Caching plugins" do
|
1765
1808
|
before(:all) do
|
1766
1809
|
@db = DB
|
@@ -142,6 +142,13 @@ describe "Database schema parser" do
|
|
142
142
|
DB.create_table!(:items){FalseClass :number}
|
143
143
|
DB.schema(:items).first.last[:type].should == :boolean
|
144
144
|
end
|
145
|
+
|
146
|
+
specify "should parse maximum length for string columns" do
|
147
|
+
DB.create_table!(:items){String :a, :size=>4}
|
148
|
+
DB.schema(:items).first.last[:max_length].should == 4
|
149
|
+
DB.create_table!(:items){String :a, :fixed=>true, :size=>3}
|
150
|
+
DB.schema(:items).first.last[:max_length].should == 3
|
151
|
+
end
|
145
152
|
end if DB.supports_schema_parsing?
|
146
153
|
|
147
154
|
describe "Database index parsing" do
|
@@ -762,6 +762,15 @@ describe Sequel::Model, "#eager" do
|
|
762
762
|
a.first.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
|
763
763
|
DB.sqls.should == []
|
764
764
|
end
|
765
|
+
|
766
|
+
it "should respect the :limit option on a one_to_many association with an association block" do
|
767
|
+
EagerAlbum.one_to_many :tracks, :class=>'EagerTrack', :key=>:album_id, :order=>:name, :limit=>2 do |ds| ds.where(:a=>1) end
|
768
|
+
a = EagerAlbum.eager(:tracks).all
|
769
|
+
a.should == [EagerAlbum.load(:id => 1, :band_id => 2)]
|
770
|
+
DB.sqls.should == ['SELECT * FROM albums', 'SELECT * FROM (SELECT * FROM tracks WHERE ((a = 1) AND (1 = tracks.album_id)) ORDER BY name LIMIT 2) AS t1']
|
771
|
+
a.first.tracks.should == [EagerTrack.load(:id => 3, :album_id=>1)]
|
772
|
+
DB.sqls.should == []
|
773
|
+
end
|
765
774
|
|
766
775
|
it "should respect the :limit option on a one_to_many association using the :window_function strategy" do
|
767
776
|
def (EagerTrack.dataset).supports_window_functions?() true end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Evans
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-01 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: The Database Toolkit for Ruby
|
14
14
|
email: code@jeremyevans.net
|
@@ -128,6 +128,7 @@ extra_rdoc_files:
|
|
128
128
|
- doc/release_notes/4.9.0.txt
|
129
129
|
- doc/release_notes/4.10.0.txt
|
130
130
|
- doc/release_notes/4.11.0.txt
|
131
|
+
- doc/release_notes/4.12.0.txt
|
131
132
|
files:
|
132
133
|
- CHANGELOG
|
133
134
|
- MIT-LICENSE
|
@@ -226,6 +227,7 @@ files:
|
|
226
227
|
- doc/release_notes/4.1.0.txt
|
227
228
|
- doc/release_notes/4.10.0.txt
|
228
229
|
- doc/release_notes/4.11.0.txt
|
230
|
+
- doc/release_notes/4.12.0.txt
|
229
231
|
- doc/release_notes/4.2.0.txt
|
230
232
|
- doc/release_notes/4.3.0.txt
|
231
233
|
- doc/release_notes/4.4.0.txt
|