sequel 2.9.0 → 2.10.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 +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
|