sequel 5.31.0 → 5.36.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +90 -0
  3. data/README.rdoc +1 -1
  4. data/doc/advanced_associations.rdoc +4 -4
  5. data/doc/association_basics.rdoc +10 -5
  6. data/doc/code_order.rdoc +12 -2
  7. data/doc/dataset_filtering.rdoc +2 -2
  8. data/doc/model_dataset_method_design.rdoc +1 -1
  9. data/doc/model_plugins.rdoc +1 -1
  10. data/doc/release_notes/5.32.0.txt +46 -0
  11. data/doc/release_notes/5.33.0.txt +24 -0
  12. data/doc/release_notes/5.34.0.txt +40 -0
  13. data/doc/release_notes/5.35.0.txt +56 -0
  14. data/doc/release_notes/5.36.0.txt +60 -0
  15. data/doc/testing.rdoc +1 -0
  16. data/doc/validations.rdoc +1 -1
  17. data/lib/sequel/adapters/odbc.rb +4 -6
  18. data/lib/sequel/adapters/oracle.rb +2 -1
  19. data/lib/sequel/adapters/shared/access.rb +6 -6
  20. data/lib/sequel/adapters/shared/mssql.rb +19 -9
  21. data/lib/sequel/adapters/shared/mysql.rb +9 -9
  22. data/lib/sequel/adapters/shared/oracle.rb +28 -22
  23. data/lib/sequel/adapters/shared/postgres.rb +57 -9
  24. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  25. data/lib/sequel/adapters/shared/sqlite.rb +14 -3
  26. data/lib/sequel/adapters/tinytds.rb +1 -0
  27. data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -0
  28. data/lib/sequel/connection_pool/sharded_single.rb +4 -1
  29. data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
  30. data/lib/sequel/connection_pool/single.rb +1 -1
  31. data/lib/sequel/connection_pool/threaded.rb +2 -2
  32. data/lib/sequel/core.rb +318 -314
  33. data/lib/sequel/database/connecting.rb +1 -1
  34. data/lib/sequel/database/misc.rb +16 -10
  35. data/lib/sequel/database/query.rb +3 -1
  36. data/lib/sequel/database/schema_generator.rb +0 -1
  37. data/lib/sequel/database/schema_methods.rb +15 -16
  38. data/lib/sequel/database/transactions.rb +8 -5
  39. data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
  40. data/lib/sequel/dataset/query.rb +5 -4
  41. data/lib/sequel/deprecated.rb +3 -1
  42. data/lib/sequel/exceptions.rb +2 -0
  43. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  44. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  45. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  46. data/lib/sequel/extensions/connection_validator.rb +2 -2
  47. data/lib/sequel/extensions/core_refinements.rb +2 -0
  48. data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
  49. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  50. data/lib/sequel/extensions/index_caching.rb +9 -7
  51. data/lib/sequel/extensions/integer64.rb +2 -0
  52. data/lib/sequel/extensions/migration.rb +1 -1
  53. data/lib/sequel/extensions/pg_array_ops.rb +4 -0
  54. data/lib/sequel/extensions/pg_enum.rb +2 -0
  55. data/lib/sequel/extensions/pg_extended_date_support.rb +1 -1
  56. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
  57. data/lib/sequel/extensions/pg_inet.rb +15 -5
  58. data/lib/sequel/extensions/pg_interval.rb +2 -0
  59. data/lib/sequel/extensions/pg_json_ops.rb +46 -2
  60. data/lib/sequel/extensions/pg_range.rb +5 -7
  61. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  62. data/lib/sequel/extensions/pg_row.rb +0 -1
  63. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  64. data/lib/sequel/extensions/query.rb +1 -0
  65. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  66. data/lib/sequel/extensions/s.rb +2 -0
  67. data/lib/sequel/extensions/server_block.rb +3 -3
  68. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  69. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  70. data/lib/sequel/extensions/to_dot.rb +9 -3
  71. data/lib/sequel/model.rb +3 -1
  72. data/lib/sequel/model/associations.rb +54 -25
  73. data/lib/sequel/model/base.rb +60 -51
  74. data/lib/sequel/model/plugins.rb +4 -3
  75. data/lib/sequel/plugins/association_lazy_eager_option.rb +2 -0
  76. data/lib/sequel/plugins/association_multi_add_remove.rb +2 -0
  77. data/lib/sequel/plugins/association_pks.rb +60 -18
  78. data/lib/sequel/plugins/association_proxies.rb +3 -0
  79. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  80. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  81. data/lib/sequel/plugins/class_table_inheritance.rb +28 -28
  82. data/lib/sequel/plugins/csv_serializer.rb +2 -0
  83. data/lib/sequel/plugins/dirty.rb +13 -13
  84. data/lib/sequel/plugins/forbid_lazy_load.rb +2 -0
  85. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  86. data/lib/sequel/plugins/json_serializer.rb +3 -7
  87. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  88. data/lib/sequel/plugins/pg_array_associations.rb +2 -3
  89. data/lib/sequel/plugins/prepared_statements.rb +5 -11
  90. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  91. data/lib/sequel/plugins/rcte_tree.rb +10 -16
  92. data/lib/sequel/plugins/single_table_inheritance.rb +15 -15
  93. data/lib/sequel/plugins/string_stripper.rb +1 -1
  94. data/lib/sequel/plugins/subclasses.rb +2 -0
  95. data/lib/sequel/plugins/validation_class_methods.rb +5 -1
  96. data/lib/sequel/timezones.rb +6 -4
  97. data/lib/sequel/version.rb +1 -1
  98. metadata +15 -2
