sequel 4.43.0 → 4.44.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +40 -0
  3. data/doc/active_record.rdoc +2 -2
  4. data/doc/code_order.rdoc +15 -0
  5. data/doc/dataset_filtering.rdoc +1 -1
  6. data/doc/model_dataset_method_design.rdoc +132 -0
  7. data/doc/opening_databases.rdoc +2 -2
  8. data/doc/release_notes/4.44.0.txt +125 -0
  9. data/lib/sequel/adapters/jdbc.rb +5 -1
  10. data/lib/sequel/adapters/jdbc/as400.rb +1 -1
  11. data/lib/sequel/adapters/postgres.rb +23 -14
  12. data/lib/sequel/core.rb +1 -1
  13. data/lib/sequel/database/schema_generator.rb +27 -0
  14. data/lib/sequel/dataset/actions.rb +1 -1
  15. data/lib/sequel/dataset/query.rb +5 -1
  16. data/lib/sequel/extensions/eval_inspect.rb +4 -4
  17. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  18. data/lib/sequel/extensions/to_dot.rb +1 -1
  19. data/lib/sequel/model.rb +3 -5
  20. data/lib/sequel/model/associations.rb +107 -4
  21. data/lib/sequel/model/base.rb +98 -12
  22. data/lib/sequel/model/dataset_module.rb +1 -1
  23. data/lib/sequel/plugins/active_model.rb +11 -3
  24. data/lib/sequel/plugins/association_dependencies.rb +7 -0
  25. data/lib/sequel/plugins/auto_validations.rb +10 -0
  26. data/lib/sequel/plugins/blacklist_security.rb +13 -4
  27. data/lib/sequel/plugins/class_table_inheritance.rb +11 -0
  28. data/lib/sequel/plugins/column_conflicts.rb +8 -0
  29. data/lib/sequel/plugins/composition.rb +12 -2
  30. data/lib/sequel/plugins/constraint_validations.rb +12 -0
  31. data/lib/sequel/plugins/csv_serializer.rb +9 -0
  32. data/lib/sequel/plugins/defaults_setter.rb +6 -0
  33. data/lib/sequel/plugins/force_encoding.rb +4 -3
  34. data/lib/sequel/plugins/hook_class_methods.rb +6 -0
  35. data/lib/sequel/plugins/input_transformer.rb +9 -0
  36. data/lib/sequel/plugins/insert_returning_select.rb +8 -0
  37. data/lib/sequel/plugins/instance_hooks.rb +4 -3
  38. data/lib/sequel/plugins/json_serializer.rb +9 -0
  39. data/lib/sequel/plugins/lazy_attributes.rb +7 -0
  40. data/lib/sequel/plugins/many_through_many.rb +13 -2
  41. data/lib/sequel/plugins/nested_attributes.rb +7 -0
  42. data/lib/sequel/plugins/pg_array_associations.rb +18 -2
  43. data/lib/sequel/plugins/pg_row.rb +3 -3
  44. data/lib/sequel/plugins/pg_typecast_on_load.rb +7 -0
  45. data/lib/sequel/plugins/prepared_statements.rb +2 -2
  46. data/lib/sequel/plugins/prepared_statements_safe.rb +7 -0
  47. data/lib/sequel/plugins/serialization.rb +9 -0
  48. data/lib/sequel/plugins/single_table_inheritance.rb +13 -1
  49. data/lib/sequel/plugins/subclasses.rb +15 -1
  50. data/lib/sequel/plugins/touch.rb +7 -0
  51. data/lib/sequel/plugins/tree.rb +7 -0
  52. data/lib/sequel/plugins/typecast_on_load.rb +7 -0
  53. data/lib/sequel/plugins/update_refresh.rb +24 -13
  54. data/lib/sequel/plugins/validation_class_methods.rb +13 -0
  55. data/lib/sequel/sql.rb +28 -0
  56. data/lib/sequel/version.rb +1 -1
  57. data/spec/adapters/postgres_spec.rb +18 -15
  58. data/spec/core/dataset_spec.rb +5 -0
  59. data/spec/core/expression_filters_spec.rb +33 -0
  60. data/spec/extensions/active_model_spec.rb +15 -1
  61. data/spec/extensions/association_dependencies_spec.rb +8 -0
  62. data/spec/extensions/auto_validations_spec.rb +8 -0
  63. data/spec/extensions/blacklist_security_spec.rb +6 -0
  64. data/spec/extensions/class_table_inheritance_spec.rb +9 -0
  65. data/spec/extensions/column_conflicts_spec.rb +6 -0
  66. data/spec/extensions/composition_spec.rb +8 -0
  67. data/spec/extensions/constraint_validations_plugin_spec.rb +12 -0
  68. data/spec/extensions/csv_serializer_spec.rb +7 -0
  69. data/spec/extensions/defaults_setter_spec.rb +7 -0
  70. data/spec/extensions/force_encoding_spec.rb +14 -0
  71. data/spec/extensions/hook_class_methods_spec.rb +10 -0
  72. data/spec/extensions/implicit_subquery_spec.rb +60 -0
  73. data/spec/extensions/input_transformer_spec.rb +10 -0
  74. data/spec/extensions/insert_returning_select_spec.rb +6 -0
  75. data/spec/extensions/json_serializer_spec.rb +7 -0
  76. data/spec/extensions/lazy_attributes_spec.rb +6 -0
  77. data/spec/extensions/many_through_many_spec.rb +44 -0
  78. data/spec/extensions/nested_attributes_spec.rb +5 -0
  79. data/spec/extensions/pg_array_associations_spec.rb +46 -0
  80. data/spec/extensions/pg_typecast_on_load_spec.rb +5 -0
  81. data/spec/extensions/prepared_statements_safe_spec.rb +5 -0
  82. data/spec/extensions/serialization_spec.rb +7 -0
  83. data/spec/extensions/single_table_inheritance_spec.rb +19 -2
  84. data/spec/extensions/subclasses_spec.rb +13 -0
  85. data/spec/extensions/to_dot_spec.rb +1 -1
  86. data/spec/extensions/touch_spec.rb +6 -0
  87. data/spec/extensions/tree_spec.rb +6 -0
  88. data/spec/extensions/typecast_on_load_spec.rb +6 -0
  89. data/spec/extensions/update_refresh_spec.rb +7 -1
  90. data/spec/extensions/validation_class_methods_spec.rb +13 -0
  91. data/spec/model/association_reflection_spec.rb +177 -0
  92. data/spec/model/associations_spec.rb +16 -0
  93. data/spec/model/dataset_methods_spec.rb +59 -0
  94. data/spec/model/model_spec.rb +59 -0
  95. metadata +8 -2
