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
data/lib/sequel/model/base.rb
CHANGED
@@ -24,6 +24,9 @@ module Sequel
|
|
24
24
|
# with all of these modules.
|
25
25
|
attr_reader :dataset_method_modules
|
26
26
|
|
27
|
+
# The Module subclass to use for dataset_module blocks.
|
28
|
+
attr_reader :dataset_module_class
|
29
|
+
|
27
30
|
# The default options to use for Model#set_fields. These are merged with
|
28
31
|
# the options given to set_fields.
|
29
32
|
attr_accessor :default_set_fields_options
|
@@ -82,7 +85,7 @@ module Sequel
|
|
82
85
|
#
|
83
86
|
# or:
|
84
87
|
#
|
85
|
-
# Foo = Sequel::Model
|
88
|
+
# Foo = Class.new(Sequel::Model)
|
86
89
|
# Foo.set_dataset :my_foo
|
87
90
|
attr_accessor :require_valid_table
|
88
91
|
|
@@ -116,7 +119,7 @@ module Sequel
|
|
116
119
|
# Whether to enable the after_commit and after_rollback hooks when saving/destroying
|
117
120
|
# instances. On by default, can be turned off for performance reasons or when using
|
118
121
|
# prepared transactions (which aren't compatible with after commit/rollback).
|
119
|
-
attr_accessor :use_after_commit_rollback
|
122
|
+
attr_accessor :use_after_commit_rollback # SEQUEL5: Deprecate after release
|
120
123
|
|
121
124
|
# Whether to use a transaction by default when saving/deleting records (default: true).
|
122
125
|
# If you are sending database queries in before_* or after_* hooks, you shouldn't change
|
@@ -167,7 +170,9 @@ module Sequel
|
|
167
170
|
# The purpose of this method is to set the dataset/database automatically
|
168
171
|
# for a model class, if the table name doesn't match the implicit
|
169
172
|
# name. This is neater than using set_dataset inside the class,
|
170
|
-
# doesn't require a bogus query for the schema
|
173
|
+
# doesn't require a bogus query for the schema, and works when using
|
174
|
+
# +require_valid_table+, or with plugins that assume a model's dataset
|
175
|
+
# is valid.
|
171
176
|
#
|
172
177
|
# When creating subclasses of Sequel::Model itself, this method is usually
|
173
178
|
# called on Sequel itself, using <tt>Sequel::Model(:something)</tt>.
|
@@ -188,10 +193,8 @@ module Sequel
|
|
188
193
|
# end
|
189
194
|
def Model(source)
|
190
195
|
if cache_anonymous_models
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
if klass = mutex.synchronize{cache[source]}
|
196
|
+
cache = Sequel.synchronize{@Model_cache ||= {}}
|
197
|
+
if klass = Sequel.synchronize{cache[source]}
|
195
198
|
return klass
|
196
199
|
end
|
197
200
|
end
|
@@ -205,12 +208,24 @@ module Sequel
|
|
205
208
|
end
|
206
209
|
|
207
210
|
if cache_anonymous_models
|
208
|
-
|
211
|
+
Sequel.synchronize{cache[source] = klass}
|
209
212
|
end
|
210
213
|
|
211
214
|
klass
|
212
215
|
end
|
213
216
|
|
217
|
+
def initialize_copy(_)
|
218
|
+
Sequel::Deprecation.deprecate("Model.clone", "Create a subclass of the model instead of cloning it.")
|
219
|
+
# raise(Error, "cannot dup/clone a Sequel::Model class") # SEQUEL5
|
220
|
+
super
|
221
|
+
end
|
222
|
+
def dup
|
223
|
+
Sequel::Deprecation.deprecate("Model.dup", "Create a subclass of the model instead of duping it.")
|
224
|
+
# raise(Error, "cannot dup/clone a Sequel::Model class") # SEQUEL5
|
225
|
+
super
|
226
|
+
end
|
227
|
+
|
228
|
+
|
214
229
|
# Returns the first record from the database matching the conditions.
|
215
230
|
# If a hash is given, it is used as the conditions. If another
|
216
231
|
# object is given, it finds the first record whose primary key(s) match
|
@@ -338,13 +353,13 @@ module Sequel
|
|
338
353
|
dataset_extend(mod)
|
339
354
|
mod
|
340
355
|
else
|
341
|
-
@dataset_module ||=
|
356
|
+
@dataset_module ||= dataset_module_class.new(self)
|
342
357
|
@dataset_module.module_eval(&Proc.new) if block_given?
|
343
358
|
dataset_extend(@dataset_module)
|
344
359
|
@dataset_module
|
345
360
|
end
|
346
361
|
end
|
347
|
-
|
362
|
+
|
348
363
|
# Returns the database associated with the Model class.
|
349
364
|
# If this model doesn't have a database associated with it,
|
350
365
|
# assumes the superclass's database, or the first object in
|
@@ -835,17 +850,27 @@ module Sequel
|
|
835
850
|
# database with the table name given. Other arguments raise an +Error+.
|
836
851
|
# Returns self.
|
837
852
|
#
|
838
|
-
# This changes the row_proc of the dataset to return
|
839
|
-
# model objects and extends the dataset with the dataset_method_modules.
|
840
853
|
# It also attempts to determine the database schema for the model,
|
841
854
|
# based on the given dataset.
|
842
855
|
#
|
843
|
-
# Artist.set_dataset(:tbl_artists)
|
844
|
-
# Artist.set_dataset(DB[:artists])
|
845
|
-
#
|
846
856
|
# Note that you should not use this to change the model's dataset
|
847
857
|
# at runtime. If you have that need, you should look into Sequel's
|
848
858
|
# sharding support.
|
859
|
+
#
|
860
|
+
# You should avoid calling this method directly. Instead of doing:
|
861
|
+
#
|
862
|
+
# class Artist < Sequel::Model
|
863
|
+
# set_dataset :tbl_artists
|
864
|
+
# end
|
865
|
+
#
|
866
|
+
# You should use:
|
867
|
+
#
|
868
|
+
# class Artist < Sequel::Model(:tbl_artists)
|
869
|
+
# end
|
870
|
+
#
|
871
|
+
# This ensures the class never uses an invalid dataset. Calling +set_dataset+
|
872
|
+
# after creating a class can create a class with initial invalid dataset, which
|
873
|
+
# will break when +require_valid_table+ or certain plugins are used.
|
849
874
|
def set_dataset(ds, opts=OPTS)
|
850
875
|
inherited = opts[:inherited]
|
851
876
|
@dataset = convert_input_dataset(ds)
|
@@ -895,7 +920,6 @@ module Sequel
|
|
895
920
|
# Cache of setter methods to allow by default, in order to speed up new/set/update instance methods.
|
896
921
|
def setter_methods
|
897
922
|
return @setter_methods if @setter_methods
|
898
|
-
raise if frozen?
|
899
923
|
@setter_methods = get_setter_methods
|
900
924
|
end
|
901
925
|
|
@@ -937,7 +961,7 @@ module Sequel
|
|
937
961
|
#
|
938
962
|
# Artist.table_name # => :artists
|
939
963
|
# Sequel::Model(:foo).table_name # => :foo
|
940
|
-
# Sequel::Model(:
|
964
|
+
# Sequel::Model(Sequel[:foo].as(:bar)).table_name # => :bar
|
941
965
|
def table_name
|
942
966
|
dataset.first_source_alias
|
943
967
|
end
|
@@ -1253,7 +1277,7 @@ module Sequel
|
|
1253
1277
|
# should be used whenever the model's dataset is modified.
|
1254
1278
|
def reset_instance_dataset
|
1255
1279
|
Sequel.synchronize{@finders.clear if @finders}
|
1256
|
-
@instance_dataset = @dataset.limit(1).naked if @dataset
|
1280
|
+
@instance_dataset = @dataset.limit(1).naked.skip_limit_check if @dataset
|
1257
1281
|
end
|
1258
1282
|
|
1259
1283
|
# Set the columns for this model and create accessor methods for each column.
|
@@ -1736,8 +1760,8 @@ module Sequel
|
|
1736
1760
|
raise Sequel::Error, "can't save frozen object" if frozen?
|
1737
1761
|
set_server(opts[:server]) if opts[:server]
|
1738
1762
|
_before_validation
|
1739
|
-
if opts[:validate] != false
|
1740
|
-
unless checked_save_failure(opts){_valid?(
|
1763
|
+
if opts[:validate] != false # SEQUEL5: Remove if
|
1764
|
+
unless checked_save_failure(opts){_valid?(opts)}
|
1741
1765
|
raise(ValidationFailed.new(self)) if raise_on_failure?(opts)
|
1742
1766
|
return
|
1743
1767
|
end
|
@@ -1931,12 +1955,16 @@ module Sequel
|
|
1931
1955
|
|
1932
1956
|
# Validates the object and returns true if no errors are reported.
|
1933
1957
|
#
|
1934
|
-
# artist(:name=>'Valid').valid? # => true
|
1935
|
-
# artist(:name=>'Invalid').valid? # => false
|
1958
|
+
# artist.set(:name=>'Valid').valid? # => true
|
1959
|
+
# artist.set(:name=>'Invalid').valid? # => false
|
1936
1960
|
# artist.errors.full_messages # => ['name cannot be Invalid']
|
1937
1961
|
def valid?(opts = OPTS)
|
1938
1962
|
_before_validation
|
1939
|
-
|
1963
|
+
begin
|
1964
|
+
_valid?(opts)
|
1965
|
+
rescue HookFailed
|
1966
|
+
false
|
1967
|
+
end
|
1940
1968
|
end
|
1941
1969
|
|
1942
1970
|
private
|
@@ -1944,6 +1972,7 @@ module Sequel
|
|
1944
1972
|
# Run code directly after the INSERT query, before after_create.
|
1945
1973
|
# This is only a temporary API, it should not be overridden by external code.
|
1946
1974
|
def _after_create(pk)
|
1975
|
+
# SEQUEL5: Remove
|
1947
1976
|
@this = nil
|
1948
1977
|
@new = false
|
1949
1978
|
@was_new = true
|
@@ -1952,6 +1981,7 @@ module Sequel
|
|
1952
1981
|
# Run code after around_save returns, before calling after_commit.
|
1953
1982
|
# This is only a temporary API, it should not be overridden by external code.
|
1954
1983
|
def _after_save(pk)
|
1984
|
+
# SEQUEL5: Remove
|
1955
1985
|
if @was_new
|
1956
1986
|
@was_new = nil
|
1957
1987
|
pk ? _save_refresh : changed_columns.clear
|
@@ -1964,6 +1994,7 @@ module Sequel
|
|
1964
1994
|
# Run code directly after the UPDATE query, before after_update.
|
1965
1995
|
# This is only a temporary API, it should not be overridden by external code.
|
1966
1996
|
def _after_update
|
1997
|
+
# SEQUEL5: Remove
|
1967
1998
|
@this = nil
|
1968
1999
|
end
|
1969
2000
|
|
@@ -2008,17 +2039,26 @@ module Sequel
|
|
2008
2039
|
def _destroy(opts)
|
2009
2040
|
sh = {:server=>this_server}
|
2010
2041
|
uacr = use_after_commit_rollback
|
2011
|
-
|
2042
|
+
if uacr.nil? ? (method(:after_destroy_rollback).owner != InstanceMethods) : uacr
|
2043
|
+
Sequel::Deprecation.deprecate("Model#after_destroy_rollback", "Instead, call db.after_rollback in Model#before_destroy")
|
2044
|
+
db.after_rollback(sh){after_destroy_rollback}
|
2045
|
+
end
|
2012
2046
|
called = false
|
2013
2047
|
around_destroy do
|
2014
2048
|
called = true
|
2015
|
-
|
2049
|
+
if before_destroy == false
|
2050
|
+
Sequel::Deprecation.deprecate("Having before_destroy return false to cancel the destroy", "Instead, call cancel_action inside before_destroy")
|
2051
|
+
raise_hook_failure(:before_destroy)
|
2052
|
+
end
|
2016
2053
|
_destroy_delete
|
2017
2054
|
after_destroy
|
2018
2055
|
true
|
2019
2056
|
end
|
2020
2057
|
raise_hook_failure(:around_destroy) unless called
|
2021
|
-
|
2058
|
+
if uacr.nil? ? (method(:after_destroy_commit).owner != InstanceMethods) : uacr
|
2059
|
+
Sequel::Deprecation.deprecate("Model#after_destroy_commit", "Instead, call db.after_commit in Model#after_destroy")
|
2060
|
+
db.after_commit(sh){after_destroy_commit}
|
2061
|
+
end
|
2022
2062
|
self
|
2023
2063
|
end
|
2024
2064
|
|
@@ -2095,19 +2135,34 @@ module Sequel
|
|
2095
2135
|
def _save(opts)
|
2096
2136
|
sh = {:server=>this_server}
|
2097
2137
|
uacr = use_after_commit_rollback
|
2098
|
-
|
2138
|
+
if uacr.nil? ? (method(:after_rollback).owner != InstanceMethods) : uacr
|
2139
|
+
Sequel::Deprecation.deprecate("Model#after_rollback", "Instead, call db.after_rollback in Model#before_save.")
|
2140
|
+
db.after_rollback(sh){after_rollback}
|
2141
|
+
end
|
2099
2142
|
pk = nil
|
2100
2143
|
called_save = false
|
2101
2144
|
called_cu = false
|
2102
2145
|
around_save do
|
2103
2146
|
called_save = true
|
2104
|
-
|
2147
|
+
if before_save == false
|
2148
|
+
Sequel::Deprecation.deprecate("Having before_save return false to cancel the save", "Instead, call cancel_action inside before_save")
|
2149
|
+
raise_hook_failure(:before_save)
|
2150
|
+
end
|
2151
|
+
|
2105
2152
|
if new?
|
2106
2153
|
around_create do
|
2107
2154
|
called_cu = true
|
2108
|
-
|
2155
|
+
if before_create == false
|
2156
|
+
Sequel::Deprecation.deprecate("Having before_create return false to cancel the create", "Instead, call cancel_action inside before_create")
|
2157
|
+
raise_hook_failure(:before_create)
|
2158
|
+
end
|
2109
2159
|
pk = _insert
|
2110
|
-
_after_create(pk)
|
2160
|
+
_after_create(pk) # SEQUEL5: Remove
|
2161
|
+
# SEQUEL5
|
2162
|
+
# @this = nil
|
2163
|
+
# @new = false
|
2164
|
+
# @modified = false
|
2165
|
+
# pk ? _save_refresh : changed_columns.clear
|
2111
2166
|
after_create
|
2112
2167
|
true
|
2113
2168
|
end
|
@@ -2115,10 +2170,13 @@ module Sequel
|
|
2115
2170
|
else
|
2116
2171
|
around_update do
|
2117
2172
|
called_cu = true
|
2118
|
-
|
2173
|
+
if before_update == false
|
2174
|
+
Sequel::Deprecation.deprecate("Having before_update return false to cancel the update", "Instead, call cancel_action inside before_update")
|
2175
|
+
raise_hook_failure(:before_update)
|
2176
|
+
end
|
2119
2177
|
columns = opts[:columns]
|
2120
2178
|
if columns.nil?
|
2121
|
-
|
2179
|
+
columns_updated = if opts[:changed] # SEQUEL5: Use local variable instead of instance variable
|
2122
2180
|
@values.reject{|k,v| !changed_columns.include?(k)}
|
2123
2181
|
else
|
2124
2182
|
_save_update_all_columns_hash
|
@@ -2126,11 +2184,14 @@ module Sequel
|
|
2126
2184
|
changed_columns.clear
|
2127
2185
|
else # update only the specified columns
|
2128
2186
|
columns = Array(columns)
|
2129
|
-
|
2187
|
+
columns_updated = @values.reject{|k, v| !columns.include?(k)}
|
2130
2188
|
changed_columns.reject!{|c| columns.include?(c)}
|
2131
2189
|
end
|
2132
|
-
_update_columns(
|
2133
|
-
_after_update
|
2190
|
+
_update_columns(columns_updated)
|
2191
|
+
_after_update # SEQUEL5: Remove
|
2192
|
+
# SEQUEL5
|
2193
|
+
# @this = nil
|
2194
|
+
# @modified = false
|
2134
2195
|
after_update
|
2135
2196
|
true
|
2136
2197
|
end
|
@@ -2140,11 +2201,14 @@ module Sequel
|
|
2140
2201
|
true
|
2141
2202
|
end
|
2142
2203
|
raise_hook_failure(:around_save) unless called_save
|
2143
|
-
_after_save(pk)
|
2144
|
-
|
2204
|
+
_after_save(pk) # SEQUEL5: Remove
|
2205
|
+
if uacr.nil? ? (method(:after_commit).owner != InstanceMethods) : uacr
|
2206
|
+
Sequel::Deprecation.deprecate("Model#after_commit", "Instead, call db.after_commit in Model#after_save.")
|
2207
|
+
db.after_commit(sh){after_commit}
|
2208
|
+
end
|
2145
2209
|
self
|
2146
2210
|
end
|
2147
|
-
|
2211
|
+
|
2148
2212
|
# Refresh the object after saving it, used to get
|
2149
2213
|
# default values of all columns. Separated from _save so it
|
2150
2214
|
# can be overridden to avoid the refresh.
|
@@ -2175,6 +2239,7 @@ module Sequel
|
|
2175
2239
|
# Plugins can override this method in order to update with
|
2176
2240
|
# additional columns, even when the column hash is initially empty.
|
2177
2241
|
def _update_columns(columns)
|
2242
|
+
@columns_updated ||= DeprecatedColumnsUpdated.new(columns) # SEQUEL5: Remove
|
2178
2243
|
_update(columns) unless columns.empty?
|
2179
2244
|
end
|
2180
2245
|
|
@@ -2202,38 +2267,27 @@ module Sequel
|
|
2202
2267
|
(!ds.opts[:select] || ds.opts[:returning]) && ds.supports_insert_select?
|
2203
2268
|
end
|
2204
2269
|
|
2205
|
-
# Internal validation method
|
2206
|
-
|
2207
|
-
# +false+, +false+ will be returned instead.
|
2208
|
-
def _valid?(raise_errors, opts)
|
2270
|
+
# Internal validation method, running validation hooks.
|
2271
|
+
def _valid?(opts)
|
2209
2272
|
return errors.empty? if frozen?
|
2210
2273
|
errors.clear
|
2211
2274
|
called = false
|
2212
|
-
|
2275
|
+
# skip_validate = opts[:validate] == false # SEQUEL5
|
2213
2276
|
around_validation do
|
2214
2277
|
called = true
|
2215
2278
|
if before_validation == false
|
2216
|
-
|
2217
|
-
|
2218
|
-
else
|
2219
|
-
error = true
|
2220
|
-
end
|
2221
|
-
false
|
2279
|
+
Sequel::Deprecation.deprecate("Having before_validation return false to mark the object as invalid", "Instead, call cancel_action inside before_validation")
|
2280
|
+
raise_hook_failure(:before_validation)
|
2222
2281
|
else
|
2223
|
-
validate
|
2282
|
+
validate # unless skip_validate # SEQUEL5
|
2224
2283
|
after_validation
|
2225
|
-
errors.empty?
|
2226
2284
|
end
|
2227
2285
|
end
|
2228
|
-
|
2229
|
-
if
|
2230
|
-
if raise_errors
|
2231
|
-
raise_hook_failure(:around_validation)
|
2232
|
-
else
|
2233
|
-
false
|
2234
|
-
end
|
2235
|
-
else
|
2286
|
+
# return true if skip_validate # SEQUEL5
|
2287
|
+
if called
|
2236
2288
|
errors.empty?
|
2289
|
+
else
|
2290
|
+
raise_hook_failure(:around_validation)
|
2237
2291
|
end
|
2238
2292
|
end
|
2239
2293
|
|
@@ -2433,8 +2487,7 @@ module Sequel
|
|
2433
2487
|
end
|
2434
2488
|
end
|
2435
2489
|
|
2436
|
-
#
|
2437
|
-
# the call to set_dataset.
|
2490
|
+
# DatasetMethods contains methods that all model datasets have.
|
2438
2491
|
module DatasetMethods
|
2439
2492
|
Dataset.def_deprecated_opts_setter(self, :model)
|
2440
2493
|
|
@@ -2618,7 +2671,7 @@ module Sequel
|
|
2618
2671
|
# Artist.dataset.with_pk([1, 2])
|
2619
2672
|
# # SELECT * FROM artists WHERE ((artists.id1 = 1) AND (artists.id2 = 2)) LIMIT 1
|
2620
2673
|
def with_pk(pk)
|
2621
|
-
if loader = _with_pk_loader
|
2674
|
+
if pk && (loader = _with_pk_loader)
|
2622
2675
|
loader.first(*pk)
|
2623
2676
|
else
|
2624
2677
|
first(model.qualified_primary_key_hash(pk))
|
@@ -39,13 +39,14 @@ module Sequel
|
|
39
39
|
end
|
40
40
|
|
41
41
|
meths = (<<-METHS).split.map(&:to_sym)
|
42
|
-
distinct
|
42
|
+
distinct grep group group_and_count group_append
|
43
43
|
limit offset order order_append order_prepend
|
44
44
|
select select_all select_append select_group server
|
45
45
|
METHS
|
46
46
|
|
47
|
-
|
48
|
-
|
47
|
+
# Define a method in the module
|
48
|
+
def self.def_dataset_caching_method(mod, meth)
|
49
|
+
mod.send(:define_method, meth) do |name, *args, &block|
|
49
50
|
if block
|
50
51
|
@model.def_dataset_method(name){send(meth, *args, &block)}
|
51
52
|
else
|
@@ -57,6 +58,10 @@ module Sequel
|
|
57
58
|
end
|
58
59
|
end
|
59
60
|
|
61
|
+
meths.each do |meth|
|
62
|
+
def_dataset_caching_method(self, meth)
|
63
|
+
end
|
64
|
+
|
60
65
|
private
|
61
66
|
|
62
67
|
# Add a class method to the related model that
|
@@ -65,5 +70,7 @@ module Sequel
|
|
65
70
|
@model.send(:def_model_dataset_method, meth)
|
66
71
|
end
|
67
72
|
end
|
73
|
+
|
74
|
+
@dataset_module_class = DatasetModule
|
68
75
|
end
|
69
76
|
end
|
@@ -15,17 +15,24 @@ module Sequel
|
|
15
15
|
|
16
16
|
# Alias for HookFailed, kept for backwards compatibility
|
17
17
|
BeforeHookFailed = HookFailed
|
18
|
+
Sequel::Deprecation.deprecate_constant(self, :BeforeHookFailed)
|
18
19
|
|
20
|
+
(
|
19
21
|
# Exception class raised when +require_modification+ is set and an UPDATE or DELETE statement to modify the dataset doesn't
|
20
22
|
# modify a single row.
|
21
23
|
NoExistingObject = Class.new(Error)
|
24
|
+
).name
|
22
25
|
|
26
|
+
(
|
23
27
|
# Raised when an undefined association is used when eager loading.
|
24
28
|
UndefinedAssociation = Class.new(Error)
|
29
|
+
).name
|
25
30
|
|
31
|
+
(
|
26
32
|
# Raised when a mass assignment method is called in strict mode with either a restricted column
|
27
33
|
# or a column without a setter method.
|
28
34
|
MassAssignmentRestriction = Class.new(Error)
|
35
|
+
).name
|
29
36
|
|
30
37
|
# Exception class raised when +raise_on_save_failure+ is set and validation fails
|
31
38
|
class ValidationFailed < Error
|
@@ -49,9 +56,4 @@ module Sequel
|
|
49
56
|
end
|
50
57
|
end
|
51
58
|
end
|
52
|
-
|
53
|
-
# Call name on each class to set the name for the class, so it gets cached.
|
54
|
-
constants.map{|c| const_get(c)}.each do |c|
|
55
|
-
Class === c && c.name
|
56
|
-
end
|
57
59
|
end
|