sequel 2.9.0 → 2.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +56 -0
- data/{README → README.rdoc} +85 -57
- data/Rakefile +10 -5
- data/bin/sequel +7 -16
- data/doc/advanced_associations.rdoc +5 -17
- data/doc/cheat_sheet.rdoc +18 -20
- data/doc/dataset_filtering.rdoc +8 -32
- data/doc/schema.rdoc +20 -0
- data/lib/sequel_core.rb +35 -1
- data/lib/sequel_core/adapters/ado.rb +1 -1
- data/lib/sequel_core/adapters/db2.rb +2 -2
- data/lib/sequel_core/adapters/dbi.rb +2 -11
- data/lib/sequel_core/adapters/do.rb +205 -0
- data/lib/sequel_core/adapters/do/mysql.rb +38 -0
- data/lib/sequel_core/adapters/do/postgres.rb +92 -0
- data/lib/sequel_core/adapters/do/sqlite.rb +31 -0
- data/lib/sequel_core/adapters/firebird.rb +298 -0
- data/lib/sequel_core/adapters/informix.rb +10 -1
- data/lib/sequel_core/adapters/jdbc.rb +78 -19
- data/lib/sequel_core/adapters/jdbc/h2.rb +69 -0
- data/lib/sequel_core/adapters/jdbc/mysql.rb +10 -0
- data/lib/sequel_core/adapters/jdbc/postgresql.rb +7 -3
- data/lib/sequel_core/adapters/mysql.rb +53 -77
- data/lib/sequel_core/adapters/odbc.rb +1 -1
- data/lib/sequel_core/adapters/openbase.rb +1 -1
- data/lib/sequel_core/adapters/oracle.rb +2 -2
- data/lib/sequel_core/adapters/postgres.rb +16 -14
- data/lib/sequel_core/adapters/shared/mysql.rb +44 -9
- data/lib/sequel_core/adapters/shared/oracle.rb +4 -5
- data/lib/sequel_core/adapters/shared/postgres.rb +86 -82
- data/lib/sequel_core/adapters/shared/sqlite.rb +39 -24
- data/lib/sequel_core/adapters/sqlite.rb +11 -1
- data/lib/sequel_core/connection_pool.rb +10 -2
- data/lib/sequel_core/core_sql.rb +13 -3
- data/lib/sequel_core/database.rb +131 -30
- data/lib/sequel_core/database/schema.rb +5 -5
- data/lib/sequel_core/dataset.rb +31 -6
- data/lib/sequel_core/dataset/convenience.rb +11 -11
- data/lib/sequel_core/dataset/query.rb +2 -2
- data/lib/sequel_core/dataset/sql.rb +6 -6
- data/lib/sequel_core/exceptions.rb +4 -0
- data/lib/sequel_core/migration.rb +4 -4
- data/lib/sequel_core/schema/generator.rb +19 -3
- data/lib/sequel_core/schema/sql.rb +24 -20
- data/lib/sequel_core/sql.rb +13 -16
- data/lib/sequel_core/version.rb +11 -0
- data/lib/sequel_model.rb +2 -0
- data/lib/sequel_model/base.rb +2 -2
- data/lib/sequel_model/hooks.rb +46 -7
- data/lib/sequel_model/record.rb +11 -9
- data/lib/sequel_model/schema.rb +1 -1
- data/lib/sequel_model/validations.rb +72 -61
- data/spec/adapters/firebird_spec.rb +371 -0
- data/spec/adapters/mysql_spec.rb +118 -62
- data/spec/adapters/oracle_spec.rb +5 -5
- data/spec/adapters/postgres_spec.rb +33 -18
- data/spec/adapters/sqlite_spec.rb +2 -2
- data/spec/integration/dataset_test.rb +3 -3
- data/spec/integration/schema_test.rb +55 -5
- data/spec/integration/spec_helper.rb +11 -0
- data/spec/integration/type_test.rb +59 -16
- data/spec/sequel_core/connection_pool_spec.rb +14 -0
- data/spec/sequel_core/core_sql_spec.rb +24 -14
- data/spec/sequel_core/database_spec.rb +96 -11
- data/spec/sequel_core/dataset_spec.rb +97 -37
- data/spec/sequel_core/expression_filters_spec.rb +51 -40
- data/spec/sequel_core/object_graph_spec.rb +2 -2
- data/spec/sequel_core/schema_generator_spec.rb +31 -6
- data/spec/sequel_core/schema_spec.rb +25 -9
- data/spec/sequel_core/spec_helper.rb +4 -1
- data/spec/sequel_core/version_spec.rb +7 -0
- data/spec/sequel_model/associations_spec.rb +1 -1
- data/spec/sequel_model/hooks_spec.rb +68 -13
- data/spec/sequel_model/model_spec.rb +4 -4
- data/spec/sequel_model/record_spec.rb +22 -0
- data/spec/sequel_model/spec_helper.rb +2 -1
- data/spec/sequel_model/validations_spec.rb +107 -7
- metadata +15 -5
@@ -335,10 +335,10 @@ context "SQLite::Dataset#delete" do
|
|
335
335
|
|
336
336
|
specify "should return the number of records affected when filtered" do
|
337
337
|
@d.count.should == 3
|
338
|
-
@d.filter {:value < 3}.delete.should == 1
|
338
|
+
@d.filter {:value.sql_number < 3}.delete.should == 1
|
339
339
|
@d.count.should == 2
|
340
340
|
|
341
|
-
@d.filter {:value < 3}.delete.should == 0
|
341
|
+
@d.filter {:value.sql_number < 3}.delete.should == 0
|
342
342
|
@d.count.should == 2
|
343
343
|
end
|
344
344
|
|
@@ -66,7 +66,7 @@ describe "Simple Dataset operations in transactions" do
|
|
66
66
|
specify "should insert correctly with a primary key specified inside a transaction" do
|
67
67
|
INTEGRATION_DB.transaction do
|
68
68
|
@ds.insert(:id=>100, :number=>20)
|
69
|
-
sqls_should_be(/INSERT INTO items_insert_in_transaction \((number, id|id, number)\) VALUES \((100, 20|20, 100)\)/)
|
69
|
+
sqls_should_be('Transaction.begin', /INSERT INTO items_insert_in_transaction \((number, id|id, number)\) VALUES \((100, 20|20, 100)\)/)
|
70
70
|
@ds.count.should == 1
|
71
71
|
@ds.order(:id).all.should == [{:id=>100, :number=>20}]
|
72
72
|
end
|
@@ -75,7 +75,7 @@ describe "Simple Dataset operations in transactions" do
|
|
75
75
|
specify "should have insert return primary key value inside a transaction" do
|
76
76
|
INTEGRATION_DB.transaction do
|
77
77
|
@ds.insert(:number=>20).should == 1
|
78
|
-
sqls_should_be(/INSERT INTO items_insert_in_transaction \(number\) VALUES \(20\)/)
|
78
|
+
sqls_should_be('Transaction.begin', /INSERT INTO items_insert_in_transaction \(number\) VALUES \(20\)/)
|
79
79
|
@ds.count.should == 1
|
80
80
|
@ds.order(:id).all.should == [{:id=>1, :number=>20}]
|
81
81
|
end
|
@@ -131,4 +131,4 @@ describe "Dataset UNION, EXCEPT, and INTERSECT" do
|
|
131
131
|
@ds1.intersect(@ds2.intersect(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'10'
|
132
132
|
end
|
133
133
|
end
|
134
|
-
end
|
134
|
+
end
|
@@ -1,8 +1,27 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'spec_helper.rb')
|
2
2
|
|
3
|
+
if INTEGRATION_DB.respond_to?(:schema_parse_table, true)
|
3
4
|
describe "Database schema parser" do
|
5
|
+
before do
|
6
|
+
@iom = INTEGRATION_DB.identifier_output_method
|
7
|
+
@iim = INTEGRATION_DB.identifier_input_method
|
8
|
+
@defsch = INTEGRATION_DB.default_schema
|
9
|
+
clear_sqls
|
10
|
+
end
|
4
11
|
after do
|
5
12
|
INTEGRATION_DB.drop_table(:items) if INTEGRATION_DB.table_exists?(:items)
|
13
|
+
INTEGRATION_DB.identifier_output_method = @iom
|
14
|
+
INTEGRATION_DB.identifier_input_method = @iim
|
15
|
+
INTEGRATION_DB.default_schema = @defsch
|
16
|
+
end
|
17
|
+
|
18
|
+
specify "should handle a database with a identifier_output_method" do
|
19
|
+
INTEGRATION_DB.identifier_output_method = :reverse
|
20
|
+
INTEGRATION_DB.identifier_input_method = :reverse
|
21
|
+
INTEGRATION_DB.default_schema = nil if INTEGRATION_DB.default_schema
|
22
|
+
INTEGRATION_DB.create_table!(:items){integer :number}
|
23
|
+
INTEGRATION_DB.schema(nil, :reload=>true)[:items].should be_a_kind_of(Array)
|
24
|
+
INTEGRATION_DB.schema(:items, :reload=>true).first.first.should == :number
|
6
25
|
end
|
7
26
|
|
8
27
|
specify "should be a hash with table_names as symbols" do
|
@@ -71,6 +90,7 @@ describe "Database schema parser" do
|
|
71
90
|
INTEGRATION_DB.schema(:items).first.last[:default].gsub(/::character varying\z/, '').gsub("'", '').should == "blah"
|
72
91
|
end
|
73
92
|
end
|
93
|
+
end
|
74
94
|
|
75
95
|
describe "Database schema modifiers" do
|
76
96
|
before do
|
@@ -99,11 +119,9 @@ describe "Database schema modifiers" do
|
|
99
119
|
INTEGRATION_DB.alter_table(:items){add_primary_key :id}
|
100
120
|
INTEGRATION_DB.schema(:items, :reload=>true).map{|x| x.first}.should == [:number, :name, :id]
|
101
121
|
@ds.columns!.should == [:number, :name, :id]
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
@ds.columns!.should == [:number, :name, :id, :item_id]
|
106
|
-
end
|
122
|
+
INTEGRATION_DB.alter_table(:items){add_foreign_key :item_id, :items}
|
123
|
+
INTEGRATION_DB.schema(:items, :reload=>true).map{|x| x.first}.should == [:number, :name, :id, :item_id]
|
124
|
+
@ds.columns!.should == [:number, :name, :id, :item_id]
|
107
125
|
end
|
108
126
|
end
|
109
127
|
|
@@ -128,3 +146,35 @@ describe "Database schema modifiers" do
|
|
128
146
|
@ds.columns!.should == [:id]
|
129
147
|
end
|
130
148
|
end
|
149
|
+
|
150
|
+
if INTEGRATION_DB.respond_to?(:tables)
|
151
|
+
describe "Database#tables" do
|
152
|
+
before do
|
153
|
+
class ::String
|
154
|
+
@@xxxxx = 0
|
155
|
+
def xxxxx
|
156
|
+
"xxxxx#{@@xxxxx += 1}"
|
157
|
+
end
|
158
|
+
end
|
159
|
+
@iom = INTEGRATION_DB.identifier_output_method
|
160
|
+
@iim = INTEGRATION_DB.identifier_input_method
|
161
|
+
clear_sqls
|
162
|
+
end
|
163
|
+
after do
|
164
|
+
INTEGRATION_DB.identifier_output_method = @iom
|
165
|
+
INTEGRATION_DB.identifier_input_method = @iim
|
166
|
+
end
|
167
|
+
|
168
|
+
specify "should return an array of symbols" do
|
169
|
+
ts = INTEGRATION_DB.tables
|
170
|
+
ts.should be_a_kind_of(Array)
|
171
|
+
ts.each{|t| t.should be_a_kind_of(Symbol)}
|
172
|
+
end
|
173
|
+
|
174
|
+
specify "should respect the database's identifier_output_method" do
|
175
|
+
INTEGRATION_DB.identifier_output_method = :xxxxx
|
176
|
+
INTEGRATION_DB.identifier_input_method = :xxxxx
|
177
|
+
INTEGRATION_DB.tables.each{|t| t.to_s.should =~ /\Ax{5}\d+\z/}
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
@@ -13,10 +13,21 @@ def clear_sqls
|
|
13
13
|
$sqls.clear
|
14
14
|
end
|
15
15
|
|
16
|
+
class Spec::Example::ExampleGroup
|
17
|
+
def start_logging
|
18
|
+
require 'logger'
|
19
|
+
INTEGRATION_DB.loggers << Logger.new(STDOUT)
|
20
|
+
end
|
21
|
+
def stop_logging
|
22
|
+
INTEGRATION_DB.loggers.clear
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
16
26
|
if defined?(INTEGRATION_DB) || defined?(INTEGRATION_URL) || ENV['SEQUEL_INTEGRATION_URL']
|
17
27
|
unless defined?(INTEGRATION_DB)
|
18
28
|
url = defined?(INTEGRATION_URL) ? INTEGRATION_URL : ENV['SEQUEL_INTEGRATION_URL']
|
19
29
|
INTEGRATION_DB = Sequel.connect(url)
|
30
|
+
#INTEGRATION_DB.instance_variable_set(:@server_version, 80100)
|
20
31
|
end
|
21
32
|
class Spec::Example::ExampleGroup
|
22
33
|
def sqls_should_be(*args)
|
@@ -1,43 +1,86 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'spec_helper.rb')
|
2
2
|
|
3
3
|
describe "Supported types" do
|
4
|
-
def create_items_table_with_column(name, type)
|
5
|
-
INTEGRATION_DB.create_table!(:items){column name, type}
|
4
|
+
def create_items_table_with_column(name, type, opts={})
|
5
|
+
INTEGRATION_DB.create_table!(:items){column name, type, opts}
|
6
6
|
INTEGRATION_DB[:items]
|
7
7
|
end
|
8
8
|
|
9
9
|
specify "should support NULL correctly" do
|
10
|
-
ds = create_items_table_with_column(:number,
|
10
|
+
ds = create_items_table_with_column(:number, Integer)
|
11
11
|
ds.insert(:number => nil)
|
12
12
|
ds.all.should == [{:number=>nil}]
|
13
13
|
end
|
14
14
|
|
15
|
-
specify "should support integer type" do
|
16
|
-
ds = create_items_table_with_column(:number,
|
15
|
+
specify "should support generic integer type" do
|
16
|
+
ds = create_items_table_with_column(:number, Integer)
|
17
17
|
ds.insert(:number => 2)
|
18
18
|
ds.all.should == [{:number=>2}]
|
19
19
|
end
|
20
|
+
|
21
|
+
specify "should support generic fixnum type" do
|
22
|
+
ds = create_items_table_with_column(:number, Fixnum)
|
23
|
+
ds.insert(:number => 2)
|
24
|
+
ds.all.should == [{:number=>2}]
|
25
|
+
end
|
26
|
+
|
27
|
+
specify "should support generic bignum type" do
|
28
|
+
ds = create_items_table_with_column(:number, Bignum)
|
29
|
+
ds.insert(:number => 2**34)
|
30
|
+
ds.all.should == [{:number=>2**34}]
|
31
|
+
end
|
32
|
+
|
33
|
+
specify "should support generic float type" do
|
34
|
+
ds = create_items_table_with_column(:number, Float)
|
35
|
+
ds.insert(:number => 2.1)
|
36
|
+
ds.all.should == [{:number=>2.1}]
|
37
|
+
end
|
38
|
+
|
39
|
+
specify "should support generic numeric type" do
|
40
|
+
ds = create_items_table_with_column(:number, Numeric, :size=>[15, 10])
|
41
|
+
ds.insert(:number => BigDecimal.new('2.123456789'))
|
42
|
+
ds.all.should == [{:number=>BigDecimal.new('2.123456789')}]
|
43
|
+
ds = create_items_table_with_column(:number, BigDecimal, :size=>[15, 10])
|
44
|
+
ds.insert(:number => BigDecimal.new('2.123456789'))
|
45
|
+
ds.all.should == [{:number=>BigDecimal.new('2.123456789')}]
|
46
|
+
end
|
20
47
|
|
21
|
-
specify "should support
|
22
|
-
ds = create_items_table_with_column(:name,
|
48
|
+
specify "should support generic string type" do
|
49
|
+
ds = create_items_table_with_column(:name, String)
|
23
50
|
ds.insert(:name => 'Test User')
|
24
51
|
ds.all.should == [{:name=>'Test User'}]
|
25
52
|
end
|
26
53
|
|
27
|
-
specify "should support date type" do
|
28
|
-
ds = create_items_table_with_column(:dat,
|
54
|
+
specify "should support generic date type" do
|
55
|
+
ds = create_items_table_with_column(:dat, Date)
|
29
56
|
d = Date.today
|
30
57
|
ds.insert(:dat => d)
|
31
|
-
|
32
|
-
x = x.iso8601.to_date if Time === x
|
33
|
-
x.to_s.should == d.to_s
|
58
|
+
ds.first[:dat].should == d
|
34
59
|
end
|
35
60
|
|
36
|
-
specify "should support
|
37
|
-
ds = create_items_table_with_column(:tim,
|
61
|
+
specify "should support generic datetime type" do
|
62
|
+
ds = create_items_table_with_column(:tim, DateTime)
|
63
|
+
t = DateTime.now
|
64
|
+
ds.insert(:tim => t)
|
65
|
+
ds.first[:tim].strftime('%Y%m%d%H%M%S').should == t.strftime('%Y%m%d%H%M%S')
|
66
|
+
ds = create_items_table_with_column(:tim, Time)
|
38
67
|
t = Time.now
|
39
68
|
ds.insert(:tim => t)
|
40
|
-
|
41
|
-
|
69
|
+
ds.first[:tim].strftime('%Y%m%d%H%M%S').should == t.strftime('%Y%m%d%H%M%S')
|
70
|
+
end
|
71
|
+
|
72
|
+
specify "should support generic file type" do
|
73
|
+
ds = create_items_table_with_column(:name, File)
|
74
|
+
ds.insert(:name => ("a\0"*300).to_blob)
|
75
|
+
ds.all.should == [{:name=>("a\0"*300).to_blob}]
|
76
|
+
end
|
77
|
+
|
78
|
+
specify "should support generic boolean type" do
|
79
|
+
ds = create_items_table_with_column(:number, TrueClass)
|
80
|
+
ds.insert(:number => true)
|
81
|
+
ds.all.should == [{:number=>true}]
|
82
|
+
ds = create_items_table_with_column(:number, FalseClass)
|
83
|
+
ds.insert(:number => true)
|
84
|
+
ds.all.should == [{:number=>true}]
|
42
85
|
end
|
43
86
|
end
|
@@ -88,6 +88,20 @@ context "A connection pool handling connections" do
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
+
context "A connection pool handling connection errors" do
|
92
|
+
specify "#hold should raise a Sequel::DatabaseConnectionError if an exception is raised by the connection_proc" do
|
93
|
+
cpool = Sequel::ConnectionPool.new(CONNECTION_POOL_DEFAULTS){raise Interrupt}
|
94
|
+
proc{cpool.hold{:block_return}}.should raise_error(Sequel::DatabaseConnectionError)
|
95
|
+
cpool.created_count.should == 0
|
96
|
+
end
|
97
|
+
|
98
|
+
specify "#hold should raise a Sequel::DatabaseConnectionError if nil is returned by the connection_proc" do
|
99
|
+
cpool = Sequel::ConnectionPool.new(CONNECTION_POOL_DEFAULTS){nil}
|
100
|
+
proc{cpool.hold{:block_return}}.should raise_error(Sequel::DatabaseConnectionError)
|
101
|
+
cpool.created_count.should == 0
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
91
105
|
class DummyConnection
|
92
106
|
@@value = 0
|
93
107
|
def initialize
|
@@ -161,7 +161,7 @@ context "#desc" do
|
|
161
161
|
end
|
162
162
|
|
163
163
|
specify "should format a DESC clause for a function" do
|
164
|
-
:avg
|
164
|
+
:avg.sql_function(:test).desc.to_s(@ds).should == 'avg(test) DESC'
|
165
165
|
end
|
166
166
|
end
|
167
167
|
|
@@ -177,7 +177,7 @@ context "#asc" do
|
|
177
177
|
end
|
178
178
|
|
179
179
|
specify "should format a ASC clause for a function" do
|
180
|
-
:avg
|
180
|
+
:avg.sql_function(:test).asc.to_s(@ds).should == 'avg(test) ASC'
|
181
181
|
end
|
182
182
|
end
|
183
183
|
|
@@ -193,7 +193,7 @@ context "#as" do
|
|
193
193
|
end
|
194
194
|
|
195
195
|
specify "should format a AS clause for a function" do
|
196
|
-
:avg
|
196
|
+
:avg.sql_function(:test).as(:avg).to_s(@ds).should == 'avg(test) AS avg'
|
197
197
|
end
|
198
198
|
|
199
199
|
specify "should format a AS clause for a literal value" do
|
@@ -222,14 +222,14 @@ context "Column references" do
|
|
222
222
|
end
|
223
223
|
|
224
224
|
specify "should be quoted properly in SQL functions" do
|
225
|
-
@ds.literal(:avg
|
226
|
-
@ds.literal(:avg
|
227
|
-
@ds.literal(:avg
|
225
|
+
@ds.literal(:avg.sql_function(:xyz)).should == "avg(`xyz`)"
|
226
|
+
@ds.literal(:avg.sql_function(:xyz, 1)).should == "avg(`xyz`, 1)"
|
227
|
+
@ds.literal(:avg.sql_function(:xyz).as(:a)).should == "avg(`xyz`) AS `a`"
|
228
228
|
end
|
229
229
|
|
230
230
|
specify "should be quoted properly in ASC/DESC clauses" do
|
231
231
|
@ds.literal(:xyz.asc).should == "`xyz` ASC"
|
232
|
-
@ds.literal(:avg
|
232
|
+
@ds.literal(:avg.sql_function(:xyz, 1).desc).should == "avg(`xyz`, 1) DESC"
|
233
233
|
end
|
234
234
|
|
235
235
|
specify "should be quoted properly in a cast function" do
|
@@ -245,6 +245,17 @@ context "Blob" do
|
|
245
245
|
end
|
246
246
|
end
|
247
247
|
|
248
|
+
if RUBY_VERSION < '1.9.0'
|
249
|
+
context "Symbol#[]" do
|
250
|
+
specify "should format an SQL Function" do
|
251
|
+
ds = Sequel::Dataset.new(nil)
|
252
|
+
ds.literal(:xyz[]).should == 'xyz()'
|
253
|
+
ds.literal(:xyz[1]).should == 'xyz(1)'
|
254
|
+
ds.literal(:xyz[1, 2, :abc[3]]).should == 'xyz(1, 2, abc(3))'
|
255
|
+
end
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
248
259
|
context "Symbol#*" do
|
249
260
|
setup do
|
250
261
|
@ds = Sequel::Dataset.new(nil)
|
@@ -263,7 +274,6 @@ context "Symbol#*" do
|
|
263
274
|
specify "should support qualified symbols if no argument" do
|
264
275
|
:xyz__abc.*.to_s(@ds).should == 'xyz.abc.*'
|
265
276
|
end
|
266
|
-
|
267
277
|
end
|
268
278
|
|
269
279
|
context "Symbol" do
|
@@ -333,13 +343,13 @@ context "Symbol" do
|
|
333
343
|
end
|
334
344
|
|
335
345
|
specify "should support upper case outer functions" do
|
336
|
-
:COUNT
|
346
|
+
:COUNT.sql_function('1').to_s(@ds).should == "COUNT('1')"
|
337
347
|
end
|
338
348
|
|
339
349
|
specify "should inhibit string literalization" do
|
340
350
|
db = Sequel::Database.new
|
341
351
|
ds = db[:t]
|
342
|
-
ds.select(:COUNT
|
352
|
+
ds.select(:COUNT.sql_function('1')).sql.should == "SELECT COUNT('1') FROM t"
|
343
353
|
end
|
344
354
|
|
345
355
|
specify "should support cast method and its cast_as alias" do
|
@@ -471,14 +481,14 @@ end
|
|
471
481
|
|
472
482
|
context "Sequel::SQL::Function#==" do
|
473
483
|
specify "should be true for functions with the same name and arguments, false otherwise" do
|
474
|
-
a = :date
|
475
|
-
b = :date
|
484
|
+
a = :date.sql_function(:t)
|
485
|
+
b = :date.sql_function(:t)
|
476
486
|
a.should == b
|
477
487
|
(a == b).should == true
|
478
|
-
c = :date
|
488
|
+
c = :date.sql_function(:c)
|
479
489
|
a.should_not == c
|
480
490
|
(a == c).should == false
|
481
|
-
d = :time
|
491
|
+
d = :time.sql_function(:c)
|
482
492
|
a.should_not == d
|
483
493
|
c.should_not == d
|
484
494
|
(a == d).should == false
|
@@ -6,7 +6,8 @@ context "A new Database" do
|
|
6
6
|
end
|
7
7
|
teardown do
|
8
8
|
Sequel.quote_identifiers = false
|
9
|
-
Sequel.
|
9
|
+
Sequel.identifier_input_method = nil
|
10
|
+
Sequel.identifier_output_method = nil
|
10
11
|
end
|
11
12
|
|
12
13
|
specify "should receive options" do
|
@@ -74,6 +75,48 @@ context "A new Database" do
|
|
74
75
|
db.upcase_identifiers = false
|
75
76
|
db.upcase_identifiers?.should == false
|
76
77
|
end
|
78
|
+
|
79
|
+
specify "should respect the :identifier_input_method option" do
|
80
|
+
Sequel.identifier_input_method = nil
|
81
|
+
db = Sequel::Database.new(:identifier_input_method=>nil)
|
82
|
+
db.identifier_input_method.should == nil
|
83
|
+
db.identifier_input_method = :downcase
|
84
|
+
db.identifier_input_method.should == :downcase
|
85
|
+
db = Sequel::Database.new(:identifier_input_method=>:upcase)
|
86
|
+
db.identifier_input_method.should == :upcase
|
87
|
+
db.identifier_input_method = nil
|
88
|
+
db.identifier_input_method.should == nil
|
89
|
+
Sequel.identifier_input_method = :downcase
|
90
|
+
db = Sequel::Database.new(:identifier_input_method=>nil)
|
91
|
+
db.identifier_input_method.should == nil
|
92
|
+
db.identifier_input_method = :upcase
|
93
|
+
db.identifier_input_method.should == :upcase
|
94
|
+
db = Sequel::Database.new(:identifier_input_method=>:upcase)
|
95
|
+
db.identifier_input_method.should == :upcase
|
96
|
+
db.identifier_input_method = nil
|
97
|
+
db.identifier_input_method.should == nil
|
98
|
+
end
|
99
|
+
|
100
|
+
specify "should respect the :identifier_output_method option" do
|
101
|
+
Sequel.identifier_output_method = nil
|
102
|
+
db = Sequel::Database.new(:identifier_output_method=>nil)
|
103
|
+
db.identifier_output_method.should == nil
|
104
|
+
db.identifier_output_method = :downcase
|
105
|
+
db.identifier_output_method.should == :downcase
|
106
|
+
db = Sequel::Database.new(:identifier_output_method=>:upcase)
|
107
|
+
db.identifier_output_method.should == :upcase
|
108
|
+
db.identifier_output_method = nil
|
109
|
+
db.identifier_output_method.should == nil
|
110
|
+
Sequel.identifier_output_method = :downcase
|
111
|
+
db = Sequel::Database.new(:identifier_output_method=>nil)
|
112
|
+
db.identifier_output_method.should == nil
|
113
|
+
db.identifier_output_method = :upcase
|
114
|
+
db.identifier_output_method.should == :upcase
|
115
|
+
db = Sequel::Database.new(:identifier_output_method=>:upcase)
|
116
|
+
db.identifier_output_method.should == :upcase
|
117
|
+
db.identifier_output_method = nil
|
118
|
+
db.identifier_output_method.should == nil
|
119
|
+
end
|
77
120
|
|
78
121
|
specify "should use the default Sequel.quote_identifiers value" do
|
79
122
|
Sequel.quote_identifiers = true
|
@@ -96,14 +139,56 @@ context "A new Database" do
|
|
96
139
|
Sequel::Database.upcase_identifiers = false
|
97
140
|
Sequel::Database.new({}).upcase_identifiers?.should == false
|
98
141
|
end
|
142
|
+
|
143
|
+
specify "should use the default Sequel.identifier_input_method value" do
|
144
|
+
Sequel.identifier_input_method = :downcase
|
145
|
+
Sequel::Database.new({}).identifier_input_method.should == :downcase
|
146
|
+
Sequel.identifier_input_method = :upcase
|
147
|
+
Sequel::Database.new({}).identifier_input_method.should == :upcase
|
148
|
+
Sequel::Database.identifier_input_method = :downcase
|
149
|
+
Sequel::Database.new({}).identifier_input_method.should == :downcase
|
150
|
+
Sequel::Database.identifier_input_method = :upcase
|
151
|
+
Sequel::Database.new({}).identifier_input_method.should == :upcase
|
152
|
+
end
|
153
|
+
|
154
|
+
specify "should use the default Sequel.identifier_output_method value" do
|
155
|
+
Sequel.identifier_output_method = :downcase
|
156
|
+
Sequel::Database.new({}).identifier_output_method.should == :downcase
|
157
|
+
Sequel.identifier_output_method = :upcase
|
158
|
+
Sequel::Database.new({}).identifier_output_method.should == :upcase
|
159
|
+
Sequel::Database.identifier_output_method = :downcase
|
160
|
+
Sequel::Database.new({}).identifier_output_method.should == :downcase
|
161
|
+
Sequel::Database.identifier_output_method = :upcase
|
162
|
+
Sequel::Database.new({}).identifier_output_method.should == :upcase
|
163
|
+
end
|
99
164
|
|
100
|
-
specify "should respect the
|
101
|
-
Sequel.
|
102
|
-
Sequel::Database.new({}).
|
103
|
-
x = Class.new(Sequel::Database){def
|
104
|
-
x.new({}).
|
105
|
-
y = Class.new(Sequel::Database){def
|
106
|
-
y.new({}).
|
165
|
+
specify "should respect the quote_indentifiers_default method if Sequel.quote_identifiers = nil" do
|
166
|
+
Sequel.quote_identifiers = nil
|
167
|
+
Sequel::Database.new({}).quote_identifiers?.should == true
|
168
|
+
x = Class.new(Sequel::Database){def quote_identifiers_default; false end}
|
169
|
+
x.new({}).quote_identifiers?.should == false
|
170
|
+
y = Class.new(Sequel::Database){def quote_identifiers_default; true end}
|
171
|
+
y.new({}).quote_identifiers?.should == true
|
172
|
+
end
|
173
|
+
|
174
|
+
specify "should respect the identifier_input_method_default method" do
|
175
|
+
class Sequel::Database
|
176
|
+
@@identifier_input_method = nil
|
177
|
+
end
|
178
|
+
x = Class.new(Sequel::Database){def identifier_input_method_default; :downcase end}
|
179
|
+
x.new({}).identifier_input_method.should == :downcase
|
180
|
+
y = Class.new(Sequel::Database){def identifier_input_method_default; :camelize end}
|
181
|
+
y.new({}).identifier_input_method.should == :camelize
|
182
|
+
end
|
183
|
+
|
184
|
+
specify "should respect the identifier_output_method_default method if Sequel.upcase_identifiers = nil" do
|
185
|
+
class Sequel::Database
|
186
|
+
@@identifier_output_method = nil
|
187
|
+
end
|
188
|
+
x = Class.new(Sequel::Database){def identifier_output_method_default; :upcase end}
|
189
|
+
x.new({}).identifier_output_method.should == :upcase
|
190
|
+
y = Class.new(Sequel::Database){def identifier_output_method_default; :underscore end}
|
191
|
+
y.new({}).identifier_output_method.should == :underscore
|
107
192
|
end
|
108
193
|
|
109
194
|
specify "should just use a :uri option for jdbc with the full connection string" do
|
@@ -180,7 +265,7 @@ context "Database#dataset" do
|
|
180
265
|
end
|
181
266
|
|
182
267
|
specify "should provide a filtered #from dataset if a block is given" do
|
183
|
-
d = @db.from(:mau) {:x > 100}
|
268
|
+
d = @db.from(:mau) {:x.sql_number > 100}
|
184
269
|
d.should be_a_kind_of(Sequel::Dataset)
|
185
270
|
d.sql.should == 'SELECT * FROM mau WHERE (x > 100)'
|
186
271
|
end
|
@@ -869,7 +954,7 @@ context "Database#fetch" do
|
|
869
954
|
ds.select_sql.should == 'select * from xyz'
|
870
955
|
ds.sql.should == 'select * from xyz'
|
871
956
|
|
872
|
-
ds.filter!(:price < 100)
|
957
|
+
ds.filter!(:price.sql_number < 100)
|
873
958
|
ds.select_sql.should == 'select * from xyz'
|
874
959
|
ds.sql.should == 'select * from xyz'
|
875
960
|
end
|
@@ -1008,7 +1093,7 @@ context "Database#get" do
|
|
1008
1093
|
@db.get(1).should == 1
|
1009
1094
|
@db.sqls.last.should == 'SELECT 1'
|
1010
1095
|
|
1011
|
-
@db.get(:version
|
1096
|
+
@db.get(:version.sql_function)
|
1012
1097
|
@db.sqls.last.should == 'SELECT version()'
|
1013
1098
|
end
|
1014
1099
|
end
|