@@ -49,6 +49,13 @@ module Sequel
49
49
  super(load_typecast_pg(values))
50
50
  end
51
51
 
52
+ # Freeze the typecast on load columns when freezing the model class.
53
+ def freeze
54
+ @pg_typecast_on_load_columns.freeze
55
+
56
+ super
57
+ end
58
+
52
59
  # Lookup the conversion proc for the column's oid in the Database
53
60
  # object, and use it to convert the value.
54
61
  def load_typecast_pg(values)
@@ -32,11 +32,11 @@ module Sequel
32
32
 
33
33
  # Setup the datastructure used to hold the prepared statements in the model.
34
34
  def self.apply(model)
35
- model.instance_variable_set(:@prepared_statements, :insert=>{}, :insert_select=>{}, :update=>{}, :lookup_sql=>{}, :fixed=>{})
35
+ model.instance_variable_set(:@prepared_statements, {:insert=>{}, :insert_select=>{}, :update=>{}, :lookup_sql=>{}, :fixed=>{}}.freeze)
36
36
  end
37
37
 
38
38
  module ClassMethods
39
- Plugins.inherited_instance_variables(self, :@prepared_statements=>lambda{|v| {:insert=>{}, :insert_select=>{}, :update=>{}, :lookup_sql=>{}, :fixed=>{}}})
39
+ Plugins.inherited_instance_variables(self, :@prepared_statements=>lambda{|v| {:insert=>{}, :insert_select=>{}, :update=>{}, :lookup_sql=>{}, :fixed=>{}}.freeze})
40
40
 
41
41
  private
42
42
 
@@ -38,6 +38,13 @@ module Sequel
38
38
  Plugins.inherited_instance_variables(self, :@prepared_statements_column_defaults=>:dup)
39
39
  Plugins.after_set_dataset(self, :set_prepared_statements_column_defaults)
40
40
 
41
+ # Freeze the prepared statements column defaults when freezing the model class.
42
+ def freeze
43
+ @prepared_statements_column_defaults.freeze if @prepared_statements_column_defaults
44
+
45
+ super
46
+ end
47
+
41
48
  private