@@ -460,47 +460,6 @@ module Sequel
460
460
  super
461
461
  end
462
462
 
463
- # If possible, set the dataset for the model subclass as soon as it
464
- # is created. Also, make sure the inherited class instance variables
465
- # are copied into the subclass.
466
- #
467
- # Sequel queries the database to get schema information as soon as
468
- # a model class is created:
469
- #
470
- # class Artist < Sequel::Model # Causes schema query
471
- # end
472
- def inherited(subclass)
473
- super
474
- ivs = subclass.instance_variables
475
- inherited_instance_variables.each do |iv, dup|
476
- next if ivs.include?(iv)
477
- if (sup_class_value = instance_variable_get(iv)) && dup
478
- sup_class_value = case dup
479
- when :dup
480
- sup_class_value.dup
481
- when :hash_dup
482
- h = {}
483
- sup_class_value.each{|k,v| h[k] = v.dup}
484
- h
485
- when Proc
486
- dup.call(sup_class_value)
487
- else
488
- raise Error, "bad inherited instance variable type: #{dup.inspect}"
489
- end
490
- end
491
- subclass.instance_variable_set(iv, sup_class_value)
492
- end
493
-
494
- unless ivs.include?(:@dataset)
495
- if @dataset && self != Model
496
- subclass.set_dataset(@dataset.clone, :inherited=>true)
497
- elsif (n = subclass.name) && !n.to_s.empty?
498
- db
499
- subclass.set_dataset(subclass.implicit_table_name)
500
- end
501
- end
502
- end
503
-
504
463
  # Returns the implicit table name for the model class, which is the demodulized,
505
464
  # underscored, pluralized name of the class.
506
465
  #
@@ -515,12 +474,6 @@ module Sequel
515
474
  call(values)
516
475
  end
517
476
 
518
- # Clear the setter_methods cache when a setter method is added.
519
- def method_added(meth)
520
- clear_setter_methods_cache if meth.to_s.end_with?('=')
521
- super
522
- end
523
-
524
477
  # Mark the model as not having a primary key. Not having a primary key
525
478
  # can cause issues, among which is that you won't be able to update records.
526
479
  #
@@ -538,6 +491,11 @@ module Sequel
538
491
  # the module using a the camelized plugin name under Sequel::Plugins.
539
492
  def plugin(plugin, *args, &block)
540
493
  m = plugin.is_a?(Module) ? plugin : plugin_module(plugin)
494
+
495
+ if !m.respond_to?(:apply) && !m.respond_to?(:configure) && (!args.empty? || block)
496
+ Deprecation.deprecate("Plugin #{plugin} accepts no arguments or block, and passing arguments/block to it", "Remove arguments and block when loading the plugin")
497
+ end
498
+
541
499
  unless @plugins.include?(m)
