sequel 4.46.0 → 4.49.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 +210 -0
- data/Rakefile +1 -1
- data/doc/advanced_associations.rdoc +1 -1
- data/doc/opening_databases.rdoc +3 -2
- data/doc/release_notes/4.47.0.txt +56 -0
- data/doc/release_notes/4.48.0.txt +293 -0
- data/doc/release_notes/4.49.0.txt +222 -0
- data/lib/sequel/adapters/ado/access.rb +2 -1
- data/lib/sequel/adapters/do/postgres.rb +5 -2
- data/lib/sequel/adapters/ibmdb.rb +30 -8
- data/lib/sequel/adapters/jdbc/as400.rb +1 -1
- data/lib/sequel/adapters/jdbc/db2.rb +12 -3
- data/lib/sequel/adapters/jdbc/derby.rb +4 -5
- data/lib/sequel/adapters/jdbc/h2.rb +10 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +16 -2
- data/lib/sequel/adapters/jdbc/postgresql.rb +46 -20
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +9 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +20 -6
- data/lib/sequel/adapters/jdbc.rb +39 -23
- data/lib/sequel/adapters/mock.rb +27 -19
- data/lib/sequel/adapters/mysql.rb +17 -16
- data/lib/sequel/adapters/mysql2.rb +5 -6
- data/lib/sequel/adapters/oracle.rb +5 -9
- data/lib/sequel/adapters/postgres.rb +91 -103
- data/lib/sequel/adapters/shared/db2.rb +22 -6
- data/lib/sequel/adapters/shared/mssql.rb +5 -4
- data/lib/sequel/adapters/shared/mysql.rb +79 -25
- data/lib/sequel/adapters/shared/oracle.rb +26 -3
- data/lib/sequel/adapters/shared/postgres.rb +199 -95
- data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
- data/lib/sequel/adapters/shared/sqlite.rb +72 -82
- data/lib/sequel/adapters/sqlanywhere.rb +4 -1
- data/lib/sequel/adapters/sqlite.rb +5 -3
- data/lib/sequel/adapters/swift/postgres.rb +5 -2
- data/lib/sequel/adapters/tinytds.rb +0 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -1
- data/lib/sequel/adapters/utils/pg_types.rb +2 -76
- data/lib/sequel/ast_transformer.rb +1 -1
- data/lib/sequel/connection_pool/sharded_single.rb +1 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +1 -1
- data/lib/sequel/connection_pool/single.rb +2 -2
- data/lib/sequel/connection_pool/threaded.rb +2 -2
- data/lib/sequel/connection_pool.rb +9 -2
- data/lib/sequel/core.rb +2 -2
- data/lib/sequel/database/connecting.rb +8 -8
- data/lib/sequel/database/dataset.rb +6 -3
- data/lib/sequel/database/dataset_defaults.rb +14 -1
- data/lib/sequel/database/misc.rb +1 -1
- data/lib/sequel/database/query.rb +3 -0
- data/lib/sequel/database/schema_methods.rb +1 -1
- data/lib/sequel/dataset/actions.rb +72 -10
- data/lib/sequel/dataset/dataset_module.rb +58 -0
- data/lib/sequel/dataset/graph.rb +1 -1
- data/lib/sequel/dataset/misc.rb +1 -0
- data/lib/sequel/dataset/prepared_statements.rb +3 -3
- data/lib/sequel/dataset/query.rb +22 -11
- data/lib/sequel/dataset.rb +1 -1
- data/lib/sequel/exceptions.rb +8 -0
- data/lib/sequel/extensions/_model_pg_row.rb +5 -2
- data/lib/sequel/extensions/core_extensions.rb +4 -1
- data/lib/sequel/extensions/current_datetime_timestamp.rb +2 -1
- data/lib/sequel/extensions/date_arithmetic.rb +1 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -3
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +3 -0
- data/lib/sequel/extensions/filter_having.rb +2 -0
- data/lib/sequel/extensions/freeze_datasets.rb +2 -0
- data/lib/sequel/extensions/from_block.rb +1 -1
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/hash_aliases.rb +2 -0
- data/lib/sequel/extensions/identifier_mangling.rb +0 -7
- data/lib/sequel/extensions/meta_def.rb +2 -0
- data/lib/sequel/extensions/migration.rb +11 -8
- data/lib/sequel/extensions/no_auto_literal_strings.rb +1 -1
- data/lib/sequel/extensions/null_dataset.rb +1 -0
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +207 -130
- data/lib/sequel/extensions/pg_hstore.rb +38 -20
- data/lib/sequel/extensions/pg_inet.rb +18 -6
- data/lib/sequel/extensions/pg_interval.rb +19 -12
- data/lib/sequel/extensions/pg_json.rb +25 -14
- data/lib/sequel/extensions/pg_json_ops.rb +2 -2
- data/lib/sequel/extensions/pg_range.rb +133 -100
- data/lib/sequel/extensions/pg_range_ops.rb +4 -3
- data/lib/sequel/extensions/pg_row.rb +68 -39
- data/lib/sequel/extensions/pg_row_ops.rb +11 -5
- data/lib/sequel/extensions/query_literals.rb +2 -0
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +2 -0
- data/lib/sequel/extensions/s.rb +1 -1
- data/lib/sequel/extensions/schema_dumper.rb +29 -25
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +3 -1
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +83 -0
- data/lib/sequel/extensions/server_block.rb +32 -15
- data/lib/sequel/extensions/set_overrides.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +0 -1
- data/lib/sequel/extensions/symbol_aref.rb +0 -4
- data/lib/sequel/model/associations.rb +35 -7
- data/lib/sequel/model/base.rb +113 -87
- data/lib/sequel/model/dataset_module.rb +5 -43
- data/lib/sequel/model/errors.rb +2 -1
- data/lib/sequel/model/inflections.rb +17 -5
- data/lib/sequel/model.rb +26 -58
- data/lib/sequel/plugins/active_model.rb +2 -2
- data/lib/sequel/plugins/association_autoreloading.rb +2 -0
- data/lib/sequel/plugins/association_dependencies.rb +3 -3
- data/lib/sequel/plugins/association_pks.rb +73 -46
- data/lib/sequel/plugins/association_proxies.rb +1 -1
- data/lib/sequel/plugins/auto_validations.rb +6 -2
- data/lib/sequel/plugins/boolean_readers.rb +2 -2
- data/lib/sequel/plugins/boolean_subsets.rb +1 -1
- data/lib/sequel/plugins/caching.rb +19 -13
- data/lib/sequel/plugins/class_table_inheritance.rb +24 -13
- data/lib/sequel/plugins/column_conflicts.rb +7 -2
- data/lib/sequel/plugins/column_select.rb +3 -3
- data/lib/sequel/plugins/composition.rb +2 -2
- data/lib/sequel/plugins/csv_serializer.rb +8 -8
- data/lib/sequel/plugins/dataset_associations.rb +25 -13
- data/lib/sequel/plugins/defaults_setter.rb +13 -1
- data/lib/sequel/plugins/eager_each.rb +1 -1
- data/lib/sequel/plugins/force_encoding.rb +2 -2
- data/lib/sequel/plugins/hook_class_methods.rb +9 -12
- data/lib/sequel/plugins/identifier_columns.rb +2 -0
- data/lib/sequel/plugins/instance_filters.rb +3 -1
- data/lib/sequel/plugins/instance_hooks.rb +17 -9
- data/lib/sequel/plugins/json_serializer.rb +19 -12
- data/lib/sequel/plugins/lazy_attributes.rb +8 -7
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +2 -0
- data/lib/sequel/plugins/modification_detection.rb +3 -0
- data/lib/sequel/plugins/nested_attributes.rb +6 -2
- data/lib/sequel/plugins/pg_array_associations.rb +5 -0
- data/lib/sequel/plugins/pg_row.rb +4 -2
- data/lib/sequel/plugins/pg_typecast_on_load.rb +2 -0
- data/lib/sequel/plugins/prepared_statements.rb +1 -0
- data/lib/sequel/plugins/rcte_tree.rb +4 -24
- data/lib/sequel/plugins/serialization.rb +9 -15
- data/lib/sequel/plugins/single_table_inheritance.rb +8 -3
- data/lib/sequel/plugins/split_values.rb +6 -5
- data/lib/sequel/plugins/static_cache.rb +31 -25
- data/lib/sequel/plugins/subset_conditions.rb +3 -1
- data/lib/sequel/plugins/table_select.rb +1 -1
- data/lib/sequel/plugins/touch.rb +4 -2
- data/lib/sequel/plugins/validation_class_methods.rb +5 -6
- data/lib/sequel/plugins/validation_helpers.rb +14 -8
- data/lib/sequel/plugins/xml_serializer.rb +4 -4
- data/lib/sequel/sql.rb +18 -9
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +115 -14
- data/spec/adapters/mssql_spec.rb +4 -4
- data/spec/adapters/mysql_spec.rb +83 -29
- data/spec/adapters/oracle_spec.rb +28 -24
- data/spec/adapters/postgres_spec.rb +40 -24
- data/spec/adapters/sqlanywhere_spec.rb +88 -86
- data/spec/adapters/sqlite_spec.rb +29 -24
- data/spec/bin_spec.rb +7 -1
- data/spec/core/connection_pool_spec.rb +45 -14
- data/spec/core/database_spec.rb +155 -0
- data/spec/core/dataset_spec.rb +219 -36
- data/spec/core/schema_spec.rb +16 -0
- data/spec/core/spec_helper.rb +1 -0
- data/spec/core_extensions_spec.rb +6 -2
- data/spec/extensions/active_model_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +34 -2
- data/spec/extensions/auto_literal_strings_spec.rb +5 -1
- data/spec/extensions/auto_validations_spec.rb +2 -0
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +106 -19
- data/spec/extensions/column_conflicts_spec.rb +11 -0
- data/spec/extensions/column_select_spec.rb +1 -0
- data/spec/extensions/composition_spec.rb +13 -0
- data/spec/extensions/connection_validator_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +20 -8
- data/spec/extensions/defaults_setter_spec.rb +15 -1
- data/spec/extensions/filter_having_spec.rb +5 -3
- data/spec/extensions/hash_aliases_spec.rb +3 -1
- data/spec/extensions/identifier_columns_spec.rb +3 -1
- data/spec/extensions/implicit_subquery_spec.rb +4 -2
- data/spec/extensions/json_serializer_spec.rb +18 -0
- data/spec/extensions/lazy_attributes_spec.rb +3 -3
- data/spec/extensions/many_through_many_spec.rb +4 -4
- data/spec/extensions/meta_def_spec.rb +9 -0
- data/spec/extensions/migration_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +14 -3
- data/spec/extensions/no_auto_literal_strings_spec.rb +8 -4
- data/spec/extensions/null_dataset_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +29 -18
- data/spec/extensions/pg_array_spec.rb +44 -25
- data/spec/extensions/pg_hstore_spec.rb +10 -0
- data/spec/extensions/pg_inet_spec.rb +26 -0
- data/spec/extensions/pg_interval_spec.rb +20 -0
- data/spec/extensions/pg_json_spec.rb +24 -0
- data/spec/extensions/pg_range_spec.rb +98 -14
- data/spec/extensions/pg_row_spec.rb +14 -4
- data/spec/extensions/pg_typecast_on_load_spec.rb +11 -9
- data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
- data/spec/extensions/query_literals_spec.rb +3 -1
- data/spec/extensions/schema_dumper_spec.rb +108 -94
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +10 -6
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +121 -0
- data/spec/extensions/serialization_spec.rb +1 -1
- data/spec/extensions/server_block_spec.rb +7 -0
- data/spec/extensions/single_table_inheritance_spec.rb +17 -1
- data/spec/extensions/spec_helper.rb +7 -1
- data/spec/extensions/static_cache_spec.rb +75 -24
- data/spec/extensions/string_agg_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +9 -0
- data/spec/extensions/validation_helpers_spec.rb +10 -5
- data/spec/extensions/whitelist_security_spec.rb +26 -0
- data/spec/integration/associations_test.rb +8 -0
- data/spec/integration/dataset_test.rb +45 -44
- data/spec/integration/model_test.rb +53 -4
- data/spec/integration/plugin_test.rb +28 -4
- data/spec/integration/prepared_statement_test.rb +3 -0
- data/spec/integration/schema_test.rb +21 -1
- data/spec/integration/transaction_test.rb +40 -40
- data/spec/model/association_reflection_spec.rb +43 -1
- data/spec/model/associations_spec.rb +29 -9
- data/spec/model/class_dataset_methods_spec.rb +20 -4
- data/spec/model/dataset_methods_spec.rb +12 -3
- data/spec/model/eager_loading_spec.rb +8 -8
- data/spec/model/model_spec.rb +45 -1
- data/spec/model/plugins_spec.rb +34 -0
- data/spec/model/record_spec.rb +1 -1
- data/spec/spec_config.rb +2 -0
- metadata +11 -4
- data/spec/adapters/firebird_spec.rb +0 -405
- data/spec/adapters/informix_spec.rb +0 -100
|
@@ -18,6 +18,16 @@ describe "An empty ConnectionPool" do
|
|
|
18
18
|
@cpool = Sequel::ConnectionPool.get_pool(mock_db.call, CONNECTION_POOL_DEFAULTS)
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
+
deprecated "should support :pool_class option with string" do
|
|
22
|
+
begin
|
|
23
|
+
c = Class.new(Sequel::ConnectionPool)
|
|
24
|
+
Sequel::ConnectionPool::CONNECTION_POOL__MAP[:foo] = c
|
|
25
|
+
Sequel::ConnectionPool.get_pool(mock_db.call, :pool_class=>:foo).must_be_instance_of c
|
|
26
|
+
ensure
|
|
27
|
+
Sequel::ConnectionPool::CONNECTION_POOL__MAP.delete(c)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
21
31
|
it "should have no available connections" do
|
|
22
32
|
@cpool.available_connections.must_equal []
|
|
23
33
|
end
|
|
@@ -26,9 +36,13 @@ describe "An empty ConnectionPool" do
|
|
|
26
36
|
@cpool.allocated.must_equal({})
|
|
27
37
|
end
|
|
28
38
|
|
|
29
|
-
|
|
39
|
+
deprecated "should have a created_count of zero" do
|
|
30
40
|
@cpool.created_count.must_equal 0
|
|
31
41
|
end
|
|
42
|
+
|
|
43
|
+
it "should have a size of zero" do
|
|
44
|
+
@cpool.size.must_equal 0
|
|
45
|
+
end
|
|
32
46
|
end
|
|
33
47
|
|
|
34
48
|
describe "ConnectionPool options" do
|
|
@@ -54,11 +68,11 @@ describe "A connection pool handling connections" do
|
|
|
54
68
|
@cpool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| msp.call}){:got_connection}, CONNECTION_POOL_DEFAULTS.merge(:max_connections=>@max_size))
|
|
55
69
|
end
|
|
56
70
|
|
|
57
|
-
it "#hold should increment #
|
|
71
|
+
it "#hold should increment #size" do
|
|
58
72
|
@cpool.hold do
|
|
59
|
-
@cpool.
|
|
60
|
-
@cpool.hold {@cpool.hold {@cpool.
|
|
61
|
-
Thread.new{@cpool.hold {_(@cpool.
|
|
73
|
+
@cpool.size.must_equal 1
|
|
74
|
+
@cpool.hold {@cpool.hold {@cpool.size.must_equal 1}}
|
|
75
|
+
Thread.new{@cpool.hold {_(@cpool.size).must_equal 2}}.join
|
|
62
76
|
end
|
|
63
77
|
end
|
|
64
78
|
|
|
@@ -100,7 +114,7 @@ describe "A connection pool handling connections" do
|
|
|
100
114
|
q = Queue.new
|
|
101
115
|
50.times{Thread.new{@cpool.hold{q.pop}}}
|
|
102
116
|
50.times{q.push nil}
|
|
103
|
-
@cpool.
|
|
117
|
+
@cpool.size.must_be :<=, @max_size
|
|
104
118
|
end
|
|
105
119
|
|
|
106
120
|
it "database's disconnect connection method should be called when a disconnect is detected" do
|
|
@@ -110,16 +124,16 @@ describe "A connection pool handling connections" do
|
|
|
110
124
|
end
|
|
111
125
|
|
|
112
126
|
it "#hold should remove the connection if a DatabaseDisconnectError is raised" do
|
|
113
|
-
@cpool.
|
|
127
|
+
@cpool.size.must_equal 0
|
|
114
128
|
q, q1 = Queue.new, Queue.new
|
|
115
129
|
@cpool.hold{Thread.new{@cpool.hold{q1.pop; q.push nil}; q1.pop; q.push nil}; q1.push nil; q.pop; q1.push nil; q.pop}
|
|
116
|
-
@cpool.
|
|
130
|
+
@cpool.size.must_equal 2
|
|
117
131
|
proc{@cpool.hold{raise Sequel::DatabaseDisconnectError}}.must_raise(Sequel::DatabaseDisconnectError)
|
|
118
|
-
@cpool.
|
|
132
|
+
@cpool.size.must_equal 1
|
|
119
133
|
proc{@cpool.hold{raise Sequel::DatabaseDisconnectError}}.must_raise(Sequel::DatabaseDisconnectError)
|
|
120
|
-
@cpool.
|
|
134
|
+
@cpool.size.must_equal 0
|
|
121
135
|
proc{@cpool.hold{raise Sequel::DatabaseDisconnectError}}.must_raise(Sequel::DatabaseDisconnectError)
|
|
122
|
-
@cpool.
|
|
136
|
+
@cpool.size.must_equal 0
|
|
123
137
|
end
|
|
124
138
|
end
|
|
125
139
|
|
|
@@ -127,13 +141,13 @@ describe "A connection pool handling connection errors" do
|
|
|
127
141
|
it "#hold should raise a Sequel::DatabaseConnectionError if an exception is raised by the connection_proc" do
|
|
128
142
|
cpool = Sequel::ConnectionPool.get_pool(mock_db.call{raise Interrupt}, CONNECTION_POOL_DEFAULTS)
|
|
129
143
|
proc{cpool.hold{:block_return}}.must_raise(Sequel::DatabaseConnectionError)
|
|
130
|
-
cpool.
|
|
144
|
+
cpool.size.must_equal 0
|
|
131
145
|
end
|
|
132
146
|
|
|
133
147
|
it "#hold should raise a Sequel::DatabaseConnectionError if nil is returned by the connection_proc" do
|
|
134
148
|
cpool = Sequel::ConnectionPool.get_pool(mock_db.call{nil}, CONNECTION_POOL_DEFAULTS)
|
|
135
149
|
proc{cpool.hold{:block_return}}.must_raise(Sequel::DatabaseConnectionError)
|
|
136
|
-
cpool.
|
|
150
|
+
cpool.size.must_equal 0
|
|
137
151
|
end
|
|
138
152
|
end
|
|
139
153
|
|
|
@@ -259,6 +273,23 @@ ThreadedConnectionPoolSpecs = shared_description do
|
|
|
259
273
|
t.join
|
|
260
274
|
end
|
|
261
275
|
|
|
276
|
+
it "should work when acquire fails and then succeeds" do
|
|
277
|
+
pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:max_connections=>2, :pool_timeout=>0))
|
|
278
|
+
def pool._acquire(*)
|
|
279
|
+
if @called
|
|
280
|
+
super
|
|
281
|
+
else
|
|
282
|
+
@called = true
|
|
283
|
+
nil
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
c = nil
|
|
287
|
+
pool.hold do |c1|
|
|
288
|
+
c = c1
|
|
289
|
+
end
|
|
290
|
+
c.wont_be_nil
|
|
291
|
+
end
|
|
292
|
+
|
|
262
293
|
it "should wait until a connection is available if all are checked out" do
|
|
263
294
|
pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:max_connections=>1, :pool_timeout=>0.1, :pool_sleep_time=>0))
|
|
264
295
|
q, q1 = Queue.new, Queue.new
|
|
@@ -1083,7 +1114,7 @@ AllConnectionPoolClassesSpecs = shared_description do
|
|
|
1083
1114
|
end
|
|
1084
1115
|
end
|
|
1085
1116
|
|
|
1086
|
-
Sequel::ConnectionPool::
|
|
1117
|
+
Sequel::ConnectionPool::CONNECTION_POOL__MAP.keys.each do |k, v|
|
|
1087
1118
|
opts = {:single_threaded=>k, :servers=>(v ? {} : nil)}
|
|
1088
1119
|
describe "Connection pool with #{opts.inspect}" do
|
|
1089
1120
|
before(:all) do
|
data/spec/core/database_spec.rb
CHANGED
|
@@ -12,6 +12,12 @@ describe "A new Database" do
|
|
|
12
12
|
end
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
+
deprecated "should support DatasetClass constant" do
|
|
16
|
+
dbc = Class.new(Sequel::Database)
|
|
17
|
+
dbc::DatasetClass = dsc = Class.new(Sequel::Dataset)
|
|
18
|
+
dbc.new.dataset.must_be_kind_of(dsc)
|
|
19
|
+
end
|
|
20
|
+
|
|
15
21
|
deprecated "should allow dup/clone" do
|
|
16
22
|
@db.dup.must_be_kind_of @db.class
|
|
17
23
|
@db.clone.must_be_kind_of @db.class
|
|
@@ -511,6 +517,130 @@ describe "Database#extend_datasets" do
|
|
|
511
517
|
end
|
|
512
518
|
end
|
|
513
519
|
|
|
520
|
+
describe "Database#extend_datasets custom methods" do
|
|
521
|
+
before do
|
|
522
|
+
@db = Sequel.mock
|
|
523
|
+
end
|
|
524
|
+
|
|
525
|
+
def ds
|
|
526
|
+
@db[:items]
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
it "should have dataset_module support a where method" do
|
|
530
|
+
@db.extend_datasets{where :released, :released}
|
|
531
|
+
ds.released.sql.must_equal 'SELECT * FROM items WHERE released'
|
|
532
|
+
ds.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND released)'
|
|
533
|
+
end
|
|
534
|
+
|
|
535
|
+
it "should have dataset_module support a having method" do
|
|
536
|
+
@db.extend_datasets{having(:released){released}}
|
|
537
|
+
ds.released.sql.must_equal 'SELECT * FROM items HAVING released'
|
|
538
|
+
ds.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE foo HAVING released'
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
it "should have dataset_module support an exclude method" do
|
|
542
|
+
@db.extend_datasets{exclude :released, :released}
|
|
543
|
+
ds.released.sql.must_equal 'SELECT * FROM items WHERE NOT released'
|
|
544
|
+
ds.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE (foo AND NOT released)'
|
|
545
|
+
end
|
|
546
|
+
|
|
547
|
+
it "should have dataset_module support an exclude_having method" do
|
|
548
|
+
@db.extend_datasets{exclude_having :released, :released}
|
|
549
|
+
ds.released.sql.must_equal 'SELECT * FROM items HAVING NOT released'
|
|
550
|
+
ds.where(:foo).released.sql.must_equal 'SELECT * FROM items WHERE foo HAVING NOT released'
|
|
551
|
+
end
|
|
552
|
+
|
|
553
|
+
it "should have dataset_module support a distinct method" do
|
|
554
|
+
@db.extend_datasets{def supports_distinct_on?; true end; distinct :foo, :baz}
|
|
555
|
+
ds.foo.sql.must_equal 'SELECT DISTINCT ON (baz) * FROM items'
|
|
556
|
+
ds.where(:bar).foo.sql.must_equal 'SELECT DISTINCT ON (baz) * FROM items WHERE bar'
|
|
557
|
+
end
|
|
558
|
+
|
|
559
|
+
it "should have dataset_module support a grep method" do
|
|
560
|
+
@db.extend_datasets{grep :foo, :baz, 'quux%'}
|
|
561
|
+
ds.foo.sql.must_equal 'SELECT * FROM items WHERE ((baz LIKE \'quux%\' ESCAPE \'\\\'))'
|
|
562
|
+
ds.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE (bar AND ((baz LIKE \'quux%\' ESCAPE \'\\\')))'
|
|
563
|
+
end
|
|
564
|
+
|
|
565
|
+
it "should have dataset_module support a group method" do
|
|
566
|
+
@db.extend_datasets{group :foo, :baz}
|
|
567
|
+
ds.foo.sql.must_equal 'SELECT * FROM items GROUP BY baz'
|
|
568
|
+
ds.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar GROUP BY baz'
|
|
569
|
+
end
|
|
570
|
+
|
|
571
|
+
it "should have dataset_module support a group_and_count method" do
|
|
572
|
+
@db.extend_datasets{group_and_count :foo, :baz}
|
|
573
|
+
ds.foo.sql.must_equal 'SELECT baz, count(*) AS count FROM items GROUP BY baz'
|
|
574
|
+
ds.where(:bar).foo.sql.must_equal 'SELECT baz, count(*) AS count FROM items WHERE bar GROUP BY baz'
|
|
575
|
+
end
|
|
576
|
+
|
|
577
|
+
it "should have dataset_module support a group_append method" do
|
|
578
|
+
@db.extend_datasets{group_append :foo, :baz}
|
|
579
|
+
ds.foo.sql.must_equal 'SELECT * FROM items GROUP BY baz'
|
|
580
|
+
ds.group(:bar).foo.sql.must_equal 'SELECT * FROM items GROUP BY bar, baz'
|
|
581
|
+
end
|
|
582
|
+
|
|
583
|
+
it "should have dataset_module support a limit method" do
|
|
584
|
+
@db.extend_datasets{limit :foo, 1}
|
|
585
|
+
ds.foo.sql.must_equal 'SELECT * FROM items LIMIT 1'
|
|
586
|
+
ds.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar LIMIT 1'
|
|
587
|
+
end
|
|
588
|
+
|
|
589
|
+
it "should have dataset_module support a offset method" do
|
|
590
|
+
@db.extend_datasets{offset :foo, 1}
|
|
591
|
+
ds.foo.sql.must_equal 'SELECT * FROM items OFFSET 1'
|
|
592
|
+
ds.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar OFFSET 1'
|
|
593
|
+
end
|
|
594
|
+
|
|
595
|
+
it "should have dataset_module support a order method" do
|
|
596
|
+
@db.extend_datasets{order(:foo){:baz}}
|
|
597
|
+
ds.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
|
|
598
|
+
ds.where(:bar).foo.sql.must_equal 'SELECT * FROM items WHERE bar ORDER BY baz'
|
|
599
|
+
end
|
|
600
|
+
|
|
601
|
+
it "should have dataset_module support a order_append method" do
|
|
602
|
+
@db.extend_datasets{order_append :foo, :baz}
|
|
603
|
+
ds.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
|
|
604
|
+
ds.order(:bar).foo.sql.must_equal 'SELECT * FROM items ORDER BY bar, baz'
|
|
605
|
+
end
|
|
606
|
+
|
|
607
|
+
it "should have dataset_module support a order_prepend method" do
|
|
608
|
+
@db.extend_datasets{order_prepend :foo, :baz}
|
|
609
|
+
ds.foo.sql.must_equal 'SELECT * FROM items ORDER BY baz'
|
|
610
|
+
ds.order(:bar).foo.sql.must_equal 'SELECT * FROM items ORDER BY baz, bar'
|
|
611
|
+
end
|
|
612
|
+
|
|
613
|
+
it "should have dataset_module support a select method" do
|
|
614
|
+
@db.extend_datasets{select :foo, :baz}
|
|
615
|
+
ds.foo.sql.must_equal 'SELECT baz FROM items'
|
|
616
|
+
ds.where(:bar).foo.sql.must_equal 'SELECT baz FROM items WHERE bar'
|
|
617
|
+
end
|
|
618
|
+
|
|
619
|
+
it "should have dataset_module support a select_all method" do
|
|
620
|
+
@db.extend_datasets{select_all :foo, :baz}
|
|
621
|
+
ds.foo.sql.must_equal 'SELECT baz.* FROM items'
|
|
622
|
+
ds.where(:bar).foo.sql.must_equal 'SELECT baz.* FROM items WHERE bar'
|
|
623
|
+
end
|
|
624
|
+
|
|
625
|
+
it "should have dataset_module support a select_append method" do
|
|
626
|
+
@db.extend_datasets{select_append :foo, :baz}
|
|
627
|
+
ds.foo.sql.must_equal 'SELECT *, baz FROM items'
|
|
628
|
+
ds.where(:bar).foo.sql.must_equal 'SELECT *, baz FROM items WHERE bar'
|
|
629
|
+
end
|
|
630
|
+
|
|
631
|
+
it "should have dataset_module support a select_group method" do
|
|
632
|
+
@db.extend_datasets{select_group :foo, :baz}
|
|
633
|
+
ds.foo.sql.must_equal 'SELECT baz FROM items GROUP BY baz'
|
|
634
|
+
ds.where(:bar).foo.sql.must_equal 'SELECT baz FROM items WHERE bar GROUP BY baz'
|
|
635
|
+
end
|
|
636
|
+
|
|
637
|
+
it "should have dataset_module support a server method" do
|
|
638
|
+
@db.extend_datasets{server :foo, :baz}
|
|
639
|
+
ds.foo.opts[:server].must_equal :baz
|
|
640
|
+
ds.where(:bar).foo.opts[:server].must_equal :baz
|
|
641
|
+
end
|
|
642
|
+
end
|
|
643
|
+
|
|
514
644
|
describe "Database#disconnect_connection" do
|
|
515
645
|
it "should call close on the connection" do
|
|
516
646
|
o = Object.new
|
|
@@ -2251,6 +2381,31 @@ describe "Database#typecast_value" do
|
|
|
2251
2381
|
end
|
|
2252
2382
|
end
|
|
2253
2383
|
|
|
2384
|
+
it "should have an underlying exception class available at cause" do
|
|
2385
|
+
begin
|
|
2386
|
+
@db.typecast_value(:date, 'a')
|
|
2387
|
+
true.must_equal false
|
|
2388
|
+
rescue Sequel::InvalidValue => e
|
|
2389
|
+
e.cause.must_be_kind_of(ArgumentError)
|
|
2390
|
+
end
|
|
2391
|
+
end if RUBY_VERSION >= '2.1'
|
|
2392
|
+
|
|
2393
|
+
it "should have an underlying exception class available at cause when using nested exceptions" do
|
|
2394
|
+
begin
|
|
2395
|
+
begin
|
|
2396
|
+
raise ArgumentError
|
|
2397
|
+
rescue => e1
|
|
2398
|
+
begin
|
|
2399
|
+
raise RuntimeError
|
|
2400
|
+
rescue => e2
|
|
2401
|
+
@db.send(:raise_error, e1)
|
|
2402
|
+
end
|
|
2403
|
+
end
|
|
2404
|
+
rescue Sequel::DatabaseError => e
|
|
2405
|
+
e.cause.must_be_kind_of(ArgumentError)
|
|
2406
|
+
end
|
|
2407
|
+
end if RUBY_VERSION >= '2.1'
|
|
2408
|
+
|
|
2254
2409
|
it "should include underlying exception class in #inspect" do
|
|
2255
2410
|
begin
|
|
2256
2411
|
@db.typecast_value(:date, 'a')
|