42
49
 
43
50
  # Set the column defaults based on the database schema. All columns
@@ -125,6 +125,15 @@ module Sequel
125
125
  attr_accessor :serialization_module
126
126
 
127
127
  Plugins.inherited_instance_variables(self, :@deserialization_map=>:dup, :@serialization_map=>:dup)
128
+
129
+ # Freeze serialization metadata when freezing model class.
130
+ def freeze
131
+ @deserialization_map.freeze
132
+ @serialization_map.freeze
133
+ @serialization_module.freeze if @serialization_module
134
+
135
+ super
136
+ end
128
137
 
129
138
  # Create instance level reader that deserializes column values on request,
130
139
  # and instance level writer that stores new deserialized values.
@@ -152,6 +152,18 @@ module Sequel
152
152
 
153
153
  Plugins.inherited_instance_variables(self, :@sti_dataset=>nil, :@sti_key=>nil, :@sti_key_map=>nil, :@sti_model_map=>nil, :@sti_key_chooser=>nil)
154
154
 
155
+ # Freeze STI information when freezing model class. Note that
156
+ # because of how STI works, you should not freeze an STI subclass
157
+ # until after all subclasses of it have been created.
158
+ def freeze
159
+ @sti_dataset.freeze
160
+ @sti_key_array.freeze if @sti_key_array
161
+ @sti_key_map.freeze if @sti_key_map.is_a?(Hash)
162
+ @sti_model_map.freeze if @sti_model_map.is_a?(Hash)
163
+
164
+ super
165
+ end
166
+
155
167
  # Copy the necessary attributes to the subclasses, and filter the
156
168
  # subclass's dataset based on the sti_kep_map entry for the class.
157
169
  def inherited(subclass)
@@ -159,7 +171,7 @@ module Sequel
159
171
  key = Array(sti_key_map[subclass]).dup
160
172
  sti_subclass_added(key)
161
173
  rp = dataset.row_proc
162
- subclass.set_dataset(sti_dataset.where(SQL::QualifiedIdentifier.new(sti_dataset.first_source_alias, sti_key)=>Sequel.delay{key}), :inherited=>true)
174
+ subclass.set_dataset(sti_dataset.where(SQL::QualifiedIdentifier.new(sti_dataset.first_source_alias, sti_key)=>Sequel.delay{Sequel.synchronize{key}}), :inherited=>true)
163
175
  subclass.instance_eval do
164
176
  @dataset = @dataset.with_row_proc(rp)
165
177
  @sti_key_array = key
@@ -5,7 +5,7 @@ module Sequel
5
5
  # The Subclasses plugin keeps track of all subclasses of the
6
6
  # current model class. Direct subclasses are available via the
7
7
  # subclasses method, and all descendent classes are available via the
8
- # descendents method.
8
+ # descendents method:
9
9
  #
10
10
  # c = Class.new(Sequel::Model)
11
11
  # c.plugin :subclasses
@@ -18,6 +18,14 @@ module Sequel
18
18
  # ssc1.subclasses # []
19
19
  # c.descendents # [sc1, ssc1, sc2]
20
20
  #
21
+ # You can also finalize the associations and then freeze the classes
22
+ # in all descendent classes. Doing so is a recommended practice after
23
+ # all models have been defined in production and testing, and this makes
24
+ # it easier that keeping track of the classes to finalize and freeze
25
+ # manually:
26
+ #
27
+ # c.freeze_descendants
28
+ #
21
29
  # You can provide a block when loading the plugin, and it will be called
22
30
  # with each subclass created:
23
31
  #
@@ -47,6 +55,12 @@ module Sequel
47
55
  Sequel.synchronize{subclasses.dup}.map{|x| [x] + x.send(:descendents)}.flatten
48
56
  end
49
57
 
58
+ # Freeze all descendent classes. This also finalizes the associations for those
59
+ # classes before freezing.
60
+ def freeze_descendents
61
+ descendents.each(&:finalize_associations).each(&:freeze)
62
+ end
63
+
50
64
  Plugins.inherited_instance_variables(self, :@subclasses=>lambda{|v| []}, :@on_subclass=>nil)
51
65
 
52
66
  # Add the subclass to this model's current subclasses,
@@ -63,6 +63,13 @@ module Sequel
63
63
 
64
64
  Plugins.inherited_instance_variables(self, :@touched_associations=>:dup, :@touch_column=>nil)