542
500
  @plugins << m
543
501
  m.apply(self, *args, &block) if m.respond_to?(:apply)
@@ -547,8 +505,10 @@ module Sequel
547
505
  dataset_extend(m::DatasetMethods, :create_class_methods=>false)
548
506
  end
549
507
  end
508
+
550
509
  m.configure(self, *args, &block) if m.respond_to?(:configure)
551
510
  end
511
+ ruby2_keywords(:plugin) if respond_to?(:ruby2_keywords, true)
552
512
 
553
513
  # Returns primary key attribute hash. If using a composite primary key
554
514
  # value such be an array with values for each primary key in the correct
@@ -640,7 +600,7 @@ module Sequel
640
600
  @columns = superclass.instance_variable_get(:@columns)
641
601
  @db_schema = superclass.instance_variable_get(:@db_schema)
642
602
  else
643
- @dataset = @dataset.with_extend(*@dataset_method_modules.reverse) if @dataset_method_modules
603
+ @dataset = @dataset.with_extend(*@dataset_method_modules.reverse)
644
604
  @db_schema = get_db_schema
645
605
  end
646
606
 
@@ -679,8 +639,7 @@ module Sequel
679
639
 
680
640
  # Cache of setter methods to allow by default, in order to speed up mass assignment.
681
641
  def setter_methods
682
- return @setter_methods if @setter_methods
683
- @setter_methods = get_setter_methods
642
+ @setter_methods || (@setter_methods = get_setter_methods)
684
643
  end
685
644
 
686
645
  # Returns name of primary table for the dataset. If the table for the dataset
@@ -798,6 +757,7 @@ module Sequel
798
757
  else
799
758
  define_singleton_method(meth){|*args, &block| dataset.public_send(meth, *args, &block)}
800
759
  end
760
+ singleton_class.send(:ruby2_keywords, meth) if respond_to?(:ruby2_keywords, true)
801
761
  end
802
762
 
803
763
  # Get the schema from the database, fall back on checking the columns
@@ -854,6 +814,46 @@ module Sequel
854
814
  meths
855
815
  end
856
816
 
817
+ # If possible, set the dataset for the model subclass as soon as it
818
+ # is created. Also, make sure the inherited class instance variables
819
+ # are copied into the subclass.
820
+ #
821
+ # Sequel queries the database to get schema information as soon as
822
+ # a model class is created:
823
+ #
824
+ # class Artist < Sequel::Model # Causes schema query
825
+ # end
826
+ def inherited(subclass)
827
+ super
828
+ ivs = subclass.instance_variables
829
+ inherited_instance_variables.each do |iv, dup|
830
+ if (sup_class_value = instance_variable_get(iv)) && dup
831
+ sup_class_value = case dup
832
+ when :dup
833
+ sup_class_value.dup
834
+ when :hash_dup
835
+ h = {}
836
+ sup_class_value.each{|k,v| h[k] = v.dup}
837
+ h
838
+ when Proc
839
+ dup.call(sup_class_value)
840
+ else
841
+ raise Error, "bad inherited instance variable type: #{dup.inspect}"
842
+ end
843
+ end
844
+ subclass.instance_variable_set(iv, sup_class_value)
845
+ end
846
+
847
+ unless ivs.include?(:@dataset)
848
+ if @dataset && self != Model
849
+ subclass.set_dataset(@dataset.clone, :inherited=>true)
850
+ elsif (n = subclass.name) && !n.to_s.empty?
851
+ db
852
+ subclass.set_dataset(subclass.implicit_table_name)
853
+ end
854
+ end
855
+ end
856
+
857
857
  # A hash of instance variables to automatically set up in subclasses.
858
858
  # Keys are instance variable symbols, values should be:
859
859
  # nil :: Assign directly from superclass to subclass (frozen objects)
@@ -908,6 +908,12 @@ module Sequel
908
908
  opts[:class_name] ||= '::' + ((name || '').split("::")[0..-2] + [camelize(default)]).join('::')
909
909
  end
910
910
 
