sequel 4.34.0 → 4.35.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +30 -0
- data/Rakefile +14 -17
- data/doc/object_model.rdoc +4 -4
- data/doc/release_notes/4.35.0.txt +130 -0
- data/doc/schema_modification.rdoc +8 -3
- data/doc/security.rdoc +3 -3
- data/lib/sequel/adapters/ado.rb +2 -2
- data/lib/sequel/adapters/ado/access.rb +6 -6
- data/lib/sequel/adapters/ado/mssql.rb +2 -2
- data/lib/sequel/adapters/amalgalite.rb +6 -6
- data/lib/sequel/adapters/cubrid.rb +4 -4
- data/lib/sequel/adapters/do.rb +2 -2
- data/lib/sequel/adapters/do/mysql.rb +1 -1
- data/lib/sequel/adapters/do/postgres.rb +1 -1
- data/lib/sequel/adapters/do/sqlite3.rb +1 -1
- data/lib/sequel/adapters/ibmdb.rb +6 -6
- data/lib/sequel/adapters/jdbc.rb +15 -15
- data/lib/sequel/adapters/jdbc/db2.rb +1 -1
- data/lib/sequel/adapters/jdbc/derby.rb +3 -3
- data/lib/sequel/adapters/jdbc/h2.rb +3 -3
- data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -2
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -1
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +1 -1
- data/lib/sequel/adapters/jdbc/postgresql.rb +2 -2
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +1 -1
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -1
- data/lib/sequel/adapters/jdbc/transactions.rb +10 -10
- data/lib/sequel/adapters/mock.rb +1 -1
- data/lib/sequel/adapters/mysql.rb +2 -2
- data/lib/sequel/adapters/mysql2.rb +2 -2
- data/lib/sequel/adapters/odbc.rb +2 -2
- data/lib/sequel/adapters/odbc/mssql.rb +2 -2
- data/lib/sequel/adapters/oracle.rb +9 -9
- data/lib/sequel/adapters/postgres.rb +3 -3
- data/lib/sequel/adapters/shared/mssql.rb +36 -8
- data/lib/sequel/adapters/shared/oracle.rb +15 -0
- data/lib/sequel/adapters/shared/postgres.rb +22 -1
- data/lib/sequel/adapters/sqlanywhere.rb +1 -1
- data/lib/sequel/adapters/sqlite.rb +7 -7
- data/lib/sequel/adapters/swift.rb +3 -3
- data/lib/sequel/adapters/swift/mysql.rb +1 -1
- data/lib/sequel/adapters/swift/postgres.rb +1 -1
- data/lib/sequel/adapters/swift/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +5 -7
- data/lib/sequel/database/logging.rb +18 -3
- data/lib/sequel/database/misc.rb +19 -8
- data/lib/sequel/database/schema_generator.rb +7 -2
- data/lib/sequel/database/schema_methods.rb +9 -2
- data/lib/sequel/database/transactions.rb +52 -18
- data/lib/sequel/dataset/actions.rb +24 -19
- data/lib/sequel/dataset/features.rb +5 -0
- data/lib/sequel/dataset/query.rb +6 -0
- data/lib/sequel/extensions/_pretty_table.rb +1 -1
- data/lib/sequel/extensions/error_sql.rb +3 -3
- data/lib/sequel/extensions/pg_range.rb +10 -1
- data/lib/sequel/extensions/schema_dumper.rb +8 -5
- data/lib/sequel/extensions/server_logging.rb +61 -0
- data/lib/sequel/extensions/sql_comments.rb +91 -0
- data/lib/sequel/model/associations.rb +40 -8
- data/lib/sequel/model/base.rb +19 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +12 -0
- data/lib/sequel/plugins/delay_add_association.rb +1 -0
- data/lib/sequel/plugins/json_serializer.rb +10 -2
- data/lib/sequel/version.rb +1 -1
- data/spec/adapter_spec.rb +4 -0
- data/spec/adapters/mysql_spec.rb +1 -1
- data/spec/adapters/postgres_spec.rb +3 -2
- data/spec/core/connection_pool_spec.rb +2 -0
- data/spec/core/database_spec.rb +49 -0
- data/spec/core/dataset_spec.rb +25 -1
- data/spec/core/mock_adapter_spec.rb +3 -1
- data/spec/core/schema_generator_spec.rb +1 -1
- data/spec/core_model_spec.rb +2 -0
- data/spec/core_spec.rb +1 -0
- data/spec/extensions/delay_add_association_spec.rb +22 -0
- data/spec/extensions/json_serializer_spec.rb +6 -0
- data/spec/extensions/pg_range_spec.rb +30 -2
- data/spec/extensions/schema_dumper_spec.rb +3 -2
- data/spec/extensions/server_logging_spec.rb +45 -0
- data/spec/extensions/sql_comments_spec.rb +27 -0
- data/spec/files/reversible_migrations/006_reversible.rb +10 -0
- data/spec/files/reversible_migrations/007_reversible.rb +10 -0
- data/spec/integration/dataset_test.rb +28 -2
- data/spec/integration/migrator_test.rb +23 -1
- data/spec/integration/schema_test.rb +12 -32
- data/spec/integration/transaction_test.rb +10 -0
- data/spec/integration/type_test.rb +1 -1
- data/spec/model/eager_loading_spec.rb +16 -0
- data/spec/model/record_spec.rb +9 -0
- data/spec/model_no_assoc_spec.rb +1 -0
- data/spec/model_spec.rb +1 -0
- data/spec/plugin_spec.rb +1 -0
- metadata +16 -2
@@ -338,7 +338,9 @@ describe "Sequel Mock Adapter" do
|
|
338
338
|
db[:b].delete
|
339
339
|
db[:c].insert(:a=>1)
|
340
340
|
db[:d].update(:a=>1)
|
341
|
-
a.
|
341
|
+
a.zip(['SELECT * FROM t', 'DELETE FROM b', 'INSERT INTO c (a) VALUES (1)', 'UPDATE d SET a = 1']).each do |is, should|
|
342
|
+
is.must_match should
|
343
|
+
end
|
342
344
|
end
|
343
345
|
|
344
346
|
it "should correctly handle transactions" do
|
@@ -198,6 +198,6 @@ describe "Sequel::Schema::Generator generic type methods" do
|
|
198
198
|
File :k
|
199
199
|
TrueClass :l
|
200
200
|
FalseClass :m
|
201
|
-
end.columns.map{|c| c[:type]}.must_equal [String, Integer, Fixnum, Bignum, Float, BigDecimal, Date, DateTime, Time, Numeric, File, TrueClass, FalseClass]
|
201
|
+
end.columns.map{|c| c[:type]}.must_equal [String, Integer, Fixnum, :Bignum, Float, BigDecimal, Date, DateTime, Time, Numeric, File, TrueClass, FalseClass]
|
202
202
|
end
|
203
203
|
end
|
data/spec/core_spec.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Dir['./spec/core/*_spec.rb'].each{|f| require f}
|
@@ -49,4 +49,26 @@ describe "Sequel::Plugins::DelayAddAssociation" do
|
|
49
49
|
@o.errors[:cs].must_equal ["name is b"]
|
50
50
|
@o.cs.first.errors[:name].must_equal ['is b']
|
51
51
|
end
|
52
|
+
|
53
|
+
it "should work when passing in hashes" do
|
54
|
+
@o = @c.new(:name=>'a')
|
55
|
+
@o.add_c(:name=>'b')
|
56
|
+
@db.sqls.must_equal []
|
57
|
+
@o.save
|
58
|
+
sqls = @db.sqls
|
59
|
+
sqls.length.must_equal 4
|
60
|
+
sqls[0].must_equal "INSERT INTO cs (name) VALUES ('a')"
|
61
|
+
["INSERT INTO cs (name, c_id) VALUES ('b', 1)", "INSERT INTO cs (c_id, name) VALUES (1, 'b')"].must_include sqls[1]
|
62
|
+
sqls[2].must_equal "SELECT * FROM cs WHERE (id = 2) LIMIT 1"
|
63
|
+
sqls[3].must_equal "SELECT * FROM cs WHERE (id = 1) LIMIT 1"
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should work when passing in primary keys" do
|
67
|
+
@db.fetch = [[{:id=>2, :name=>'b', :c_id=>nil}], [{:id=>1, :name=>'a', :c_id=>nil}]]
|
68
|
+
@o = @c.new(:name=>'a')
|
69
|
+
@o.add_c(2)
|
70
|
+
@db.sqls.must_equal ["SELECT * FROM cs WHERE (id = 2) LIMIT 1"]
|
71
|
+
@o.save
|
72
|
+
@db.sqls.must_equal ["INSERT INTO cs (name) VALUES ('a')", "UPDATE cs SET c_id = 1 WHERE (id = 2)", "SELECT * FROM cs WHERE (id = 1) LIMIT 1"]
|
73
|
+
end
|
52
74
|
end
|
@@ -127,6 +127,12 @@ describe "Sequel::Plugins::JsonSerializer" do
|
|
127
127
|
Album.from_json(@album.to_json(:include=>{:artist=>{:include=>{:albums=>{:only=>:name}}}}), :associations=>{:artist=>{:associations=>:albums}}).artist.albums.must_equal [Album.load(:name=>@album.name)]
|
128
128
|
end
|
129
129
|
|
130
|
+
it "should handle usage of association_proxies when cascading using the :include option" do
|
131
|
+
Artist.plugin :association_proxies
|
132
|
+
Artist.one_to_many :albums, :clone=>:albums
|
133
|
+
Artist.from_json(@artist.to_json(:include=>{:albums=>{:include=>:artist}}), :associations=>{:albums=>{:associations=>:artist}}).albums.map{|a| a.artist}.must_equal [@artist]
|
134
|
+
end
|
135
|
+
|
130
136
|
it "should handle the :include option cascading with an empty hash" do
|
131
137
|
Album.from_json(@album.to_json(:include=>{:artist=>{}}), :associations=>:artist).artist.must_equal @artist
|
132
138
|
Album.from_json(@album.to_json(:include=>{:blah=>{}})).blah.must_equal @album.blah
|
@@ -325,9 +325,9 @@ describe "pg_range extension" do
|
|
325
325
|
end
|
326
326
|
|
327
327
|
it "should quack like a range" do
|
328
|
+
@r1.cover?(1.5).must_equal true
|
329
|
+
@r1.cover?(2.5).must_equal false
|
328
330
|
if RUBY_VERSION >= '1.9'
|
329
|
-
@r1.cover?(1.5).must_equal true
|
330
|
-
@r1.cover?(2.5).must_equal false
|
331
331
|
@r1.first(1).must_equal [1]
|
332
332
|
@r1.last(1).must_equal [2]
|
333
333
|
end
|
@@ -339,6 +339,34 @@ describe "pg_range extension" do
|
|
339
339
|
a.must_equal [1, 2]
|
340
340
|
end
|
341
341
|
|
342
|
+
it "should have cover? handle empty, unbounded, and exclusive beginning ranges" do
|
343
|
+
@R.empty.cover?(1).must_equal false
|
344
|
+
|
345
|
+
r = @R.new(1, nil)
|
346
|
+
r.cover?(0).must_equal false
|
347
|
+
r.cover?(1).must_equal true
|
348
|
+
r.cover?(2).must_equal true
|
349
|
+
r.cover?(3).must_equal true
|
350
|
+
|
351
|
+
r = @R.new(nil, 2)
|
352
|
+
r.cover?(0).must_equal true
|
353
|
+
r.cover?(1).must_equal true
|
354
|
+
r.cover?(2).must_equal true
|
355
|
+
r.cover?(3).must_equal false
|
356
|
+
|
357
|
+
r = @R.new(1, 2, :exclude_begin=>true)
|
358
|
+
r.cover?(0).must_equal false
|
359
|
+
r.cover?(1).must_equal false
|
360
|
+
r.cover?(2).must_equal true
|
361
|
+
r.cover?(3).must_equal false
|
362
|
+
|
363
|
+
r = @R.new(1, 2, :exclude_end=>true)
|
364
|
+
r.cover?(0).must_equal false
|
365
|
+
r.cover?(1).must_equal true
|
366
|
+
r.cover?(2).must_equal false
|
367
|
+
r.cover?(3).must_equal false
|
368
|
+
end
|
369
|
+
|
342
370
|
it "should only consider PGRanges equal if they have the same db_type" do
|
343
371
|
@R.new(1, 2, :db_type=>'int4range').must_equal @R.new(1, 2, :db_type=>'int4range')
|
344
372
|
@R.new(1, 2, :db_type=>'int8range').wont_equal @R.new(1, 2, :db_type=>'int4range')
|
@@ -107,7 +107,7 @@ describe "Sequel::Database dump methods" do
|
|
107
107
|
|
108
108
|
it "should dump non-Integer primary key columns with explicit :type" do
|
109
109
|
@d.meta_def(:schema){|*s| [[:c1, {:db_type=>'bigint', :primary_key=>true, :allow_null=>true, :auto_increment=>true}]]}
|
110
|
-
@d.dump_table_schema(:t6).must_equal "create_table(:t6) do\n primary_key :c1, :type
|
110
|
+
@d.dump_table_schema(:t6).must_equal "create_table(:t6) do\n primary_key :c1, :type=>:Bignum\nend"
|
111
111
|
end
|
112
112
|
|
113
113
|
it "should dump auto incrementing primary keys with :keep_order option if they are not first" do
|
@@ -665,7 +665,7 @@ END_MIG
|
|
665
665
|
%w"nvarchar ntext smalldatetime smallmoney binary varbinary nchar" +
|
666
666
|
["timestamp(6) without time zone", "timestamp(6) with time zone", 'mediumint(10) unsigned', 'int(9) unsigned',
|
667
667
|
'int(10) unsigned', "int(12) unsigned", 'bigint unsigned', 'tinyint(3) unsigned', 'identity', 'int identity'] +
|
668
|
-
%w"integer(10) bit"
|
668
|
+
%w"integer(10) bit bool"
|
669
669
|
@d.meta_def(:schema) do |t, *o|
|
670
670
|
i = 0
|
671
671
|
types.map{|x| [:"c#{i+=1}", {:db_type=>x, :allow_null=>true}]}
|
@@ -745,6 +745,7 @@ create_table(:x) do
|
|
745
745
|
Integer :c71
|
746
746
|
Integer :c72
|
747
747
|
TrueClass :c73
|
748
|
+
TrueClass :c74
|
748
749
|
|
749
750
|
check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c64), 0)
|
750
751
|
check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c65), 0)
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
2
|
+
|
3
|
+
describe "server_logging extension" do
|
4
|
+
before do
|
5
|
+
@o = Object.new
|
6
|
+
def @o.logs; @logs || []; end
|
7
|
+
def @o.log; logs.length.must_equal 1; logs.first.length.must_equal 1; logs.shift.first; end
|
8
|
+
def @o.to_ary; [self]; end
|
9
|
+
def @o.method_missing(m, *args); (@logs ||= []) << args; end
|
10
|
+
@db = Sequel::mock(:servers=>{:read_only=>{}, :b=>{}}, :logger=>@o).extension(:server_logging)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should include shard when logging" do
|
14
|
+
@db[:a].all
|
15
|
+
@o.log.must_include "server: read_only) SELECT * FROM a"
|
16
|
+
@db[:a].insert
|
17
|
+
@o.log.must_include "server: default) INSERT INTO a DEFAULT VALUES"
|
18
|
+
@db[:a].server(:b).all
|
19
|
+
@o.log.must_include "server: b) SELECT * FROM a"
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should not include shard when not logging connection info" do
|
23
|
+
@db.log_connection_info = false
|
24
|
+
@db[:a].all
|
25
|
+
log = @o.log
|
26
|
+
log.wont_include "server: read_only) SELECT * FROM a"
|
27
|
+
log.must_include "SELECT * FROM a"
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should not turn on logging connction info if it was turned off" do
|
31
|
+
@db.log_connection_info = false
|
32
|
+
@db.extension :server_logging
|
33
|
+
@db[:a].all
|
34
|
+
log = @o.log
|
35
|
+
log.wont_include "server: read_only) SELECT * FROM a"
|
36
|
+
log.must_include "SELECT * FROM a"
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should remove mapping when disconnecting" do
|
40
|
+
c = @db.synchronize{|c1| c1}
|
41
|
+
@db.disconnect
|
42
|
+
@db.send(:log_connection_execute, c, "SELECT * FROM a")
|
43
|
+
@o.log.must_include "server: ) SELECT * FROM a"
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
2
|
+
|
3
|
+
describe "sql_comments extension" do
|
4
|
+
before do
|
5
|
+
@ds = Sequel.mock[:t].extension(:sql_comments)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should not add a comment if one is not set for the dataset" do
|
9
|
+
@ds.select_sql.must_equal 'SELECT * FROM t'
|
10
|
+
@ds.insert_sql(:a=>1).must_equal 'INSERT INTO t (a) VALUES (1)'
|
11
|
+
@ds.delete_sql.must_equal 'DELETE FROM t'
|
12
|
+
@ds.update_sql(:a=>1).must_equal 'UPDATE t SET a = 1'
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should add a comment if one is set for the dataset" do
|
16
|
+
ds = @ds.comment("Some\nComment\r\n Here")
|
17
|
+
ds.select_sql.must_equal "SELECT * FROM t -- Some Comment Here\n"
|
18
|
+
ds.insert_sql(:a=>1).must_equal "INSERT INTO t (a) VALUES (1) -- Some Comment Here\n"
|
19
|
+
ds.delete_sql.must_equal "DELETE FROM t -- Some Comment Here\n"
|
20
|
+
ds.update_sql(:a=>1).must_equal "UPDATE t SET a = 1 -- Some Comment Here\n"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should handle comments used in nested datasets" do
|
24
|
+
ds = @ds.comment("Some\nComment\r\n Here")
|
25
|
+
ds.where(:id=>ds).select_sql.must_equal "SELECT * FROM t WHERE (id IN (SELECT * FROM t -- Some Comment Here\n)) -- Some Comment Here\n"
|
26
|
+
end
|
27
|
+
end
|
@@ -25,7 +25,7 @@ describe "Simple Dataset operations" do
|
|
25
25
|
|
26
26
|
it "should support sequential primary keys with a Bignum" do
|
27
27
|
@db.create_table!(:items) do
|
28
|
-
primary_key :id, :type
|
28
|
+
primary_key :id, :type=>:Bignum
|
29
29
|
Integer :number
|
30
30
|
end
|
31
31
|
@ds << {:number=>20}
|
@@ -171,6 +171,24 @@ describe "Simple Dataset operations" do
|
|
171
171
|
@ds.all.must_equal [{:id=>1, :number=>10}]
|
172
172
|
end
|
173
173
|
|
174
|
+
cspecify "should skip locked rows correctly", [:do] do
|
175
|
+
@ds.insert(:number=>10)
|
176
|
+
q1 = Queue.new
|
177
|
+
q2 = Queue.new
|
178
|
+
ds = @ds.order(:id).for_update.skip_locked
|
179
|
+
begin
|
180
|
+
t = Thread.new{@db.transaction(:isolation=>:committed){q2.push(ds.get(:id)); q1.pop}}
|
181
|
+
q2.pop.must_equal 1
|
182
|
+
# Some databases do row level locking, others do page level locking
|
183
|
+
[2, nil].must_include @db.transaction(:isolation=>:committed){ds.get(:id)}
|
184
|
+
ensure
|
185
|
+
q1.push(nil)
|
186
|
+
t.join
|
187
|
+
# Keep only one active connection, as some other specs expect that
|
188
|
+
@db.disconnect
|
189
|
+
end
|
190
|
+
end if DB.dataset.supports_skip_locked?
|
191
|
+
|
174
192
|
it "should raise exception if raising on duplication columns" do
|
175
193
|
proc{@ds.select_map([:id, :id])}.must_raise Sequel::DuplicateColumnError
|
176
194
|
end if DB.opts[:on_duplicate_columns] == :raise
|
@@ -325,6 +343,14 @@ describe "Simple Dataset operations" do
|
|
325
343
|
@ds.filter(true).select_map(:number).must_equal [10]
|
326
344
|
@ds.filter(false).select_map(:number).must_equal []
|
327
345
|
end
|
346
|
+
|
347
|
+
it "should support the sql_comments extension" do
|
348
|
+
ds = @ds.extension(:sql_comments).comment("Some\rComment\r\nHere")
|
349
|
+
ds.all.must_equal [{:id=>1, :number=>10}]
|
350
|
+
ds.insert(:number=>20).must_equal 2
|
351
|
+
ds.update(:number=>30).must_equal 2
|
352
|
+
ds.delete.must_equal 2
|
353
|
+
end
|
328
354
|
end
|
329
355
|
|
330
356
|
describe "Simple dataset operations with nasty table names" do
|
@@ -873,7 +899,7 @@ describe Sequel::SQL::Constants do
|
|
873
899
|
d.to_s.must_equal Date.today.to_s
|
874
900
|
end
|
875
901
|
|
876
|
-
cspecify "should have working CURRENT_TIME", [:jdbc, :sqlite], [:mysql2] do
|
902
|
+
cspecify "should have working CURRENT_TIME", [:jdbc, :sqlite], [:mysql2], [:tinytds] do
|
877
903
|
@db.create_table!(:constants){Time :t, :only_time=>true}
|
878
904
|
@ds.insert(:t=>Sequel::CURRENT_TIME)
|
879
905
|
(Time.now - @c[@ds.get(:t)]).must_be_close_to 0, 60
|
@@ -7,7 +7,7 @@ describe Sequel::Migrator do
|
|
7
7
|
@m = Sequel::Migrator
|
8
8
|
end
|
9
9
|
after do
|
10
|
-
@db.drop_table?(:schema_info, :schema_migrations, :sm1111, :sm1122, :sm2222, :sm2233, :sm3333, :sm11111, :sm22222)
|
10
|
+
@db.drop_table?(:schema_info, :schema_migrations, :sm1111, :sm1122, :sm2222, :sm2233, :sm3333, :sm11111, :sm22222, :a, :b, :c, :d)
|
11
11
|
end
|
12
12
|
|
13
13
|
it "should be able to migrate up and down all the way successfully" do
|
@@ -213,6 +213,28 @@ describe Sequel::Migrator do
|
|
213
213
|
[:schema_migrations, :a].each{|n| @db.table_exists?(n).must_equal false}
|
214
214
|
@db[:b].columns.must_equal [:a, :c, :e]
|
215
215
|
|
216
|
+
if @db.supports_foreign_key_parsing?
|
217
|
+
@m.apply(@db, @dir, 6)
|
218
|
+
[:schema_info, :b, :c].each{|n| @db.table_exists?(n).must_equal true}
|
219
|
+
[:schema_migrations, :a].each{|n| @db.table_exists?(n).must_equal false}
|
220
|
+
@db[:b].columns.must_equal [:a, :c, :e, :f]
|
221
|
+
|
222
|
+
@m.apply(@db, @dir, 7)
|
223
|
+
[:schema_info, :b, :c, :d].each{|n| @db.table_exists?(n).must_equal true}
|
224
|
+
[:schema_migrations, :a].each{|n| @db.table_exists?(n).must_equal false}
|
225
|
+
@db[:b].columns.must_equal [:a, :c, :e, :f, :g]
|
226
|
+
|
227
|
+
@m.apply(@db, @dir, 6)
|
228
|
+
[:schema_info, :b, :c].each{|n| @db.table_exists?(n).must_equal true}
|
229
|
+
[:schema_migrations, :a, :d].each{|n| @db.table_exists?(n).must_equal false}
|
230
|
+
@db[:b].columns.must_equal [:a, :c, :e, :f]
|
231
|
+
end
|
232
|
+
|
233
|
+
@m.apply(@db, @dir, 5)
|
234
|
+
[:schema_info, :b].each{|n| @db.table_exists?(n).must_equal true}
|
235
|
+
[:schema_migrations, :a, :c].each{|n| @db.table_exists?(n).must_equal false}
|
236
|
+
@db[:b].columns.must_equal [:a, :c, :e]
|
237
|
+
|
216
238
|
@m.apply(@db, @dir, 4)
|
217
239
|
[:schema_info, :b].each{|n| @db.table_exists?(n).must_equal true}
|
218
240
|
[:schema_migrations, :a].each{|n| @db.table_exists?(n).must_equal false}
|
@@ -762,7 +762,7 @@ describe "Database schema modifiers" do
|
|
762
762
|
end if DB.supports_deferrable_constraints?
|
763
763
|
end
|
764
764
|
|
765
|
-
describe "Database#tables" do
|
765
|
+
describe "Database#tables and #views" do
|
766
766
|
before do
|
767
767
|
class ::String
|
768
768
|
@@xxxxx = 0
|
@@ -771,6 +771,8 @@ describe "Database#tables" do
|
|
771
771
|
end
|
772
772
|
end
|
773
773
|
@db = DB
|
774
|
+
@db.drop_view(:sequel_test_view) rescue nil
|
775
|
+
@db.drop_table?(:sequel_test_table)
|
774
776
|
@db.create_table(:sequel_test_table){Integer :a}
|
775
777
|
@db.create_view :sequel_test_view, @db[:sequel_test_table]
|
776
778
|
@iom = @db.identifier_output_method
|
@@ -783,53 +785,31 @@ describe "Database#tables" do
|
|
783
785
|
@db.drop_table :sequel_test_table
|
784
786
|
end
|
785
787
|
|
786
|
-
it "should return an array of symbols" do
|
788
|
+
it "#tables should return an array of symbols" do
|
787
789
|
ts = @db.tables
|
788
790
|
ts.must_be_kind_of(Array)
|
789
791
|
ts.each{|t| t.must_be_kind_of(Symbol)}
|
790
792
|
ts.must_include(:sequel_test_table)
|
791
793
|
ts.wont_include(:sequel_test_view)
|
792
|
-
end
|
794
|
+
end if DB.supports_table_listing?
|
793
795
|
|
794
|
-
it "should respect the database's identifier_output_method" do
|
796
|
+
it "#tables should respect the database's identifier_output_method" do
|
795
797
|
@db.identifier_output_method = :xxxxx
|
796
798
|
@db.identifier_input_method = :xxxxx
|
797
799
|
@db.tables.each{|t| t.to_s.must_match(/\Ax{5}\d+\z/)}
|
798
|
-
end
|
799
|
-
end if DB.supports_table_listing?
|
800
|
+
end if DB.supports_table_listing?
|
800
801
|
|
801
|
-
|
802
|
-
before do
|
803
|
-
class ::String
|
804
|
-
@@xxxxx = 0
|
805
|
-
def xxxxx
|
806
|
-
"xxxxx#{@@xxxxx += 1}"
|
807
|
-
end
|
808
|
-
end
|
809
|
-
@db = DB
|
810
|
-
@db.create_table(:sequel_test_table){Integer :a}
|
811
|
-
@db.create_view :sequel_test_view, @db[:sequel_test_table]
|
812
|
-
@iom = @db.identifier_output_method
|
813
|
-
@iim = @db.identifier_input_method
|
814
|
-
end
|
815
|
-
after do
|
816
|
-
@db.identifier_output_method = @iom
|
817
|
-
@db.identifier_input_method = @iim
|
818
|
-
@db.drop_view :sequel_test_view
|
819
|
-
@db.drop_table :sequel_test_table
|
820
|
-
end
|
821
|
-
|
822
|
-
it "should return an array of symbols" do
|
802
|
+
it "#views should return an array of symbols" do
|
823
803
|
ts = @db.views
|
824
804
|
ts.must_be_kind_of(Array)
|
825
805
|
ts.each{|t| t.must_be_kind_of(Symbol)}
|
826
806
|
ts.wont_include(:sequel_test_table)
|
827
807
|
ts.must_include(:sequel_test_view)
|
828
|
-
end
|
808
|
+
end if DB.supports_view_listing?
|
829
809
|
|
830
|
-
it "should respect the database's identifier_output_method" do
|
810
|
+
it "#views should respect the database's identifier_output_method" do
|
831
811
|
@db.identifier_output_method = :xxxxx
|
832
812
|
@db.identifier_input_method = :xxxxx
|
833
813
|
@db.views.each{|t| t.to_s.must_match(/\Ax{5}\d+\z/)}
|
834
|
-
end
|
835
|
-
end
|
814
|
+
end if DB.supports_view_listing?
|
815
|
+
end
|
@@ -93,6 +93,16 @@ describe "Database transactions" do
|
|
93
93
|
@d.select_order_map(:name).must_equal %w'1 2'
|
94
94
|
end
|
95
95
|
|
96
|
+
it "should handle :rollback=>:always inside transactions" do
|
97
|
+
@db.transaction do
|
98
|
+
@db.transaction(:rollback=>:always) do
|
99
|
+
@d << {:name => 'abc', :value => 1}
|
100
|
+
2
|
101
|
+
end.must_equal 2
|
102
|
+
end
|
103
|
+
@d.select_order_map(:value).must_equal []
|
104
|
+
end
|
105
|
+
|
96
106
|
it "should handle table_exists? failures inside savepoints" do
|
97
107
|
@db.transaction do
|
98
108
|
@d << {:name => '1'}
|
@@ -38,7 +38,7 @@ describe "Supported types" do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should support generic bignum type" do
|
41
|
-
ds = create_items_table_with_column(:number, Bignum)
|
41
|
+
ds = create_items_table_with_column(:number, :Bignum)
|
42
42
|
ds.insert(:number => 2**34)
|
43
43
|
ds.all.must_equal [{:number=>2**34}]
|
44
44
|
end
|