65
65
 
66
+ # Freeze the touched associations when freezing the model class.
67
+ def freeze
68
+ @touched_associations.freeze
69
+
70
+ super
71
+ end
72
+
66
73
  # Add additional associations to be touched. See the :association option
67
74
  # of the Sequel::Plugin::Touch.configure method for the format of the associations
68
75
  # arguments.
@@ -63,6 +63,13 @@ module Sequel
63
63
 
64
64
  Plugins.inherited_instance_variables(self, :@parent_column=>nil, :@tree_order=>nil)
65
65
 
66
+ # Should freeze tree order if it is an array when freezing the model class.
67
+ def freeze
68
+ @tree_order.freeze if @tree_order.is_a?(Array)
69
+
70
+ super
71
+ end
72
+
66
73
  # Returns list of all root nodes (those with no parent nodes).
67
74
  #
68
75
  # TreeClass.roots # => [root1, root2]
@@ -44,6 +44,13 @@ module Sequel
44
44
  super.load_typecast
45
45
  end
46
46
 
47
+ # Freeze typecast on load columns when freezing model class.
48
+ def freeze
49
+ @typecast_on_load_columns.freeze
50
+
51
+ super
52
+ end
53
+
47
54
  Plugins.inherited_instance_variables(self, :@typecast_on_load_columns=>:dup)
48
55
  end
49
56
 
@@ -27,16 +27,36 @@ module Sequel
27
27
  # +columns+ option. This can be a performance gain if it
28
28
  # would avoid pointlessly comparing many other columns.
29
29
  # Note that this option currently only has an effect if the
30
- # dataset # supports RETURNING.
30
+ # dataset supports RETURNING.
31
31
  #
32
32
  # # Only include the artist column in RETURNING
33
33
  # Album.plugin :update_refresh, :columns => :artist
34
34
  #
35
35
  # # Only include the artist and title columns in RETURNING
36
36
  # Album.plugin :update_refresh, :columns => [ :artist, :title ]
37
- #
38
37
  module UpdateRefresh
38
+ # Set the specific columns to refresh, if the :columns option
39
+ # is provided.
40
+ def self.configure(model, opts=OPTS)
41
+ model.instance_eval do
42
+ @update_refresh_columns = Array(opts[:columns]) || []
43
+ end
44
+ end
45
+
46
+ module ClassMethods
47
+ # The specific columns to refresh when updating, if UPDATE RETURNING is supported.
48
+ attr_reader :update_refresh_columns
49
+
50
+ # Freeze the update refresh columns when freezing the model class.
51
+ def freeze
52
+ @update_refresh_columns.freeze
53
+
54
+ super
55
+ end
56
+ end
57
+
39
58
  module InstanceMethods
59
+ # If the dataset does not support UPDATE RETURNING, then refresh after an update.
40
60
  def after_update
41
61
  super
42
62
  unless this.supports_returning?(:update)
@@ -46,6 +66,8 @@ module Sequel
46
66
 
47
67
  private
48
68
 
69
+ # If the dataset supports UPDATE RETURNING, use it to do the refresh in the same
70
+ # query as the update.
49
71
  def _update_without_checking(columns)
50
72
  ds = _update_dataset
51
73
  if ds.supports_returning?(:update)
@@ -61,17 +83,6 @@ module Sequel
61
83
  end
62
84
  end
63
85
  end
64
-
65
- module ClassMethods
66
- attr_reader :update_refresh_columns
67
- end
68
-
69
- def self.configure(model, opts=OPTS)
70
- model.instance_eval do
71
- @update_refresh_columns = Array(opts[:columns]) || []
72
- end
73
- end
74
-
75
86
  end
76
87
  end
77
88
  end
@@ -39,6 +39,19 @@ module Sequel
39
39
  # options.
40
40
  attr_reader :validation_reflections
41
41
 
42
+ # Freeze validation metadata when freezing model class.
43
+ def freeze
44
+ @validations.freeze.each_value(&:freeze)
45
+ @validation_reflections.freeze.each_value do |vs|
46
+ vs.freeze.each do |v|
47
+ v.freeze
48
+ v.last.freeze
49
+ end
50
+ end
51
+
52
+ super
53
+ end
54
+
42
55
  # The Generator class is used to generate validation definitions using
43
56
  # the validates {} idiom.
44
57
  class Generator
@@ -62,6 +62,11 @@ module Sequel
62
62
  end
63
63
  end