911
+ # Clear the setter_methods cache when a setter method is added.
912
+ def method_added(meth)
913
+ clear_setter_methods_cache if meth.to_s.end_with?('=')
914
+ super
915
+ end
916
+
911
917
  # Module that the class includes that holds methods the class adds for column accessors and
912
918
  # associations so that the methods can be overridden with +super+.
913
919
  def overridable_methods_module
@@ -1116,7 +1122,7 @@ module Sequel
1116
1122
  when nil
1117
1123
  return false
1118
1124
  when Array
1119
- return false if pk.any?(&:nil?)
1125
+ return false if pkv.any?(&:nil?)
1120
1126
  end
1121
1127
 
1122
1128
  (obj.class == model) && (obj.pk == pkv)
@@ -1718,6 +1724,7 @@ module Sequel
1718
1724
 
1719
1725
  # The values hash to use when inserting a new record.
1720
1726
  alias _insert_values values
1727
+ private :_insert_values
1721
1728
 
1722
1729
  # Refresh using a particular dataset, used inside save to make sure the same server
1723
1730
  # is used for reading newly inserted values from the database
@@ -2231,7 +2238,9 @@ module Sequel
2231
2238
  plugin self
2232
2239
 
2233
2240
  singleton_class.send(:undef_method, :dup, :clone, :initialize_copy)
2241
+ # :nocov:
2234
2242
  if RUBY_VERSION >= '1.9.3'
2243
+ # :nocov:
2235
2244
  singleton_class.send(:undef_method, :initialize_clone, :initialize_dup)
2236
2245
  end
2237
2246
  end
@@ -31,6 +31,7 @@ module Sequel
31
31
  def self.def_dataset_methods(mod, meths)
32
32
  Array(meths).each do |meth|
33
33
  mod.class_eval("def #{meth}(*args, &block); dataset.#{meth}(*args, &block) end", __FILE__, __LINE__)
34
+ mod.send(:ruby2_keywords, meth) if respond_to?(:ruby2_keywords, true)
34
35
  end
35
36
  end
36
37
 
@@ -40,6 +41,7 @@ module Sequel
40
41
  mod.send(:define_method, :inherited_instance_variables) do ||
41
42
  super().merge!(hash)
42
43
  end
44
+ mod.send(:private, :inherited_instance_variables)
43
45
  end
44
46
 
45
47
  # Add method to +mod+ that overrides set_dataset to call the method afterward.
@@ -148,9 +150,8 @@ module Sequel
148
150
  required_args = arity
149
151
  arity -= 1 if keyword == :required
150
152
 
151
- if callable.is_a?(Proc) && !callable.lambda?
152
- optional_args -= arity
153
- end
153
+ # callable currently is always a non-lambda Proc
154
+ optional_args -= arity
154
155
 
155
156
  [required_args, optional_args, rest, keyword]
156
157
  end
@@ -36,6 +36,8 @@ module Sequel
36
36
  # Album.plugin :association_lazy_eager_option
37
37
  module AssociationLazyEagerOption
38
38
  module InstanceMethods
39
+ private
40
+
39
41
  # Return a dataset for the association after applying any dynamic callback.
40
42
  def _associated_dataset(opts, dynamic_opts)
41
43
  ds = super
@@ -39,6 +39,8 @@ module Sequel
39
39
  # Album.plugin :association_multi_add_remove
40
40
  module AssociationMultiAddRemove
41
41
  module ClassMethods
42
+ private
43
+
42
44
  # Define the methods use to add/remove/set multiple associated objects
43
45
  # in a single method call.
44
46
  def def_association_instance_methods(opts)
@@ -2,13 +2,17 @@
2
2
 
3
3
  module Sequel
4
4
  module Plugins
5
- # The association_pks plugin adds association_pks and association_pks=
6
- # instance methods to the model class for each association added. These
7
- # methods allow for easily returning the primary keys of the associated
8
- # objects, and easily modifying which objects are associated:
5
+ # The association_pks plugin adds association_pks, association_pks=, and
6
+ # association_pks_dataset instance methods to the model class for each
7
+ # one_to_many and many_to_many association added. These methods allow for
8
+ # easily returning the primary keys of the associated objects, and easily
9
+ # modifying which objects are associated:
9
10
  #
