sequel 4.44.0 → 4.45.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +110 -0
- data/README.rdoc +8 -9
- data/doc/active_record.rdoc +2 -3
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +0 -46
- data/doc/release_notes/4.45.0.txt +370 -0
- data/lib/sequel/adapters/cubrid.rb +2 -0
- data/lib/sequel/adapters/do.rb +2 -0
- data/lib/sequel/adapters/jdbc/as400.rb +2 -0
- data/lib/sequel/adapters/jdbc/cubrid.rb +2 -0
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +2 -0
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +2 -0
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +2 -0
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -0
- data/lib/sequel/adapters/jdbc/postgresql.rb +5 -0
- data/lib/sequel/adapters/mysql.rb +1 -0
- data/lib/sequel/adapters/mysql2.rb +1 -0
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/odbc/progress.rb +2 -0
- data/lib/sequel/adapters/postgres.rb +0 -2
- data/lib/sequel/adapters/shared/cubrid.rb +2 -0
- data/lib/sequel/adapters/shared/firebird.rb +2 -0
- data/lib/sequel/adapters/shared/informix.rb +2 -0
- data/lib/sequel/adapters/shared/mssql.rb +47 -7
- data/lib/sequel/adapters/shared/mysql.rb +16 -1
- data/lib/sequel/adapters/shared/postgres.rb +9 -1
- data/lib/sequel/adapters/shared/progress.rb +2 -0
- data/lib/sequel/adapters/shared/sqlanywhere.rb +1 -1
- data/lib/sequel/adapters/swift.rb +2 -0
- data/lib/sequel/ast_transformer.rb +13 -6
- data/lib/sequel/core.rb +13 -16
- data/lib/sequel/database/connecting.rb +25 -10
- data/lib/sequel/database/dataset.rb +6 -1
- data/lib/sequel/database/dataset_defaults.rb +9 -2
- data/lib/sequel/database/misc.rb +10 -3
- data/lib/sequel/database/schema_methods.rb +4 -0
- data/lib/sequel/dataset/mutation.rb +8 -20
- data/lib/sequel/dataset/prepared_statements.rb +2 -0
- data/lib/sequel/dataset/query.rb +32 -7
- data/lib/sequel/dataset/sql.rb +13 -3
- data/lib/sequel/deprecated.rb +9 -1
- data/lib/sequel/exceptions.rb +37 -8
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +117 -0
- data/lib/sequel/extensions/date_arithmetic.rb +1 -0
- data/lib/sequel/extensions/identifier_mangling.rb +3 -2
- data/lib/sequel/extensions/pg_hstore.rb +1 -5
- data/lib/sequel/extensions/schema_dumper.rb +3 -1
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +1 -0
- data/lib/sequel/model.rb +23 -10
- data/lib/sequel/model/associations.rb +17 -5
- data/lib/sequel/model/base.rb +115 -62
- data/lib/sequel/model/dataset_module.rb +10 -3
- data/lib/sequel/model/exceptions.rb +7 -5
- data/lib/sequel/plugins/association_pks.rb +13 -1
- data/lib/sequel/plugins/association_proxies.rb +8 -1
- data/lib/sequel/plugins/before_after_save.rb +1 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +7 -3
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +10 -5
- data/lib/sequel/plugins/error_splitter.rb +1 -1
- data/lib/sequel/plugins/hook_class_methods.rb +39 -5
- data/lib/sequel/plugins/instance_hooks.rb +58 -5
- data/lib/sequel/plugins/lazy_attributes.rb +10 -5
- data/lib/sequel/plugins/nested_attributes.rb +10 -5
- data/lib/sequel/plugins/prepared_statements.rb +7 -0
- data/lib/sequel/plugins/prepared_statements_associations.rb +2 -0
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +2 -0
- data/lib/sequel/plugins/schema.rb +2 -0
- data/lib/sequel/plugins/scissors.rb +2 -0
- data/lib/sequel/plugins/serialization.rb +10 -5
- data/lib/sequel/plugins/split_values.rb +5 -1
- data/lib/sequel/plugins/static_cache.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +1 -1
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +1 -0
- data/lib/sequel/sql.rb +1 -1
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mssql_spec.rb +31 -0
- data/spec/adapters/mysql_spec.rb +20 -2
- data/spec/adapters/postgres_spec.rb +43 -12
- data/spec/adapters/spec_helper.rb +5 -8
- data/spec/core/database_spec.rb +47 -12
- data/spec/core/dataset_mutation_spec.rb +22 -22
- data/spec/core/dataset_spec.rb +88 -20
- data/spec/core/deprecated_spec.rb +1 -1
- data/spec/core/expression_filters_spec.rb +1 -1
- data/spec/core/mock_adapter_spec.rb +0 -3
- data/spec/core/placeholder_literalizer_spec.rb +1 -1
- data/spec/core/schema_spec.rb +8 -1
- data/spec/core/spec_helper.rb +6 -1
- data/spec/core_extensions_spec.rb +4 -0
- data/spec/deprecation_helper.rb +17 -0
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +314 -0
- data/spec/extensions/association_pks_spec.rb +61 -13
- data/spec/extensions/association_proxies_spec.rb +3 -3
- data/spec/extensions/class_table_inheritance_spec.rb +39 -0
- data/spec/extensions/columns_updated_spec.rb +35 -0
- data/spec/extensions/composition_spec.rb +6 -1
- data/spec/extensions/hook_class_methods_spec.rb +114 -26
- data/spec/extensions/identifier_mangling_spec.rb +107 -73
- data/spec/extensions/instance_hooks_spec.rb +78 -14
- data/spec/extensions/lazy_attributes_spec.rb +8 -2
- data/spec/extensions/many_through_many_spec.rb +2 -2
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/nested_attributes_spec.rb +8 -2
- data/spec/extensions/pg_array_spec.rb +18 -4
- data/spec/extensions/prepared_statements_associations_spec.rb +48 -39
- data/spec/extensions/prepared_statements_with_pk_spec.rb +13 -11
- data/spec/extensions/query_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +34 -6
- data/spec/extensions/schema_spec.rb +13 -7
- data/spec/extensions/scissors_spec.rb +3 -1
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +4 -4
- data/spec/extensions/serialization_spec.rb +7 -1
- data/spec/extensions/set_overrides_spec.rb +2 -2
- data/spec/extensions/shared_caching_spec.rb +19 -15
- data/spec/extensions/spec_helper.rb +7 -3
- data/spec/extensions/split_values_spec.rb +45 -10
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/subset_conditions_spec.rb +3 -3
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -1
- data/spec/extensions/validation_contexts_spec.rb +31 -0
- data/spec/guards_helper.rb +2 -0
- data/spec/integration/associations_test.rb +22 -20
- data/spec/integration/dataset_test.rb +25 -2
- data/spec/integration/model_test.rb +1 -1
- data/spec/integration/plugin_test.rb +11 -16
- data/spec/integration/prepared_statement_test.rb +40 -32
- data/spec/integration/spec_helper.rb +5 -8
- data/spec/model/association_reflection_spec.rb +4 -0
- data/spec/model/associations_spec.rb +37 -10
- data/spec/model/base_spec.rb +6 -0
- data/spec/model/hooks_spec.rb +56 -35
- data/spec/model/model_spec.rb +21 -5
- data/spec/model/record_spec.rb +14 -11
- data/spec/model/spec_helper.rb +7 -1
- data/spec/sequel_warning.rb +11 -0
- metadata +13 -3
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
+
Sequel::Deprecation.deprecate("The prepared_statements_associations plugin", "Stop using the plugin, it is probably unneeded and making the application slower")
|
4
|
+
|
3
5
|
module Sequel
|
4
6
|
module Plugins
|
5
7
|
# The prepared_statements_associations plugin modifies the regular association
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
+
Sequel::Deprecation.deprecate("The prepared_statements_with_pk plugin", "Stop using the plugin, it is probably unneeded and making the application slower")
|
4
|
+
|
3
5
|
module Sequel
|
4
6
|
module Plugins
|
5
7
|
# The prepared_statements_with_pk plugin allows Dataset#with_pk for model datasets
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
+
Sequel::Deprecation.deprecate("The schema plugin", "Switch to defining your schema using Database schema methods before creating your model classes")
|
4
|
+
|
3
5
|
module Sequel
|
4
6
|
module Plugins
|
5
7
|
# Sequel's built in schema plugin allows you to define your schema
|
@@ -120,9 +120,14 @@ module Sequel
|
|
120
120
|
# called to serialize the column.
|
121
121
|
attr_reader :serialization_map
|
122
122
|
|
123
|
-
|
124
|
-
|
125
|
-
|
123
|
+
def serialization_module
|
124
|
+
Sequel::Deprecation.deprecate('Sequel::Model.serialization_module', 'There is no replacement')
|
125
|
+
@serialization_module
|
126
|
+
end
|
127
|
+
def serialization_module=(v)
|
128
|
+
Sequel::Deprecation.deprecate('Sequel::Model.serialization_module=', 'There is no replacement')
|
129
|
+
@serialization_module = v
|
130
|
+
end
|
126
131
|
|
127
132
|
Plugins.inherited_instance_variables(self, :@deserialization_map=>:dup, :@serialization_map=>:dup)
|
128
133
|
|
@@ -159,8 +164,8 @@ module Sequel
|
|
159
164
|
# Add serializated attribute acessor methods to the serialization_module
|
160
165
|
def define_serialized_attribute_accessor(serializer, deserializer, *columns)
|
161
166
|
m = self
|
162
|
-
include(
|
163
|
-
serialization_module.class_eval do
|
167
|
+
include(@serialization_module ||= Module.new) unless @serialization_module
|
168
|
+
@serialization_module.class_eval do
|
164
169
|
columns.each do |column|
|
165
170
|
m.serialization_map[column] = serializer
|
166
171
|
m.deserialization_map[column] = deserializer
|
@@ -47,7 +47,11 @@ module Sequel
|
|
47
47
|
# If there isn't an entry in the values hash, but there is a noncolumn_values
|
48
48
|
# hash, look in that hash for the value.
|
49
49
|
def [](k)
|
50
|
-
|
50
|
+
if (res = super).nil?
|
51
|
+
@noncolumn_values[k] if !@values.has_key?(k) && @noncolumn_values
|
52
|
+
else
|
53
|
+
res
|
54
|
+
end
|
51
55
|
end
|
52
56
|
|
53
57
|
# Check all entries in the values hash. If any of the keys are not columns,
|
@@ -225,13 +225,13 @@ module Sequel
|
|
225
225
|
module InstanceMethods
|
226
226
|
# Disallowing destroying the object unless the :frozen=>false option was used.
|
227
227
|
def before_destroy
|
228
|
-
|
228
|
+
cancel_action("modifying model objects that use the static_cache plugin is not allowed") unless model.static_cache_allow_modifications?
|
229
229
|
super
|
230
230
|
end
|
231
231
|
|
232
232
|
# Disallowing saving the object unless the :frozen=>false option was used.
|
233
233
|
def before_save
|
234
|
-
|
234
|
+
cancel_action("modifying model objects that use the static_cache plugin is not allowed") unless model.static_cache_allow_modifications?
|
235
235
|
super
|
236
236
|
end
|
237
237
|
end
|
@@ -91,7 +91,7 @@ module Sequel
|
|
91
91
|
# If there the association is not in the associations cache and the object
|
92
92
|
# was reteived via Dataset#all, eagerly load the association for all model
|
93
93
|
# objects retrieved with the current object.
|
94
|
-
def load_associated_objects(opts, dynamic_opts=
|
94
|
+
def load_associated_objects(opts, dynamic_opts=OPTS, &block)
|
95
95
|
dynamic_opts = load_association_objects_options(dynamic_opts, &block)
|
96
96
|
name = opts[:name]
|
97
97
|
if (!associations.include?(name) || dynamic_opts[:eager_reload]) && retrieved_by && !frozen? && !dynamic_opts[:callback] && !dynamic_opts[:reload]
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
3
|
+
module Sequel
|
4
|
+
module Plugins
|
5
|
+
# The validation_contexts plugin adds support for a validation_context method inside a validate
|
6
|
+
# method. You pass in the validation context to use via the :validation_context option to
|
7
|
+
# Sequel::Model#save && Sequel::Model#valid?:
|
8
|
+
#
|
9
|
+
# class Album < Sequel::Model
|
10
|
+
# plugin :validation_contexts
|
11
|
+
# def validate
|
12
|
+
# super
|
13
|
+
# errors.add(:status_id, 'not 1') if status_id != 1 && validation_context == :initial
|
14
|
+
# errors.add(:status_id, 'not 2') if status_id != 2 && validation_context == :approve
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# Album.new(:status_id=>1).valid?(:validation_context=>:initial) # => true
|
19
|
+
# Album.new(:status_id=>2).valid?(:validation_context=>:initial) # => false
|
20
|
+
#
|
21
|
+
# Album.new(:status_id=>1).valid?(:validation_context=>:approve) # => false
|
22
|
+
# Album.new(:status_id=>2).valid?(:validation_context=>:approve) # => true
|
23
|
+
#
|
24
|
+
# There is no validation context used by default, so validation_context will be
|
25
|
+
# +nil+ if one is not specified. If you want to differentiate between creating new
|
26
|
+
# objects and updating existing objects, just use +new?+.
|
27
|
+
#
|
28
|
+
# Once this plugin is loaded into a model, after you freeze an instance
|
29
|
+
# of that model, you can no longer specify a validation context when
|
30
|
+
# validating the instance.
|
31
|
+
module ValidationContexts
|
32
|
+
module InstanceMethods
|
33
|
+
# The validation context to use for the current validation.
|
34
|
+
# Set via the :validation_context option passed to save/valid?.
|
35
|
+
attr_reader :validation_context
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
# Set validation context before running validations
|
40
|
+
def _valid?(opts)
|
41
|
+
@validation_context = opts[:validation_context] if opts[:validation_context]
|
42
|
+
super
|
43
|
+
ensure
|
44
|
+
@validation_context = nil if @validation_context
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -244,6 +244,7 @@ module Sequel
|
|
244
244
|
atts.each do |a|
|
245
245
|
arr = Array(a)
|
246
246
|
next if arr.any?{|x| errors.on(x)}
|
247
|
+
# SEQUEL5: Default only_if_modified to true
|
247
248
|
next if opts[:only_if_modified] && !new? && !arr.any?{|x| changed_columns.include?(x)}
|
248
249
|
ds = opts[:dataset] || model.dataset
|
249
250
|
ds = if where
|
data/lib/sequel/sql.rb
CHANGED
@@ -428,7 +428,7 @@ module Sequel
|
|
428
428
|
# Sequel.deep_qualify(:table, Sequel.+(:column, 1)) # "table"."column" + 1
|
429
429
|
# Sequel.deep_qualify(:table, Sequel.like(:a, 'b')) # "table"."a" LIKE 'b' ESCAPE '\'
|
430
430
|
def deep_qualify(qualifier, expr)
|
431
|
-
Sequel::Qualifier.new(
|
431
|
+
Sequel::Qualifier.new(qualifier).transform(expr)
|
432
432
|
end
|
433
433
|
|
434
434
|
# Return a delayed evaluation that uses the passed block. This is used
|
data/lib/sequel/version.rb
CHANGED
@@ -5,7 +5,7 @@ module Sequel
|
|
5
5
|
MAJOR = 4
|
6
6
|
# The minor version of Sequel. Bumped for every non-patch level
|
7
7
|
# release, generally around once a month.
|
8
|
-
MINOR =
|
8
|
+
MINOR = 45
|
9
9
|
# The tiny version of Sequel. Usually 0, only bumped for bugfix
|
10
10
|
# releases that fix regressions from previous versions.
|
11
11
|
TINY = 0
|
data/spec/adapters/mssql_spec.rb
CHANGED
@@ -264,6 +264,37 @@ describe "Offset support" do
|
|
264
264
|
end
|
265
265
|
end
|
266
266
|
|
267
|
+
describe "Update/Delete on limited datasets" do
|
268
|
+
before do
|
269
|
+
@db = DB
|
270
|
+
@db.create_table!(:i){Integer :id}
|
271
|
+
@ds = @db[:i]
|
272
|
+
@ds.import [:id], [[1], [2]]
|
273
|
+
end
|
274
|
+
after do
|
275
|
+
@db.drop_table?(:i)
|
276
|
+
end
|
277
|
+
|
278
|
+
it "should handle deletes and updates on limited datasets" do
|
279
|
+
@ds.limit(1).update(:id=>Sequel[:id]+10)
|
280
|
+
[[2, 11], [1, 12]].must_include @ds.select_order_map(:id)
|
281
|
+
@ds.limit(1).delete
|
282
|
+
[[1], [2]].must_include @ds.select_order_map(:id)
|
283
|
+
end
|
284
|
+
|
285
|
+
it "should raise error for updates on ordered, limited datasets" do
|
286
|
+
end
|
287
|
+
|
288
|
+
it "should raise error for updates and deletes on datasets with offsets or limits with orders" do
|
289
|
+
proc{@ds.offset(1).delete}.must_raise Sequel::InvalidOperation
|
290
|
+
proc{@ds.offset(1).update(:id=>Sequel[:id]+10)}.must_raise Sequel::InvalidOperation
|
291
|
+
proc{@ds.limit(1, 1).delete}.must_raise Sequel::InvalidOperation
|
292
|
+
proc{@ds.limit(1, 1).update(:id=>Sequel[:id]+10)}.must_raise Sequel::InvalidOperation
|
293
|
+
proc{@ds.order(:id).limit(1).update(:id=>Sequel[:id]+10)}.must_raise Sequel::InvalidOperation
|
294
|
+
proc{@ds.order(:id).limit(1).delete}.must_raise Sequel::InvalidOperation
|
295
|
+
end if false # SEQUEL5
|
296
|
+
end if DB.dataset.send(:is_2012_or_later?)
|
297
|
+
|
267
298
|
describe "Common Table Expressions" do
|
268
299
|
before do
|
269
300
|
@db = DB
|
data/spec/adapters/mysql_spec.rb
CHANGED
@@ -202,10 +202,23 @@ describe "A MySQL dataset" do
|
|
202
202
|
@d.order(:name).update_sql(:value => 1).must_equal 'UPDATE `items` SET `value` = 1 ORDER BY `name`'
|
203
203
|
end
|
204
204
|
|
205
|
-
it "should support
|
206
|
-
@d.
|
205
|
+
it "should support updating a limited dataset" do
|
206
|
+
@d.import [:value], [[2], [3]]
|
207
|
+
@d.limit(1).update(:value => 4).must_equal 1
|
208
|
+
[[2,4], [3,4]].must_include @d.select_order_map(:value)
|
207
209
|
end
|
208
210
|
|
211
|
+
it "should support updating a ordered, limited dataset" do
|
212
|
+
@d.import [:value], [[2], [3]]
|
213
|
+
@d.order(:value).limit(1).update(:value => 4).must_equal 1
|
214
|
+
@d.select_order_map(:value).must_equal [3,4]
|
215
|
+
end
|
216
|
+
|
217
|
+
it "should raise error for updating a dataset with an offset" do
|
218
|
+
proc{@d.offset(1).update(:value => 4)}.must_raise Sequel::InvalidOperation
|
219
|
+
proc{@d.order(:value).offset(1).update(:value => 4)}.must_raise Sequel::InvalidOperation
|
220
|
+
end if false # SEQUEL5
|
221
|
+
|
209
222
|
it "should support regexps" do
|
210
223
|
@d << {:name => 'abc', :value => 1}
|
211
224
|
@d << {:name => 'bcd', :value => 2}
|
@@ -338,6 +351,11 @@ describe "A MySQL database" do
|
|
338
351
|
it "should handle the creation and dropping of an InnoDB table with foreign keys" do
|
339
352
|
DB.create_table!(:test_innodb, :engine=>:InnoDB){primary_key :id; foreign_key :fk, :test_innodb, :key=>:id}
|
340
353
|
end
|
354
|
+
|
355
|
+
it "should handle qualified tables in #indexes" do
|
356
|
+
DB.create_table!(:test_innodb){primary_key :id; String :name; index :name, :unique=>true, :name=>:test_innodb_name_idx}
|
357
|
+
DB.indexes(Sequel.qualify(DB.get{database{}}, :test_innodb)).must_equal(:test_innodb_name_idx=>{:unique=>true, :columns=>[:name]})
|
358
|
+
end
|
341
359
|
end
|
342
360
|
|
343
361
|
describe "A MySQL database" do
|
@@ -1041,11 +1041,11 @@ describe "A PostgreSQL database" do
|
|
1041
1041
|
end
|
1042
1042
|
|
1043
1043
|
it "should support indexes with index type" do
|
1044
|
-
@db.create_table(:posts){
|
1044
|
+
@db.create_table(:posts){point :p; index :p, :type => 'gist'}
|
1045
1045
|
check_sqls do
|
1046
1046
|
@db.sqls.must_equal [
|
1047
|
-
'CREATE TABLE "posts" ("
|
1048
|
-
'CREATE INDEX "
|
1047
|
+
'CREATE TABLE "posts" ("p" point)',
|
1048
|
+
'CREATE INDEX "posts_p_index" ON "posts" USING gist ("p")'
|
1049
1049
|
]
|
1050
1050
|
end
|
1051
1051
|
end
|
@@ -1739,36 +1739,33 @@ if DB.adapter_scheme == :postgres
|
|
1739
1739
|
end
|
1740
1740
|
end
|
1741
1741
|
|
1742
|
-
describe "
|
1742
|
+
describe "Database#add_named_conversion_proc" do
|
1743
1743
|
before(:all) do
|
1744
1744
|
@db = DB
|
1745
1745
|
@old_cp = @db.conversion_procs[1013]
|
1746
1746
|
@db.conversion_procs.delete(1013)
|
1747
|
-
|
1748
|
-
@db.reset_conversion_procs
|
1749
|
-
@db.register_array_type('oidvector')
|
1747
|
+
@db.add_named_conversion_proc(:oidvector, &:reverse)
|
1750
1748
|
end
|
1751
1749
|
after(:all) do
|
1752
|
-
Sequel::Postgres::PG_NAMED_TYPES.delete(:oidvector)
|
1753
1750
|
@db.conversion_procs.delete(30)
|
1754
1751
|
@db.conversion_procs[1013] = @old_cp
|
1755
1752
|
@db.drop_table?(:foo)
|
1756
|
-
@db.drop_enum(:foo_enum)
|
1753
|
+
@db.drop_enum(:foo_enum) rescue nil
|
1757
1754
|
end
|
1758
1755
|
|
1759
|
-
it "should
|
1756
|
+
it "should work for scalar types" do
|
1760
1757
|
@db.create_table!(:foo){oidvector :bar}
|
1761
1758
|
@db[:foo].insert(Sequel.cast('21', :oidvector))
|
1762
1759
|
@db[:foo].get(:bar).must_equal '12'
|
1763
1760
|
end
|
1764
1761
|
|
1765
|
-
it "should
|
1762
|
+
it "should work for array types" do
|
1766
1763
|
@db.create_table!(:foo){column :bar, 'oidvector[]'}
|
1767
1764
|
@db[:foo].insert(Sequel.pg_array(['21'], :oidvector))
|
1768
1765
|
@db[:foo].get(:bar).must_equal ['12']
|
1769
1766
|
end
|
1770
1767
|
|
1771
|
-
it "should work with
|
1768
|
+
it "should work with for enums" do
|
1772
1769
|
@db.drop_enum(:foo_enum) rescue nil
|
1773
1770
|
@db.create_enum(:foo_enum, %w(foo bar))
|
1774
1771
|
@db.add_named_conversion_proc(:foo_enum){|string| string.reverse}
|
@@ -1777,6 +1774,40 @@ if DB.adapter_scheme == :postgres
|
|
1777
1774
|
@db[:foo].get(:bar).must_equal 'foo'.reverse
|
1778
1775
|
end
|
1779
1776
|
end
|
1777
|
+
|
1778
|
+
describe "Postgres::PG_NAMED_TYPES" do
|
1779
|
+
before(:all) do
|
1780
|
+
deprecated do
|
1781
|
+
@db = DB
|
1782
|
+
@old_cp = @db.conversion_procs[1013]
|
1783
|
+
@db.conversion_procs.delete(1013)
|
1784
|
+
Sequel::Postgres::PG_NAMED_TYPES[:oidvector] = lambda{|v| v.reverse}
|
1785
|
+
@db.reset_conversion_procs
|
1786
|
+
@db.register_array_type('oidvector')
|
1787
|
+
end
|
1788
|
+
end
|
1789
|
+
after(:all) do
|
1790
|
+
deprecated do
|
1791
|
+
Sequel::Postgres::PG_NAMED_TYPES.delete(:oidvector)
|
1792
|
+
@db.conversion_procs.delete(30)
|
1793
|
+
@db.conversion_procs[1013] = @old_cp
|
1794
|
+
@db.drop_table?(:foo)
|
1795
|
+
@db.drop_enum(:foo_enum) rescue nil
|
1796
|
+
end
|
1797
|
+
end
|
1798
|
+
|
1799
|
+
deprecated "should look up conversion procs by name" do
|
1800
|
+
@db.create_table!(:foo){oidvector :bar}
|
1801
|
+
@db[:foo].insert(Sequel.cast('21', :oidvector))
|
1802
|
+
@db[:foo].get(:bar).must_equal '12'
|
1803
|
+
end
|
1804
|
+
|
1805
|
+
deprecated "should handle array types of named types" do
|
1806
|
+
@db.create_table!(:foo){column :bar, 'oidvector[]'}
|
1807
|
+
@db[:foo].insert(Sequel.pg_array(['21'], :oidvector))
|
1808
|
+
@db[:foo].get(:bar).must_equal ['12']
|
1809
|
+
end
|
1810
|
+
end
|
1780
1811
|
end
|
1781
1812
|
|
1782
1813
|
if uses_pg_or_jdbc && DB.server_version >= 90000
|
@@ -20,11 +20,8 @@ Sequel.split_symbols = false if ENV['SEQUEL_NO_SPLIT_SYMBOLS']
|
|
20
20
|
Sequel::Database.extension :duplicate_column_handler if ENV['SEQUEL_DUPLICATE_COLUMN_HANDLER']
|
21
21
|
Sequel::Database.extension :columns_introspection if ENV['SEQUEL_COLUMNS_INTROSPECTION']
|
22
22
|
Sequel::Model.cache_associations = false if ENV['SEQUEL_NO_CACHE_ASSOCIATIONS']
|
23
|
-
if ENV['SEQUEL_MODEL_PREPARED_STATEMENTS']
|
24
|
-
|
25
|
-
Sequel::Model.plugin :prepared_statements_associations
|
26
|
-
end
|
27
|
-
Sequel.cache_anonymous_models = false
|
23
|
+
Sequel::Model.plugin :prepared_statements if ENV['SEQUEL_MODEL_PREPARED_STATEMENTS']
|
24
|
+
Sequel::Model.cache_anonymous_models = false
|
28
25
|
|
29
26
|
class Sequel::Database
|
30
27
|
def log_duration(duration, message)
|
@@ -48,10 +45,10 @@ IDENTIFIER_MANGLING = !ENV['SEQUEL_NO_MANGLE'] unless defined?(IDENTIFIER_MANGLI
|
|
48
45
|
unless defined?(DB)
|
49
46
|
env_var = "SEQUEL_#{SEQUEL_ADAPTER_TEST.to_s.upcase}_URL"
|
50
47
|
env_var = ENV.has_key?(env_var) ? env_var : 'SEQUEL_INTEGRATION_URL'
|
51
|
-
|
52
|
-
|
53
|
-
DB = Sequel.connect(ENV[env_var], opts)
|
48
|
+
# SEQUEL5: Remove :identifier_mangling=>false
|
49
|
+
DB = Sequel.connect(ENV[env_var], :identifier_mangling=>false)
|
54
50
|
DB.extension(:freeze_datasets) if ENV['SEQUEL_FREEZE_DATASETS']
|
51
|
+
DB.extension(:identifier_mangling) if IDENTIFIER_MANGLING
|
55
52
|
end
|
56
53
|
|
57
54
|
if dch = ENV['SEQUEL_DUPLICATE_COLUMNS_HANDLER']
|
data/spec/core/database_spec.rb
CHANGED
@@ -5,11 +5,23 @@ describe "A new Database" do
|
|
5
5
|
@db = Sequel::Database.new(1 => 2, :logger => 3)
|
6
6
|
end
|
7
7
|
after do
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
deprecated do
|
9
|
+
Sequel.quote_identifiers = false
|
10
|
+
Sequel.identifier_input_method = nil
|
11
|
+
Sequel.identifier_output_method = nil
|
12
|
+
end
|
11
13
|
end
|
12
14
|
|
15
|
+
deprecated "should allow dup/clone" do
|
16
|
+
@db.dup.must_be_kind_of @db.class
|
17
|
+
@db.clone.must_be_kind_of @db.class
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should not allow dup/clone" do
|
21
|
+
proc{@db.dup}.must_raise Sequel::Error
|
22
|
+
proc{@db.clone}.must_raise Sequel::Error
|
23
|
+
end if false # SEQUEL5
|
24
|
+
|
13
25
|
it "should receive options" do
|
14
26
|
@db.opts[1].must_equal 2
|
15
27
|
@db.opts[:logger].must_equal 3
|
@@ -328,7 +340,7 @@ describe "Database#dataset" do
|
|
328
340
|
e.sql.must_equal 'SELECT * FROM miu'
|
329
341
|
end
|
330
342
|
|
331
|
-
|
343
|
+
deprecated "should provide a filtered #from dataset if a block is given" do
|
332
344
|
d = @db.from(:mau){x.sql_number > 100}
|
333
345
|
d.must_be_kind_of(Sequel::Dataset)
|
334
346
|
d.sql.must_equal 'SELECT * FROM mau WHERE (x > 100)'
|
@@ -1375,7 +1387,7 @@ end
|
|
1375
1387
|
|
1376
1388
|
describe "A single threaded database" do
|
1377
1389
|
after do
|
1378
|
-
Sequel
|
1390
|
+
Sequel.single_threaded = false
|
1379
1391
|
end
|
1380
1392
|
|
1381
1393
|
it "should use a SingleConnectionPool instead of a ConnectionPool" do
|
@@ -1388,14 +1400,17 @@ describe "A single threaded database" do
|
|
1388
1400
|
db.pool.must_be_kind_of(Sequel::SingleConnectionPool)
|
1389
1401
|
end
|
1390
1402
|
|
1391
|
-
|
1403
|
+
deprecated "should be constructable using Database.single_threaded = true" do
|
1392
1404
|
Sequel::Database.single_threaded = true
|
1405
|
+
Sequel.single_threaded.must_equal true
|
1406
|
+
Sequel::Database.single_threaded.must_equal true
|
1393
1407
|
db = Sequel::Database.new{123}
|
1394
1408
|
db.pool.must_be_kind_of(Sequel::SingleConnectionPool)
|
1395
1409
|
end
|
1396
1410
|
|
1397
1411
|
it "should be constructable using Sequel.single_threaded = true" do
|
1398
1412
|
Sequel.single_threaded = true
|
1413
|
+
Sequel.single_threaded.must_equal true
|
1399
1414
|
db = Sequel::Database.new{123}
|
1400
1415
|
db.pool.must_be_kind_of(Sequel::SingleConnectionPool)
|
1401
1416
|
end
|
@@ -1440,7 +1455,7 @@ end
|
|
1440
1455
|
|
1441
1456
|
describe "A database" do
|
1442
1457
|
after do
|
1443
|
-
Sequel
|
1458
|
+
Sequel.single_threaded = false
|
1444
1459
|
end
|
1445
1460
|
|
1446
1461
|
it "should have single_threaded? respond to true if in single threaded mode" do
|
@@ -1453,7 +1468,7 @@ describe "A database" do
|
|
1453
1468
|
db = Sequel::Database.new
|
1454
1469
|
db.wont_be :single_threaded?
|
1455
1470
|
|
1456
|
-
Sequel
|
1471
|
+
Sequel.single_threaded = true
|
1457
1472
|
|
1458
1473
|
db = Sequel::Database.new{123}
|
1459
1474
|
db.must_be :single_threaded?
|
@@ -1719,8 +1734,28 @@ describe "Database#remove_servers" do
|
|
1719
1734
|
end
|
1720
1735
|
end
|
1721
1736
|
|
1737
|
+
describe "Database#add_servers and #remove_servers when not sharded" do
|
1738
|
+
deprecated "should do nothing" do
|
1739
|
+
db = Sequel.mock
|
1740
|
+
db.opts[:servers].must_be_nil
|
1741
|
+
db.add_servers(:foo=>{}).must_be_nil
|
1742
|
+
db.opts[:servers].must_be_nil
|
1743
|
+
db.remove_servers(:foo).must_be_nil
|
1744
|
+
db.opts[:servers].must_be_nil
|
1745
|
+
end
|
1746
|
+
|
1747
|
+
it "should raise Error" do
|
1748
|
+
db = Sequel.mock
|
1749
|
+
db.opts[:servers].must_be_nil
|
1750
|
+
proc{db.add_servers(:foo=>{})}.must_raise Sequel::Error
|
1751
|
+
db.opts[:servers].must_be_nil
|
1752
|
+
proc{db.remove_servers(:foo)}.must_raise Sequel::Error
|
1753
|
+
db.opts[:servers].must_be_nil
|
1754
|
+
end if false # SEQUEL5
|
1755
|
+
end
|
1756
|
+
|
1722
1757
|
describe "Database#each_server with do/jdbc adapter connection string without :adapter option" do
|
1723
|
-
|
1758
|
+
deprecated "should yield a separate database object for each server" do
|
1724
1759
|
require 'sequel/adapters/mock'
|
1725
1760
|
klass = Class.new(Sequel::Database)
|
1726
1761
|
def klass.adapter_class(v)
|
@@ -1740,7 +1775,7 @@ describe "Database#each_server with do/jdbc adapter connection string without :a
|
|
1740
1775
|
hosts.sort.must_equal [1, 3]
|
1741
1776
|
end
|
1742
1777
|
|
1743
|
-
|
1778
|
+
deprecated "should raise if not given a block" do
|
1744
1779
|
proc{Sequel.mock.each_server}.must_raise(Sequel::Error)
|
1745
1780
|
end
|
1746
1781
|
end
|
@@ -1750,7 +1785,7 @@ describe "Database#each_server" do
|
|
1750
1785
|
@db = Sequel.mock(:host=>1, :database=>2, :servers=>{:server1=>{:host=>3}, :server2=>{:host=>4}})
|
1751
1786
|
end
|
1752
1787
|
|
1753
|
-
|
1788
|
+
deprecated "should yield a separate database object for each server" do
|
1754
1789
|
hosts = []
|
1755
1790
|
@db.each_server do |db|
|
1756
1791
|
db.must_be_kind_of(Sequel::Database)
|
@@ -1762,7 +1797,7 @@ describe "Database#each_server" do
|
|
1762
1797
|
hosts.sort.must_equal [1, 3, 4]
|
1763
1798
|
end
|
1764
1799
|
|
1765
|
-
|
1800
|
+
deprecated "should disconnect and remove entry from Sequel::DATABASES after use" do
|
1766
1801
|
dbs = []
|
1767
1802
|
dcs = []
|
1768
1803
|
@db.each_server do |db|
|