64
64
 
65
+ # Show that this is an SQLTime, and the time represented
66
+ def inspect
67
+ "#<#{self.class} #{to_s}>"
68
+ end
69
+
65
70
  # Return a string in HH:MM:SS format representing the time.
66
71
  def to_s(*args)
67
72
  if args.empty?
@@ -1054,6 +1059,20 @@ module Sequel
1054
1059
  def lit(*args)
1055
1060
  args.empty? ? LiteralString.new(self) : SQL::PlaceholderLiteralString.new(self, args)
1056
1061
  end
1062
+
1063
+ # Return a string showing that this is a blob, the size, and the some or all of the content,
1064
+ # depending on the size.
1065
+ def inspect
1066
+ size = length
1067
+
1068
+ content = if size > 20
1069
+ "start=#{self[0...10].to_s.inspect} end=#{self[-10..-1].to_s.inspect}"
1070
+ else
1071
+ "content=#{super}"
1072
+ end
1073
+
1074
+ "#<#{self.class}:0x#{"%x" % object_id} bytes=#{size} #{content}>"
1075
+ end
1057
1076
 
1058
1077
  # Returns +self+, since it is already a blob.
1059
1078
  def to_sequel_blob
@@ -1801,6 +1820,10 @@ module Sequel
1801
1820
  # ruby array of two element arrays as an SQL value list instead of an ordered
1802
1821
  # hash-like conditions specifier.
1803
1822
  class ValueList < ::Array
1823
+ # Show that this is a value list and not just an array
1824
+ def inspect
1825
+ "#<#{self.class} #{super}>"
1826
+ end
1804
1827
  end
1805
1828
 
1806
1829
  # The purpose of the +VirtualRow+ class is to allow the easy creation of SQL identifiers and functions
@@ -1990,6 +2013,11 @@ module Sequel
1990
2013
  include SQL::InequalityMethods
1991
2014
  include SQL::AliasMethods
1992
2015
  include SQL::CastMethods
2016
+
2017
+ # Show that the current string is a literal string in addition to the output.
2018
+ def inspect
2019
+ "#<#{self.class} #{super}>"
2020
+ end
1993
2021
 
1994
2022
  # Return self if no args are given, otherwise return a SQL::PlaceholderLiteralString
1995
2023
  # with the current string and the given args.
@@ -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 = 43
8
+ MINOR = 44
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
@@ -2,6 +2,9 @@ SEQUEL_ADAPTER_TEST = :postgres
2
2
 
3
3
  require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
4
4
 
5
+ uses_pg = Sequel::Postgres::USES_PG if DB.adapter_scheme == :postgres
6
+ uses_pg_or_jdbc = uses_pg || DB.adapter_scheme == :jdbc
7
+
5
8
  def DB.sqls
6
9
  (@sqls ||= [])
7
10
  end
@@ -361,7 +364,7 @@ describe "A PostgreSQL database" do
361
364
  a = nil
362
365
  Sequel.connect(DB.opts.merge(:notice_receiver=>proc{|r| a = r.result_error_message})){|db| db.do("BEGIN\nRAISE WARNING 'foo';\nEND;")}
363
366
  a.must_equal "WARNING: foo\n"
364
- end if DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG && DB.server_version >= 90000
367
+ end if uses_pg && DB.server_version >= 90000
365
368
 
366
369
  # These only test the SQL created, because a true test using file_fdw or postgres_fdw
367
370
  # requires superuser permissions, and you should not be running the tests as a superuser.
@@ -524,7 +527,7 @@ describe "A PostgreSQL dataset" do
524
527
  info[:constraint].must_be_nil
525
528
  info[:column].must_equal 't2'
526
529
  info[:type].must_be_nil
527
- end if DB.server_version >= 90300 && DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG && Object.const_defined?(:PG) && ::PG.const_defined?(:Constants) && ::PG::Constants.const_defined?(:PG_DIAG_SCHEMA_NAME)
530
+ end if DB.server_version >= 90300 && uses_pg && Object.const_defined?(:PG) && ::PG.const_defined?(:Constants) && ::PG::Constants.const_defined?(:PG_DIAG_SCHEMA_NAME)
528
531
 
529
532
  it "should support Database#do for executing anonymous code blocks" do
530
533
  @db.drop_table?(:btest)
@@ -1776,7 +1779,7 @@ if DB.adapter_scheme == :postgres
1776
1779
  end
1777
1780
  end