10
11
  # Artist.one_to_many :albums
11
12
  # artist = Artist[1]
13
+ # artist.album_pks_dataset
14
+ # # SELECT id FROM albums WHERE (albums.artist_id = 1)
15
+ #
12
16
  # artist.album_pks # [1, 2, 3]
13
17
  # artist.album_pks = [2, 4]
14
18
  # artist.album_pks # [2, 4]
@@ -22,11 +26,18 @@ module Sequel
22
26
  # This plugin makes modifications directly to the underlying tables,
23
27
  # it does not create or return any model objects, and therefore does
24
28
  # not call any callbacks. If you have any association callbacks,
25
- # you probably should not use the setter methods.
29
+ # you probably should not use the setter methods this plugin adds.
26
30
  #
27
31
  # By default, changes to the association will not happen until the object
28
- # is saved. However, using the delay_pks: false option, you can have the
29
- # changes made immediately when the association_pks setter method is called.
32
+ # is saved. However, using the delay_pks: false association option, you can have
33
+ # the changes made immediately when the association_pks setter method is called.
34
+ #
35
+ # By default, repeated calls to the association_pks getter method will not be
36
+ # cached, unless the setter method has been used and the delay_pks: false
37
+ # association option is not used. You can set caching of repeated calls to the
38
+ # association_pks getter method using the :cache_pks association option. You can
39
+ # pass the :refresh option when calling the getter method to ignore any existing
40
+ # cached values, similar to how the :refresh option works with associations.
30
41
  #
31
42
  # By default, if you pass a nil value to the setter, an exception will be raised.
32
43
  # You can change this behavior by using the :association_pks_nil association option.
@@ -60,9 +71,11 @@ module Sequel
60
71
 
61
72
  # Define a association_pks method using the block for the association reflection
62
73
  def def_association_pks_methods(opts)
74
+ association_module_def(opts[:pks_dataset_method], &opts[:pks_dataset])
75
+
63
76
  opts[:pks_getter_method] = :"#{singularize(opts[:name])}_pks_getter"
64
77
  association_module_def(opts[:pks_getter_method], &opts[:pks_getter])
65
- association_module_def(:"#{singularize(opts[:name])}_pks", opts){_association_pks_getter(opts)}
78
+ association_module_def(:"#{singularize(opts[:name])}_pks", opts){|dynamic_opts=OPTS| _association_pks_getter(opts, dynamic_opts)}
66
79
 
67
80
  if opts[:pks_setter]
68
81
  opts[:pks_setter_method] = :"#{singularize(opts[:name])}_pks_setter"
@@ -84,7 +97,9 @@ module Sequel
84
97
  clpk = lpk.is_a?(Array)
85
98
  crk = rk.is_a?(Array)
86
99
 
87
- opts[:pks_getter] = if join_associated_table = opts[:association_pks_use_associated_table]
100
+ dataset_method = opts[:pks_dataset_method] = :"#{singularize(opts[:name])}_pks_dataset"
101
+
102
+ opts[:pks_dataset] = if join_associated_table = opts[:association_pks_use_associated_table]
88
103
  tname = opts[:join_table]
89
104
  lambda do
90
105
  cond = if clpk
@@ -95,16 +110,26 @@ module Sequel
95
110
  rpk = opts.associated_class.primary_key
96
111
  opts.associated_dataset.
97
112
  naked.where(cond).
98
- select_map(Sequel.public_send(rpk.is_a?(Array) ? :deep_qualify : :qualify, opts.associated_class.table_name, rpk))
113
+ select(*Sequel.public_send(rpk.is_a?(Array) ? :deep_qualify : :qualify, opts.associated_class.table_name, rpk))
99
114
  end
100
115
  elsif clpk
101
116
  lambda do
102
117
  cond = lk.zip(lpk).map{|k, pk| [k, get_column_value(pk)]}
