sequel 4.44.0 → 4.45.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 +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|
|