1778
1781
 
1779
- if ((DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG) || DB.adapter_scheme == :jdbc) && DB.server_version >= 90000
1782
+ if uses_pg_or_jdbc && DB.server_version >= 90000
1780
1783
  describe "Postgres::Database#copy_into" do
1781
1784
  before(:all) do
1782
1785
  @db = DB
@@ -1928,7 +1931,7 @@ if ((DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG) || DB.adapter_sc
1928
1931
  end
1929
1932
  end
1930
1933
 
1931
- if DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG && DB.server_version >= 90000
1934
+ if uses_pg && DB.server_version >= 90000
1932
1935
  describe "Postgres::Database LISTEN/NOTIFY" do
1933
1936
  before(:all) do
1934
1937
  @db = DB
@@ -2416,7 +2419,7 @@ describe 'PostgreSQL array handling' do
2416
2419
  @ds.get(:i).must_equal a
2417
2420
  @ds.filter(:i=>:$i).call(:first, :i=>a).must_equal(:i=>a)
2418
2421
  @ds.filter(:i=>:$i).call(:first, :i=>Sequel.pg_array([Sequel.blob("b\0")], 'bytea')).must_be_nil
2419
- end if (DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG) || DB.adapter_scheme == :jdbc
2422
+ end if uses_pg_or_jdbc
2420
2423
 
2421
2424
  it 'with models' do
2422
2425
  @db.create_table!(:items) do
@@ -2604,7 +2607,7 @@ describe 'PostgreSQL hstore handling' do
2604
2607
  @ds.get(:i).must_equal @h
2605
2608
  @ds.filter(:i=>:$i).call(:first, :i=>@h).must_equal(:i=>@h)
2606
2609
  @ds.filter(:i=>:$i).call(:first, :i=>{}).must_be_nil
2607
- end if (DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG) || DB.adapter_scheme == :jdbc
2610
+ end if uses_pg_or_jdbc
2608
2611
 
2609
2612
  it 'with models and associations' do
2610
2613
  @db.create_table!(:items) do
@@ -2877,7 +2880,7 @@ describe 'PostgreSQL json type' do
2877
2880
  j = Sequel.pg_array([pg_json.call('a'=>1), pg_json.call(['b', 2])], json_type)
2878
2881
  @ds.call(:insert, {:i=>j}, {:i=>:$i})
2879
2882
  @ds.get(:i).must_equal j
2880
- end if (DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG) || DB.adapter_scheme == :jdbc
2883
+ end if uses_pg_or_jdbc
2881
2884
 
2882
2885
  it 'operations/functions with pg_json_ops' do
2883
2886
  Sequel.extension :pg_json_ops
@@ -3072,7 +3075,7 @@ describe 'PostgreSQL inet/cidr types' do
3072
3075
  @ds.filter(:i=>:$i, :c=>:$c, :m=>:$m).call(:first, :i=>[@ipv4], :c=>[@ipv4nm], :m=>['12:34:56:78:90:ab']).must_equal(:i=>[@ipv4], :c=>[@ipv4nm], :m=>['12:34:56:78:90:ab'])
3073
3076
  @ds.filter(:i=>:$i, :c=>:$c, :m=>:$m).call(:first, :i=>[], :c=>[], :m=>[]).must_be_nil
3074
3077
  @ds.filter(:i=>:$i, :c=>:$c, :m=>:$m).call(:delete, :i=>[@ipv4], :c=>[@ipv4nm], :m=>['12:34:56:78:90:ab']).must_equal 1
3075
- end if (DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG) || DB.adapter_scheme == :jdbc
3078
+ end if uses_pg_or_jdbc
3076
3079
 
3077
3080
  it 'with models' do
3078
3081
  @db.create_table!(:items) do
@@ -3235,7 +3238,7 @@ describe 'PostgreSQL range types' do
3235
3238
  @ds.filter(h).call(:first, @pgra).each{|k, v| v.must_be :==, @ra[k].to_a}
3236
3239
  @ds.filter(h).call(:first, r2).must_be_nil
3237
3240
  @ds.filter(h).call(:delete, @ra).must_equal 1
3238
- end if (DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG) || DB.adapter_scheme == :jdbc
3241
+ end if uses_pg_or_jdbc
3239
3242
 
3240
3243
  it 'with models' do
3241
3244
  @db.create_table!(:items){primary_key :id; int4range :i4; int8range :i8; numrange :n; daterange :d; tsrange :t; tstzrange :tz}
@@ -3416,7 +3419,7 @@ describe 'PostgreSQL interval types' do
3416
3419
  @ds.filter(:i=>:$i).call(:first, :i=>[d]).must_equal(:i=>[d])
3417
3420
  @ds.filter(:i=>:$i).call(:first, :i=>[]).must_be_nil
3418
3421
  @ds.filter(:i=>:$i).call(:delete, :i=>[d]).must_equal 1
3419
- end if (DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG) || DB.adapter_scheme == :jdbc
3422
+ end if uses_pg_or_jdbc
3420
3423
 
3421
3424
  it 'with models' do
3422
3425
  @db.create_table!(:items) do
@@ -3533,7 +3536,7 @@ describe 'PostgreSQL row-valued/composite types' do
3533
3536
  @ds.delete
3534
3537
  @ds.call(:insert, {:address=>Sequel.pg_row([nil, nil, nil])}, {:address=>:$address, :id=>1})
3535
3538
  @ds.get(:address).must_equal(:street=>nil, :city=>nil, :zip=>nil)
3536
- end if (DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG) || DB.adapter_scheme == :jdbc
3539
+ end if uses_pg_or_jdbc
3537
3540
 
3538
3541
  it 'use arrays of row types in bound variables' do
3539
3542
  @ds = @db[:company]
@@ -3545,7 +3548,7 @@ describe 'PostgreSQL row-valued/composite types' do
3545
3548
  @ds.delete
3546
3549
  @ds.call(:insert, {:employees=>Sequel.pg_array([@db.row_type(:person, [1, Sequel.pg_row([nil, nil, nil])])])}, {:employees=>:$employees, :id=>1})
3547
3550
  @ds.get(:employees).must_equal [{:address=>{:city=>nil, :zip=>nil, :street=>nil}, :id=>1}]
3548
- end if (DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG) || DB.adapter_scheme == :jdbc
3551
+ end if uses_pg_or_jdbc
3549
3552
 
3550
3553
  it 'operations/functions with pg_row_ops' do
3551
3554
  @ds.insert(:id=>1, :address=>Sequel.pg_row(['123 Sesame St', 'Somewhere', '12345']))
@@ -3671,7 +3674,7 @@ describe 'PostgreSQL row-valued/composite types' do
3671
3674
  @ds.get(:address).must_equal @a
3672
3675
  @ds.filter(:address=>Sequel.cast(:$address, :address)).call(:first, :address=>@a)[:id].must_equal 1
3673
3676
  @ds.filter(:address=>Sequel.cast(:$address, :address)).call(:first, :address=>Address.new(:street=>'123 Sesame St', :city=>'Somewhere', :zip=>'12356')).must_be_nil
3674
- end if (DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG) || DB.adapter_scheme == :jdbc
3677
+ end if uses_pg_or_jdbc
3675
3678
 
3676
3679
  it 'use arrays of model objects in bound variables' do
3677
3680
  @ds = @db[:company]
@@ -3679,7 +3682,7 @@ describe 'PostgreSQL row-valued/composite types' do
3679
3682
  @ds.get(:company).must_equal Company.new(:id=>1, :employees=>@es)
3680
3683
  @ds.filter(:employees=>Sequel.cast(:$employees, 'person[]')).call(:first, :employees=>@es)[:id].must_equal 1
3681
3684
  @ds.filter(:employees=>Sequel.cast(:$employees, 'person[]')).call(:first, :employees=>Sequel.pg_array([@db.row_type(:person, [1, Sequel.pg_row(['123 Sesame St', 'Somewhere', '12356'])])])).must_be_nil
3682
- end if (DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG) || DB.adapter_scheme == :jdbc
3685
+ end if uses_pg_or_jdbc
3683
3686
 
3684
3687
  it 'model typecasting' do
3685
3688
  Person.plugin :pg_typecast_on_load, :address unless @native
@@ -3744,7 +3747,7 @@ describe 'pg_static_cache_updater extension' do
3744
3747
  q1.push(proc{throw :stop})
3745
3748
  q.pop
3746
3749
  end
3747
- end if DB.adapter_scheme == :postgres && SEQUEL_POSTGRES_USES_PG && DB.server_version >= 90000
3750
+ end if uses_pg && DB.server_version >= 90000
3748
3751
 
3749
3752
  describe 'PostgreSQL enum types' do
3750
3753
  before do