103
- _join_table_dataset(opts).where(cond).select_map(rk)
118
+ _join_table_dataset(opts).where(cond).select(*rk)
119
+ end
120
+ else
121
+ lambda do
122
+ _join_table_dataset(opts).where(lk=>get_column_value(lpk)).select(*rk)
123
+ end
124
+ end
125
+
126
+ opts[:pks_getter] = if join_associated_table = opts[:association_pks_use_associated_table]
127
+ lambda do
128
+ public_send(dataset_method).map(opts.associated_class.primary_key)
104
129
  end
105
130
  else
106
131
  lambda do
107
- _join_table_dataset(opts).where(lk=>get_column_value(lpk)).select_map(rk)
132
+ public_send(dataset_method).map(rk)
108
133
  end
109
134
  end
110
135
 
@@ -145,8 +170,14 @@ module Sequel
145
170
 
146
171
  key = opts[:key]
147
172
 
173
+ dataset_method = opts[:pks_dataset_method] = :"#{singularize(opts[:name])}_pks_dataset"
174
+
175
+ opts[:pks_dataset] = lambda do
176
+ public_send(opts[:dataset_method]).select(*opts.associated_class.primary_key)
177
+ end
178
+
148
179
  opts[:pks_getter] = lambda do
149
- public_send(opts[:dataset_method]).select_map(opts.associated_class.primary_key)
180
+ public_send(dataset_method).map(opts.associated_class.primary_key)
150
181
  end
151
182
 
152
183
  unless opts[:read_only]
@@ -207,12 +238,22 @@ module Sequel
207
238
  # Return the primary keys of the associated objects.
208
239
  # If the receiver is a new object, return any saved
209
240
  # pks, or an empty array if no pks have been saved.
210
- def _association_pks_getter(opts)
241
+ def _association_pks_getter(opts, dynamic_opts=OPTS)
242
+ do_cache = opts[:cache_pks]
211
243
  delay = opts.fetch(:delay_pks, true)
212
- if new? && delay
244
+ cache_or_delay = do_cache || delay
245
+
246
+ if dynamic_opts[:refresh] && @_association_pks
247
+ @_association_pks.delete(opts[:name])
248
+ end
249
+
250
+ if new? && cache_or_delay
213
251
  (@_association_pks ||= {})[opts[:name]] ||= []
214
- elsif delay && @_association_pks && (objs = @_association_pks[opts[:name]])
252
+ elsif cache_or_delay && @_association_pks && (objs = @_association_pks[opts[:name]])
215
253
  objs
254
+ elsif do_cache
255
+ # pks_getter_method is private
256
+ (@_association_pks ||= {})[opts[:name]] = send(opts[:pks_getter_method])
216
257
  else
217
258
  # pks_getter_method is private
218
259
  send(opts[:pks_getter_method])
@@ -254,9 +295,10 @@ module Sequel
254
295
 
255
296
  if primary_key.is_a?(Array)
256
297
  if (cols = sch.values_at(*klass.primary_key)).all? && (convs = cols.map{|c| c[:type] == :integer}).all?
298
+ db = model.db
257
299
  pks.map do |cpk|
258
- cpk.zip(convs).map do |pk, conv|
259
- conv ? model.db.typecast_value(:integer, pk) : pk
300
+ cpk.map do |pk|
301
+ db.typecast_value(:integer, pk)
260
302
  end
261
303
  end
262
304
  else
@@ -99,6 +99,7 @@ module Sequel
99
99
  end
100
100
  v.public_send(meth, *args, &block)
101
101
  end
102
+ ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
102
103
  end
103
104
 
104
105
  module ClassMethods
@@ -109,6 +110,8 @@ module Sequel
109
110
 
110
111
  Plugins.inherited_instance_variables(self, :@association_proxy_to_dataset=>nil)
111
112
 
113
+ private
114
+
112
115
  # Changes the association method to return a proxy instead of the associated objects
113
116
  # directly.
114
117
  def def_association_method(opts)
@@ -58,8 +58,7 @@ module Sequel
58
58
  # restricted_columns.
59
59
  def get_setter_methods
60
60
  meths = super
61
- #if !(respond_to?(:allowed_columns) && allowed_columns) && restricted_columns
62
- if (!defined?(::Sequel::Plugins::WhitelistSecurity) || !plugins.include?(::Sequel::Plugins::WhitelistSecurity) || !allowed_columns) && restricted_columns
61
+ if (!defined?(::Sequel::Plugins::WhitelistSecurity::ClassMethods) || !is_a?(::Sequel::Plugins::WhitelistSecurity::ClassMethods) || !allowed_columns) && restricted_columns
63
62
  meths -= restricted_columns.map{|x| "#{x}="}
64
63
  end
65
64
  meths
@@ -31,7 +31,10 @@ module Sequel
31
31
  # Create boolean subset methods for each boolean column.
32
32
  def self.configure(model, &block)
33
33
  model.instance_exec do
34
- define_singleton_method(:boolean_subset_args, &block) if block
34
+ if block
35
+ define_singleton_method(:boolean_subset_args, &block)
36
+ singleton_class.send(:private, :boolean_subset_args)
37
+ end
35
38
  create_boolean_subsets if @dataset
36
39
  end
37
40
  end
@@ -278,6 +278,27 @@ module Sequel
278
278
 
279
279
  Plugins.inherited_instance_variables(self, :@cti_models=>nil, :@cti_tables=>nil, :@cti_table_columns=>nil, :@cti_instance_dataset=>nil, :@cti_table_map=>nil, :@cti_alias=>nil, :@cti_ignore_subclass_columns=>nil, :@cti_qualify_tables=>nil)
280
280
 
281
+ # The table name for the current model class's main table.
282
+ def table_name
283
+ if cti_tables && cti_tables.length > 1
284
+ @cti_alias
285
+ else
286
+ super
287
+ end
288
+ end
289
+
290
+ # The name of the most recently joined table.
291
+ def cti_table_name
292
+ cti_tables.last
293
+ end
294
+
295
+ # The model class for the given key value.
296
+ def sti_class_from_key(key)
297
+ sti_class(sti_model_map[key])
298
+ end
299
+
300
+ private
301
+
281
302
  def inherited(subclass)
282
303
  ds = sti_dataset
283
304
 
@@ -289,7 +310,7 @@ module Sequel
289
310
  # Set table if this is a class table inheritance
290
311
  table = nil
291
312
  columns = nil
292
- if (n = subclass.name) && !n.empty?
313
+ if n = subclass.name
293
314
  if table = cti_table_map[n.to_sym]
294
315
  columns = db.schema(table).map(&:first)
295
316
  else
@@ -340,27 +361,6 @@ module Sequel
340
361
  end
341
362
  end
342
363
 
343
- # The table name for the current model class's main table.
344
- def table_name
345
- if cti_tables && cti_tables.length > 1
346
- @cti_alias
347
- else
348
- super
349
- end
350
- end
351
-
352
- # The name of the most recently joined table.
353
- def cti_table_name
354
- cti_tables ? cti_tables.last : dataset.first_source_alias
355
- end
356
-
357
- # The model class for the given key value.
358
- def sti_class_from_key(key)
359
- sti_class(sti_model_map[key])
360
- end
361
-
362
- private
363
-
364
364
  # If using a subquery for class table inheritance, also use a subquery
365
365
  # when setting subclass dataset.
366
366
  def sti_subclass_dataset(key)
@@ -383,11 +383,6 @@ module Sequel
383
383
  self
384
384
  end
385
385
 
386
- # Don't allow use of prepared statements.
387
- def use_prepared_statements_for?(type)
388
- false
389
- end
390
-
391
386
  # Set the sti_key column based on the sti_key_map.
392
387
  def before_validation
393
388
  if new? && (set = self[model.sti_key])
@@ -422,7 +417,7 @@ module Sequel
422
417
  @values[primary_key] ||= nid
423
418
  end
424
419
  end
425
- db.dataset.supports_insert_select? ? nil : @values[primary_key]
420
+ @values[primary_key]
426
421
  end
427
422
 
428
423
  # Update rows in all backing tables, using the columns in each table.
@@ -438,6 +433,11 @@ module Sequel
438
433
  end
439
434
  end
440
435
  end
436
+
437
+ # Don't allow use of prepared statements.
438
+ def use_prepared_statements_for?(type)
439
+ false
440
+ end
441
441
  end
442
442
  end
443
443
  end