sequel 5.107.0 → 5.108.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/bin/sequel +5 -5
- data/lib/sequel/adapters/ado.rb +1 -1
- data/lib/sequel/adapters/ibmdb.rb +2 -2
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -1
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
- data/lib/sequel/adapters/jdbc.rb +2 -2
- data/lib/sequel/adapters/mock.rb +1 -1
- data/lib/sequel/adapters/mysql.rb +7 -2
- data/lib/sequel/adapters/mysql2.rb +5 -4
- data/lib/sequel/adapters/postgres.rb +37 -37
- data/lib/sequel/adapters/shared/db2.rb +2 -2
- data/lib/sequel/adapters/shared/mssql.rb +4 -4
- data/lib/sequel/adapters/shared/mysql.rb +2 -2
- data/lib/sequel/adapters/shared/postgres.rb +67 -44
- data/lib/sequel/adapters/shared/sqlite.rb +3 -3
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +11 -1
- data/lib/sequel/connection_pool/sharded_single.rb +1 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +7 -5
- data/lib/sequel/connection_pool/sharded_timed_queue.rb +3 -3
- data/lib/sequel/connection_pool/threaded.rb +9 -7
- data/lib/sequel/connection_pool/timed_queue.rb +2 -2
- data/lib/sequel/connection_pool.rb +3 -3
- data/lib/sequel/core.rb +30 -22
- data/lib/sequel/database/connecting.rb +1 -1
- data/lib/sequel/database/features.rb +1 -1
- data/lib/sequel/database/misc.rb +7 -7
- data/lib/sequel/database/query.rb +2 -2
- data/lib/sequel/database/schema_generator.rb +4 -4
- data/lib/sequel/database/schema_methods.rb +2 -2
- data/lib/sequel/database/transactions.rb +4 -4
- data/lib/sequel/dataset/actions.rb +1 -1
- data/lib/sequel/dataset/features.rb +4 -4
- data/lib/sequel/dataset/graph.rb +1 -1
- data/lib/sequel/dataset/misc.rb +3 -3
- data/lib/sequel/dataset/prepared_statements.rb +2 -2
- data/lib/sequel/dataset/query.rb +8 -8
- data/lib/sequel/dataset/sql.rb +18 -10
- data/lib/sequel/dataset.rb +2 -2
- data/lib/sequel/deprecated.rb +2 -2
- data/lib/sequel/exceptions.rb +2 -2
- data/lib/sequel/extensions/_pretty_table.rb +1 -1
- data/lib/sequel/extensions/async_thread_pool.rb +3 -3
- data/lib/sequel/extensions/auto_cast_date_and_time.rb +2 -2
- data/lib/sequel/extensions/blank.rb +2 -2
- data/lib/sequel/extensions/constraint_validations.rb +1 -1
- data/lib/sequel/extensions/core_refinements.rb +8 -8
- data/lib/sequel/extensions/date_arithmetic.rb +1 -1
- data/lib/sequel/extensions/datetime_parse_to_time.rb +2 -2
- data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -2
- data/lib/sequel/extensions/graph_each.rb +1 -1
- data/lib/sequel/extensions/index_caching.rb +1 -1
- data/lib/sequel/extensions/inflector.rb +5 -5
- data/lib/sequel/extensions/is_distinct_from.rb +2 -2
- data/lib/sequel/extensions/lit_require_frozen.rb +3 -3
- data/lib/sequel/extensions/migration.rb +21 -7
- data/lib/sequel/extensions/named_timezones.rb +8 -8
- data/lib/sequel/extensions/pg_array.rb +9 -8
- data/lib/sequel/extensions/pg_array_ops.rb +69 -14
- data/lib/sequel/extensions/pg_auto_parameterize.rb +2 -2
- data/lib/sequel/extensions/pg_auto_parameterize_in_array.rb +3 -3
- data/lib/sequel/extensions/pg_enum.rb +2 -2
- data/lib/sequel/extensions/pg_extended_date_support.rb +5 -5
- data/lib/sequel/extensions/pg_extended_integer_support.rb +1 -1
- data/lib/sequel/extensions/pg_hstore.rb +2 -2
- data/lib/sequel/extensions/pg_hstore_ops.rb +5 -5
- data/lib/sequel/extensions/pg_inet.rb +2 -2
- data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
- data/lib/sequel/extensions/pg_interval.rb +6 -6
- data/lib/sequel/extensions/pg_json.rb +4 -4
- data/lib/sequel/extensions/pg_json_ops.rb +11 -11
- data/lib/sequel/extensions/pg_range.rb +6 -6
- data/lib/sequel/extensions/pg_range_ops.rb +7 -7
- data/lib/sequel/extensions/pg_row.rb +4 -4
- data/lib/sequel/extensions/pg_row_ops.rb +6 -6
- data/lib/sequel/extensions/provenance.rb +2 -2
- data/lib/sequel/extensions/query.rb +2 -2
- data/lib/sequel/extensions/s.rb +2 -2
- data/lib/sequel/extensions/schema_dumper.rb +4 -4
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +2 -0
- data/lib/sequel/extensions/sql_comments.rb +1 -1
- data/lib/sequel/extensions/sql_log_normalizer.rb +1 -1
- data/lib/sequel/extensions/sqlite_json_ops.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +5 -5
- data/lib/sequel/extensions/symbol_aref.rb +3 -3
- data/lib/sequel/extensions/symbol_aref_refinement.rb +3 -3
- data/lib/sequel/extensions/symbol_as_refinement.rb +2 -2
- data/lib/sequel/extensions/transaction_connection_validator.rb +1 -1
- data/lib/sequel/model/associations.rb +17 -17
- data/lib/sequel/model/base.rb +19 -11
- data/lib/sequel/model/inflections.rb +1 -1
- data/lib/sequel/model/plugins.rb +2 -2
- data/lib/sequel/model.rb +2 -2
- data/lib/sequel/plugins/association_pks.rb +1 -1
- data/lib/sequel/plugins/association_proxies.rb +4 -4
- data/lib/sequel/plugins/auto_restrict_eager_graph.rb +2 -0
- data/lib/sequel/plugins/caching.rb +1 -1
- data/lib/sequel/plugins/class_table_inheritance.rb +1 -1
- data/lib/sequel/plugins/column_encryption.rb +10 -10
- data/lib/sequel/plugins/concurrent_eager_loading.rb +2 -2
- data/lib/sequel/plugins/csv_serializer.rb +2 -2
- data/lib/sequel/plugins/deprecated_associations.rb +2 -2
- data/lib/sequel/plugins/eager_each.rb +1 -1
- data/lib/sequel/plugins/finder.rb +1 -1
- data/lib/sequel/plugins/forbid_lazy_load.rb +3 -3
- data/lib/sequel/plugins/insert_conflict.rb +1 -1
- data/lib/sequel/plugins/insert_returning_select.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +4 -4
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/many_through_many.rb +1 -1
- data/lib/sequel/plugins/pg_array_associations.rb +4 -4
- data/lib/sequel/plugins/pg_auto_constraint_validations.rb +3 -3
- data/lib/sequel/plugins/pg_eager_any_typed_array.rb +2 -2
- data/lib/sequel/plugins/prepared_statements.rb +2 -2
- data/lib/sequel/plugins/serialization.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
- data/lib/sequel/plugins/skip_saving_columns.rb +2 -2
- data/lib/sequel/plugins/split_values.rb +1 -1
- data/lib/sequel/plugins/sql_comments.rb +8 -8
- data/lib/sequel/plugins/subclasses.rb +6 -6
- data/lib/sequel/plugins/subset_conditions.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +1 -1
- data/lib/sequel/plugins/throw_failures.rb +2 -2
- data/lib/sequel/plugins/unused_associations.rb +5 -5
- data/lib/sequel/plugins/validation_helpers.rb +1 -1
- data/lib/sequel/plugins/xml_serializer.rb +2 -0
- data/lib/sequel/sql.rb +11 -11
- data/lib/sequel/version.rb +1 -1
- metadata +1 -1
|
@@ -383,7 +383,7 @@ module Sequel
|
|
|
383
383
|
end
|
|
384
384
|
|
|
385
385
|
# Finalize the association by first attempting to populate the thread-safe cache,
|
|
386
|
-
# and then
|
|
386
|
+
# and then transferring the thread-safe cache value to the association itself,
|
|
387
387
|
# so that a mutex is not needed to get the value.
|
|
388
388
|
def finalize
|
|
389
389
|
return unless cache = self[:cache]
|
|
@@ -1174,7 +1174,7 @@ module Sequel
|
|
|
1174
1174
|
private
|
|
1175
1175
|
|
|
1176
1176
|
# Use a correlated subquery to limit the dataset. Note that this will not
|
|
1177
|
-
# work correctly if the associated dataset uses qualified
|
|
1177
|
+
# work correctly if the associated dataset uses qualified identifiers in the WHERE clause,
|
|
1178
1178
|
# as they would reference the containing query instead of the subquery.
|
|
1179
1179
|
def apply_correlated_subquery_limit_strategy(ds)
|
|
1180
1180
|
table = ds.first_source_table
|
|
@@ -1191,7 +1191,7 @@ module Sequel
|
|
|
1191
1191
|
end
|
|
1192
1192
|
|
|
1193
1193
|
# Use a LATERAL subquery to limit the dataset. Note that this will not
|
|
1194
|
-
# work correctly if the associated dataset uses qualified
|
|
1194
|
+
# work correctly if the associated dataset uses qualified identifiers in the WHERE clause,
|
|
1195
1195
|
# as they would reference the containing query instead of the subquery.
|
|
1196
1196
|
#
|
|
1197
1197
|
# This does not contain the conditions that are necessary to join to the
|
|
@@ -1821,7 +1821,7 @@ module Sequel
|
|
|
1821
1821
|
# The following options can be supplied:
|
|
1822
1822
|
# === Multiple Types
|
|
1823
1823
|
# :adder :: Proc used to define the private _add_* method for doing the database work
|
|
1824
|
-
# to associate the given object to the current object (*_to_many
|
|
1824
|
+
# to associate the given object to the current object (*_to_many associations).
|
|
1825
1825
|
# Set to nil to not define a add_* method for the association.
|
|
1826
1826
|
# :after_add :: Symbol, Proc, or array of both/either specifying a callback to call
|
|
1827
1827
|
# after a new item is added to the association.
|
|
@@ -1852,7 +1852,7 @@ module Sequel
|
|
|
1852
1852
|
# :class_namespace :: If :class is given as a string or symbol, sets the default namespace in which to look for
|
|
1853
1853
|
# the class. <tt>class: 'Foo', class_namespace: 'Bar'</tt> looks for <tt>::Bar::Foo</tt>.)
|
|
1854
1854
|
# :clearer :: Proc used to define the private _remove_all_* method for doing the database work
|
|
1855
|
-
# to remove all objects associated to the current object (*_to_many
|
|
1855
|
+
# to remove all objects associated to the current object (*_to_many associations).
|
|
1856
1856
|
# Set to nil to not define a remove_all_* method for the association.
|
|
1857
1857
|
# :clone :: Merge the current options and block into the options and block used in defining
|
|
1858
1858
|
# the given association. Can be used to DRY up a bunch of similar associations that
|
|
@@ -1939,10 +1939,10 @@ module Sequel
|
|
|
1939
1939
|
# or add_/remove_/remove_all_ methods (for one_to_many and many_to_many associations).
|
|
1940
1940
|
# :reciprocal :: the symbol name of the reciprocal association,
|
|
1941
1941
|
# if it exists. By default, Sequel will try to determine it by looking at the
|
|
1942
|
-
# associated model's
|
|
1942
|
+
# associated model's associations for a association that matches
|
|
1943
1943
|
# the current association's key(s). Set to nil to not use a reciprocal.
|
|
1944
1944
|
# :remover :: Proc used to define the private _remove_* method for doing the database work
|
|
1945
|
-
# to remove the association between the given object and the current object (*_to_many
|
|
1945
|
+
# to remove the association between the given object and the current object (*_to_many associations).
|
|
1946
1946
|
# Set to nil to not define a remove_* method for the association.
|
|
1947
1947
|
# :select :: the columns to select. Defaults to the associated class's table_name.* in an association
|
|
1948
1948
|
# that uses joins, which means it doesn't include the attributes from the
|
|
@@ -1950,7 +1950,7 @@ module Sequel
|
|
|
1950
1950
|
# use this option, but beware that the join table attributes can clash with
|
|
1951
1951
|
# attributes from the model table, so you should alias any attributes that have
|
|
1952
1952
|
# the same name in both the join table and the associated table.
|
|
1953
|
-
# :setter :: Proc used to define the private _*= method for doing the work to setup the
|
|
1953
|
+
# :setter :: Proc used to define the private _*= method for doing the work to setup the association
|
|
1954
1954
|
# between the given object and the current object (*_to_one associations).
|
|
1955
1955
|
# Set to nil to not define a setter method for the association.
|
|
1956
1956
|
# :subqueries_per_union :: The number of subqueries to use in each UNION query, for eager
|
|
@@ -2208,9 +2208,9 @@ module Sequel
|
|
|
2208
2208
|
def association_module_delegate_def(name, opts, &block)
|
|
2209
2209
|
mod = association_module(opts)
|
|
2210
2210
|
mod.send(:define_method, name, &block)
|
|
2211
|
-
# :
|
|
2211
|
+
# simplecov:disable
|
|
2212
2212
|
mod.send(:ruby2_keywords, name) if mod.respond_to?(:ruby2_keywords, true)
|
|
2213
|
-
# :
|
|
2213
|
+
# simplecov:enable
|
|
2214
2214
|
mod.send(:alias_method, name, name)
|
|
2215
2215
|
end
|
|
2216
2216
|
|
|
@@ -2819,9 +2819,9 @@ module Sequel
|
|
|
2819
2819
|
run_association_callbacks(opts, :after_add, o)
|
|
2820
2820
|
o
|
|
2821
2821
|
end
|
|
2822
|
-
# :
|
|
2822
|
+
# simplecov:disable
|
|
2823
2823
|
ruby2_keywords(:add_associated_object) if respond_to?(:ruby2_keywords, true)
|
|
2824
|
-
# :
|
|
2824
|
+
# simplecov:enable
|
|
2825
2825
|
|
|
2826
2826
|
# Add/Set the current object to/as the given object's reciprocal association.
|
|
2827
2827
|
def add_reciprocal_object(opts, o)
|
|
@@ -2964,9 +2964,9 @@ module Sequel
|
|
|
2964
2964
|
associations[opts[:name]] = []
|
|
2965
2965
|
ret
|
|
2966
2966
|
end
|
|
2967
|
-
# :
|
|
2967
|
+
# simplecov:disable
|
|
2968
2968
|
ruby2_keywords(:remove_all_associated_objects) if respond_to?(:ruby2_keywords, true)
|
|
2969
|
-
# :
|
|
2969
|
+
# simplecov:enable
|
|
2970
2970
|
|
|
2971
2971
|
# Remove the given associated object from the given association
|
|
2972
2972
|
def remove_associated_object(opts, o, *args)
|
|
@@ -2988,9 +2988,9 @@ module Sequel
|
|
|
2988
2988
|
run_association_callbacks(opts, :after_remove, o)
|
|
2989
2989
|
o
|
|
2990
2990
|
end
|
|
2991
|
-
# :
|
|
2991
|
+
# simplecov:disable
|
|
2992
2992
|
ruby2_keywords(:remove_associated_object) if respond_to?(:ruby2_keywords, true)
|
|
2993
|
-
# :
|
|
2993
|
+
# simplecov:enable
|
|
2994
2994
|
|
|
2995
2995
|
# Check that the object from the associated table specified by the primary key
|
|
2996
2996
|
# is currently associated to the receiver. If it is associated, return the object, otherwise
|
|
@@ -3476,7 +3476,7 @@ module Sequel
|
|
|
3476
3476
|
# :limit_strategy :: Use a strategy for handling limits on associations.
|
|
3477
3477
|
# Appropriate :limit_strategy values are:
|
|
3478
3478
|
# true :: Pick the most appropriate based on what the database supports
|
|
3479
|
-
# :distinct_on :: Force use of DISTINCT ON
|
|
3479
|
+
# :distinct_on :: Force use of DISTINCT ON strategy (*_one associations only)
|
|
3480
3480
|
# :correlated_subquery :: Force use of correlated subquery strategy (one_to_* associations only)
|
|
3481
3481
|
# :window_function :: Force use of window function strategy
|
|
3482
3482
|
# :ruby :: Don't modify the SQL, implement limits/offsets with array slicing
|
data/lib/sequel/model/base.rb
CHANGED
|
@@ -518,9 +518,9 @@ module Sequel
|
|
|
518
518
|
|
|
519
519
|
m.configure(self, *args, &block) if m.respond_to?(:configure)
|
|
520
520
|
end
|
|
521
|
-
# :
|
|
521
|
+
# simplecov:disable
|
|
522
522
|
ruby2_keywords(:plugin) if respond_to?(:ruby2_keywords, true)
|
|
523
|
-
# :
|
|
523
|
+
# simplecov:enable
|
|
524
524
|
|
|
525
525
|
# Returns primary key attribute hash. If using a composite primary key
|
|
526
526
|
# value such be an array with values for each primary key in the correct
|
|
@@ -828,9 +828,9 @@ ruby2_keywords :#{meth} if respond_to?(:ruby2_keywords, true)
|
|
|
828
828
|
END
|
|
829
829
|
else
|
|
830
830
|
mod.send(:define_method, meth){|*args, &block| dataset.public_send(meth, *args, &block)}
|
|
831
|
-
# :
|
|
831
|
+
# simplecov:disable
|
|
832
832
|
mod.send(:ruby2_keywords, meth) if respond_to?(:ruby2_keywords, true)
|
|
833
|
-
# :
|
|
833
|
+
# simplecov:enable
|
|
834
834
|
end
|
|
835
835
|
mod.send(:alias_method, meth, meth)
|
|
836
836
|
end
|
|
@@ -1830,7 +1830,7 @@ END
|
|
|
1830
1830
|
end
|
|
1831
1831
|
end
|
|
1832
1832
|
|
|
1833
|
-
# Internal destroy method,
|
|
1833
|
+
# Internal destroy method, separated from destroy to
|
|
1834
1834
|
# allow running inside a transaction
|
|
1835
1835
|
def _destroy(opts)
|
|
1836
1836
|
called = false
|
|
@@ -1943,7 +1943,7 @@ END
|
|
|
1943
1943
|
columns = opts[:columns]
|
|
1944
1944
|
if columns.nil?
|
|
1945
1945
|
columns_updated = if opts[:changed]
|
|
1946
|
-
|
|
1946
|
+
_save_update_changed_columns_hash
|
|
1947
1947
|
else
|
|
1948
1948
|
_save_update_all_columns_hash
|
|
1949
1949
|
end
|
|
@@ -1995,10 +1995,18 @@ END
|
|
|
1995
1995
|
v
|
|
1996
1996
|
end
|
|
1997
1997
|
|
|
1998
|
+
def _save_update_changed_colums_hash # :nodoc:
|
|
1999
|
+
# SEQUEL6: Remove
|
|
2000
|
+
# simplecov:disable
|
|
2001
|
+
Sequel::Deprecation.deprecate("Model#_save_update_changed_colums_hash", "Use #_save_update_changed_columns_hash instead")
|
|
2002
|
+
_save_update_changed_columns_hash
|
|
2003
|
+
# simplecov:enable
|
|
2004
|
+
end
|
|
2005
|
+
|
|
1998
2006
|
# Return a hash of values used when saving changed columns of an
|
|
1999
2007
|
# existing object. Defaults to all of the objects current values
|
|
2000
2008
|
# that are recorded as modified.
|
|
2001
|
-
def
|
|
2009
|
+
def _save_update_changed_columns_hash
|
|
2002
2010
|
cc = changed_columns
|
|
2003
2011
|
@values.reject{|k,v| !cc.include?(k)}
|
|
2004
2012
|
end
|
|
@@ -2426,13 +2434,13 @@ END
|
|
|
2426
2434
|
def_initialize_nil_instance_variables
|
|
2427
2435
|
|
|
2428
2436
|
singleton_class.send(:undef_method, :dup, :clone, :initialize_copy)
|
|
2429
|
-
# :
|
|
2437
|
+
# simplecov:disable
|
|
2430
2438
|
if RUBY_VERSION >= '1.9.3'
|
|
2431
|
-
# :
|
|
2439
|
+
# simplecov:enable
|
|
2432
2440
|
singleton_class.send(:undef_method, :initialize_clone, :initialize_dup)
|
|
2433
2441
|
end
|
|
2434
2442
|
|
|
2435
|
-
# :
|
|
2443
|
+
# simplecov:disable
|
|
2436
2444
|
if defined?(Sequel::Postgres::SEQUEL_PG_VERSION_INTEGER) && Sequel::Postgres::SEQUEL_PG_VERSION_INTEGER >= 11800
|
|
2437
2445
|
# Automatically optimize model loading when sequel/core was loaded,
|
|
2438
2446
|
# then sequel/adapters/postgres (with sequel_pg), then sequel/model
|
|
@@ -2442,6 +2450,6 @@ END
|
|
|
2442
2450
|
# nothing
|
|
2443
2451
|
end
|
|
2444
2452
|
end
|
|
2445
|
-
# :
|
|
2453
|
+
# simplecov:enable
|
|
2446
2454
|
end
|
|
2447
2455
|
end
|
|
@@ -28,7 +28,7 @@ module Sequel
|
|
|
28
28
|
@plurals, @singulars, @uncountables = [], [], []
|
|
29
29
|
|
|
30
30
|
class << self
|
|
31
|
-
# Array of two element arrays, first containing a regex, and the second containing a substitution pattern, used for
|
|
31
|
+
# Array of two element arrays, first containing a regex, and the second containing a substitution pattern, used for pluralization.
|
|
32
32
|
attr_reader :plurals
|
|
33
33
|
|
|
34
34
|
# Array of two element arrays, first containing a regex, and the second containing a substitution pattern, used for singularization.
|
data/lib/sequel/model/plugins.rb
CHANGED
|
@@ -31,9 +31,9 @@ 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
|
-
# :
|
|
34
|
+
# simplecov:disable
|
|
35
35
|
mod.send(:ruby2_keywords, meth) if respond_to?(:ruby2_keywords, true)
|
|
36
|
-
# :
|
|
36
|
+
# simplecov:enable
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
|
data/lib/sequel/model.rb
CHANGED
|
@@ -70,9 +70,9 @@ module Sequel
|
|
|
70
70
|
require_relative "model/base"
|
|
71
71
|
require_relative "model/exceptions"
|
|
72
72
|
require_relative "model/errors"
|
|
73
|
-
# :
|
|
73
|
+
# simplecov:disable
|
|
74
74
|
if !defined?(::SEQUEL_NO_ASSOCIATIONS) && !ENV.has_key?('SEQUEL_NO_ASSOCIATIONS')
|
|
75
|
-
# :
|
|
75
|
+
# simplecov:enable
|
|
76
76
|
require_relative 'model/associations'
|
|
77
77
|
plugin Model::Associations
|
|
78
78
|
end
|
|
@@ -20,7 +20,7 @@ module Sequel
|
|
|
20
20
|
# # Persist changes
|
|
21
21
|
#
|
|
22
22
|
# Note that it uses the singular form of the association name. Also note
|
|
23
|
-
# that the setter both associates to new primary keys not in the
|
|
23
|
+
# that the setter both associates to new primary keys not in the association
|
|
24
24
|
# and disassociates from primary keys not provided to the method.
|
|
25
25
|
#
|
|
26
26
|
# This plugin makes modifications directly to the underlying tables,
|
|
@@ -64,7 +64,7 @@ module Sequel
|
|
|
64
64
|
array = [].freeze
|
|
65
65
|
|
|
66
66
|
if RUBY_VERSION < '2.6'
|
|
67
|
-
# :
|
|
67
|
+
# simplecov:disable
|
|
68
68
|
|
|
69
69
|
# Default proc used to determine whether to send the method to the dataset.
|
|
70
70
|
# If the array would respond to it, sends it to the array instead of the dataset.
|
|
@@ -75,7 +75,7 @@ module Sequel
|
|
|
75
75
|
end
|
|
76
76
|
!array_method
|
|
77
77
|
end
|
|
78
|
-
# :
|
|
78
|
+
# simplecov:enable
|
|
79
79
|
else
|
|
80
80
|
DEFAULT_PROXY_TO_DATASET = proc{|opts| !array.respond_to?(opts[:method])}
|
|
81
81
|
end
|
|
@@ -99,9 +99,9 @@ module Sequel
|
|
|
99
99
|
end
|
|
100
100
|
v.public_send(meth, *args, &block)
|
|
101
101
|
end
|
|
102
|
-
# :
|
|
102
|
+
# simplecov:disable
|
|
103
103
|
ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
|
|
104
|
-
# :
|
|
104
|
+
# simplecov:enable
|
|
105
105
|
end
|
|
106
106
|
|
|
107
107
|
module ClassMethods
|
|
@@ -53,7 +53,7 @@ module Sequel
|
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
module ClassMethods
|
|
56
|
-
# If true, ignores exceptions when
|
|
56
|
+
# If true, ignores exceptions when getting cached records (the memcached API).
|
|
57
57
|
attr_reader :cache_ignore_exceptions
|
|
58
58
|
|
|
59
59
|
# The cache store object for the model, which should implement the
|
|
@@ -79,7 +79,7 @@ module Sequel
|
|
|
79
79
|
# subclass instances that only have column entries for the columns in the
|
|
80
80
|
# superclass table. Calling the column method on the subclass instance for
|
|
81
81
|
# a column not in the superclass table will cause a query to the database
|
|
82
|
-
# to get the value for that column. If the subclass instance was
|
|
82
|
+
# to get the value for that column. If the subclass instance was retrieved
|
|
83
83
|
# using Dataset#all, the query to the database will attempt to load the column
|
|
84
84
|
# values for all subclass instances that were retrieved. For example:
|
|
85
85
|
#
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
2
|
|
|
3
|
-
# :
|
|
3
|
+
# simplecov:disable
|
|
4
4
|
raise(Sequel::Error, "Sequel column_encryption plugin requires ruby 2.3 or greater") unless RUBY_VERSION >= '2.3'
|
|
5
|
-
# :
|
|
5
|
+
# simplecov:enable
|
|
6
6
|
|
|
7
7
|
require 'openssl'
|
|
8
8
|
|
|
@@ -22,13 +22,13 @@ begin
|
|
|
22
22
|
cipher.key = '1'*32
|
|
23
23
|
cipher.auth_data = ''
|
|
24
24
|
cipher.auth_tag = auth_tag
|
|
25
|
-
# :
|
|
25
|
+
# simplecov:disable
|
|
26
26
|
unless (cipher.update(cipher_text) << cipher.final) == '2'
|
|
27
27
|
raise OpenSSL::Cipher::CipherError
|
|
28
28
|
end
|
|
29
29
|
rescue RuntimeError, OpenSSL::Cipher::CipherError
|
|
30
30
|
raise LoadError, "Sequel column_encryption plugin requires a working aes-256-gcm cipher"
|
|
31
|
-
# :
|
|
31
|
+
# simplecov:enable
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
require 'securerandom'
|
|
@@ -279,7 +279,7 @@ module Sequel
|
|
|
279
279
|
#
|
|
280
280
|
# = Unsupported Features
|
|
281
281
|
#
|
|
282
|
-
# The following features are
|
|
282
|
+
# The following features are deliberately not supported:
|
|
283
283
|
#
|
|
284
284
|
# == Compression
|
|
285
285
|
#
|
|
@@ -475,12 +475,12 @@ module Sequel
|
|
|
475
475
|
def decode64(str)
|
|
476
476
|
str.unpack1("m0")
|
|
477
477
|
end
|
|
478
|
-
# :
|
|
478
|
+
# simplecov:disable
|
|
479
479
|
else
|
|
480
480
|
def decode64(str)
|
|
481
481
|
str.unpack("m0")[0]
|
|
482
482
|
end
|
|
483
|
-
# :
|
|
483
|
+
# simplecov:enable
|
|
484
484
|
end
|
|
485
485
|
|
|
486
486
|
def urlsafe_encode64(bin)
|
|
@@ -493,7 +493,7 @@ module Sequel
|
|
|
493
493
|
decode64(str.tr("-_", "+/"))
|
|
494
494
|
end
|
|
495
495
|
|
|
496
|
-
# An array of strings, one for each configured encryption key, to find
|
|
496
|
+
# An array of strings, one for each configured encryption key, to find encrypted values matching
|
|
497
497
|
# the given data and search format.
|
|
498
498
|
def _search_prefixes(data, search_type)
|
|
499
499
|
@key_map.map do |key_id, (key, _)|
|
|
@@ -610,7 +610,7 @@ module Sequel
|
|
|
610
610
|
end
|
|
611
611
|
end
|
|
612
612
|
|
|
613
|
-
# This stores four callables for handling
|
|
613
|
+
# This stores four callables for handling encryption, decryption, data searching,
|
|
614
614
|
# and key searching. One of these is created for each encrypted column.
|
|
615
615
|
ColumnEncryptionMetadata = Struct.new(:encryptor, :decryptor, :data_searcher, :key_searcher) # :nodoc:
|
|
616
616
|
|
|
@@ -702,7 +702,7 @@ module Sequel
|
|
|
702
702
|
|
|
703
703
|
module InstanceMethods
|
|
704
704
|
# Reencrypt the model if needed. Looks at all of the models encrypted columns
|
|
705
|
-
# and if any were
|
|
705
|
+
# and if any were encrypted with older keys or a different format, reencrypt
|
|
706
706
|
# with the current key and format and save the object. Returns the object
|
|
707
707
|
# if reencryption was needed, or nil if reencryption was not needed.
|
|
708
708
|
def reencrypt
|
|
@@ -69,8 +69,8 @@ module Sequel
|
|
|
69
69
|
# To keep things simple, you can use +Sequel.synchronize_with+ to only
|
|
70
70
|
# use this mutex if it is available. You want to use the mutex around the
|
|
71
71
|
# code that initializes the associations (usually to +nil+ or <tt>[]</tt>),
|
|
72
|
-
# and also around the code that sets the
|
|
73
|
-
# after they have been
|
|
72
|
+
# and also around the code that sets the associated objects appropriately
|
|
73
|
+
# after they have been retrieved. You do not want to use the mutex around
|
|
74
74
|
# the code that loads the objects, since that will prevent concurrent loading.
|
|
75
75
|
# So after the changes, the custom eager loader would look like this:
|
|
76
76
|
#
|
|
@@ -82,13 +82,13 @@ module Sequel
|
|
|
82
82
|
end
|
|
83
83
|
END
|
|
84
84
|
else
|
|
85
|
-
# :
|
|
85
|
+
# simplecov:disable
|
|
86
86
|
# :nodoc:
|
|
87
87
|
def self.csv_call(*args, opts, &block)
|
|
88
88
|
CSV.send(*args, opts, &block)
|
|
89
89
|
end
|
|
90
90
|
# :nodoc:
|
|
91
|
-
# :
|
|
91
|
+
# simplecov:enable
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
module ClassMethods
|
|
@@ -77,7 +77,7 @@ module Sequel
|
|
|
77
77
|
|
|
78
78
|
private
|
|
79
79
|
|
|
80
|
-
#
|
|
80
|
+
# Whether to use all when each is called, true when eager loading
|
|
81
81
|
# unless the flag has already been set.
|
|
82
82
|
def use_eager_all?
|
|
83
83
|
(opts[:eager] || opts[:eager_graph]) && !opts[:all_called]
|
|
@@ -237,7 +237,7 @@ module Sequel
|
|
|
237
237
|
end
|
|
238
238
|
end
|
|
239
239
|
|
|
240
|
-
# Clear any finders when
|
|
240
|
+
# Clear any finders when resetting the instance dataset
|
|
241
241
|
def reset_instance_dataset
|
|
242
242
|
Sequel.synchronize{@finders.clear} if @finders && !@finders.frozen?
|
|
243
243
|
super
|
|
@@ -9,7 +9,7 @@ module Sequel
|
|
|
9
9
|
# The main reason for doing this is it makes it easier to detect
|
|
10
10
|
# N+1 query issues. Note that Sequel also offers a
|
|
11
11
|
# tactical_eager_loading plugin which will automatically eagerly
|
|
12
|
-
# load associations for all objects
|
|
12
|
+
# load associations for all objects retrieved in the same query
|
|
13
13
|
# if any object would attempt to lazily load an association. That
|
|
14
14
|
# approach may be simpler if you are trying to prevent N+1 issues,
|
|
15
15
|
# though it does retain more objects in memory.
|
|
@@ -125,9 +125,9 @@ module Sequel
|
|
|
125
125
|
# an association, allow lazy loading that association, since the
|
|
126
126
|
# lazy association load will use a hash table lookup and not a query.
|
|
127
127
|
def allow_lazy_load_for_static_cache_associations
|
|
128
|
-
# :
|
|
128
|
+
# simplecov:disable
|
|
129
129
|
if defined?(::Sequel::Plugins::StaticCache::ClassMethods)
|
|
130
|
-
# :
|
|
130
|
+
# simplecov:enable
|
|
131
131
|
@association_reflections.each_value do |ref|
|
|
132
132
|
if ref.associated_class.is_a?(::Sequel::Plugins::StaticCache::ClassMethods)
|
|
133
133
|
ref[:forbid_lazy_load] = false
|
|
@@ -19,7 +19,7 @@ module Sequel
|
|
|
19
19
|
#
|
|
20
20
|
# This example will try to insert the album, but if there is an existing
|
|
21
21
|
# album with the name 'Foo', this will update the copies_sold attribute
|
|
22
|
-
# for that album. See the PostgreSQL and SQLite adapter
|
|
22
|
+
# for that album. See the PostgreSQL and SQLite adapter documentation for
|
|
23
23
|
# the options you can pass to the insert_conflict method.
|
|
24
24
|
#
|
|
25
25
|
# You should not attempt to use this plugin to ignore conflicts when
|
|
@@ -32,7 +32,7 @@ module Sequel
|
|
|
32
32
|
|
|
33
33
|
private
|
|
34
34
|
|
|
35
|
-
# When
|
|
35
|
+
# When resetting the instance dataset, also reset the instance_insert_dataset.
|
|
36
36
|
def reset_instance_dataset
|
|
37
37
|
ret = super
|
|
38
38
|
return unless ds = @instance_dataset
|
|
@@ -128,7 +128,7 @@ module Sequel
|
|
|
128
128
|
end
|
|
129
129
|
|
|
130
130
|
# SEQUEL6: Remove
|
|
131
|
-
# :
|
|
131
|
+
# simplecov:disable
|
|
132
132
|
class Literal
|
|
133
133
|
def initialize(json)
|
|
134
134
|
@json = json
|
|
@@ -138,7 +138,7 @@ module Sequel
|
|
|
138
138
|
@json
|
|
139
139
|
end
|
|
140
140
|
end
|
|
141
|
-
# :
|
|
141
|
+
# simplecov:enable
|
|
142
142
|
Sequel::Deprecation.deprecate_constant(self, :Literal)
|
|
143
143
|
|
|
144
144
|
# Convert the given object to a JSON data structure using the given arguments.
|
|
@@ -151,11 +151,11 @@ module Sequel
|
|
|
151
151
|
else
|
|
152
152
|
begin
|
|
153
153
|
Sequel.parse_json(Sequel.object_to_json(obj, *args, &block))
|
|
154
|
-
# :
|
|
154
|
+
# simplecov:disable
|
|
155
155
|
rescue Sequel.json_parser_error_class
|
|
156
156
|
# Support for old Ruby code that only supports parsing JSON object/array
|
|
157
157
|
Sequel.parse_json(Sequel.object_to_json([obj], *args, &block))[0]
|
|
158
|
-
# :
|
|
158
|
+
# simplecov:enable
|
|
159
159
|
end
|
|
160
160
|
end
|
|
161
161
|
end
|
|
@@ -5,7 +5,7 @@ module Sequel
|
|
|
5
5
|
# The lazy_attributes plugin allows users to easily set that some attributes
|
|
6
6
|
# should not be loaded by default when loading model objects. If the attribute
|
|
7
7
|
# is needed after the instance has been retrieved, a database query is made to
|
|
8
|
-
#
|
|
8
|
+
# retrieve the value of the attribute.
|
|
9
9
|
#
|
|
10
10
|
# This plugin depends on the tactical_eager_loading plugin, and allows you to
|
|
11
11
|
# eagerly load lazy attributes for all objects retrieved with the current object.
|
|
@@ -243,7 +243,7 @@ module Sequel
|
|
|
243
243
|
# :conditions :: Extra conditions to add to the JOIN ON clause. Must be a hash or array of two pairs.
|
|
244
244
|
# :join_type :: The join type to use for the join, defaults to :left_outer.
|
|
245
245
|
# :only_conditions :: Conditions to use for the join instead of the ones specified by the keys.
|
|
246
|
-
# opts :: The options for the
|
|
246
|
+
# opts :: The options for the association. Takes the same options as many_to_many.
|
|
247
247
|
def many_through_many(name, through, opts=OPTS, &block)
|
|
248
248
|
associate(:many_through_many, name, opts.merge(through.is_a?(Hash) ? through : {:through=>through}), &block)
|
|
249
249
|
end
|
|
@@ -534,9 +534,9 @@ module Sequel
|
|
|
534
534
|
def many_to_pg_array_association_filter_expression(op, ref, obj)
|
|
535
535
|
pk = ref.qualify(model.table_name, ref.primary_key)
|
|
536
536
|
key = ref[:key]
|
|
537
|
-
# :
|
|
537
|
+
# simplecov:disable
|
|
538
538
|
expr = case obj
|
|
539
|
-
# :
|
|
539
|
+
# simplecov:enable
|
|
540
540
|
when Sequel::Model
|
|
541
541
|
if (assoc_pks = obj.get_column_value(key)) && !assoc_pks.empty?
|
|
542
542
|
Sequel[pk=>assoc_pks.to_a]
|
|
@@ -556,9 +556,9 @@ module Sequel
|
|
|
556
556
|
# Support filtering by pg_array_to_many associations using a subquery.
|
|
557
557
|
def pg_array_to_many_association_filter_expression(op, ref, obj)
|
|
558
558
|
key = ref.qualify(model.table_name, ref[:key_column])
|
|
559
|
-
# :
|
|
559
|
+
# simplecov:disable
|
|
560
560
|
expr = case obj
|
|
561
|
-
# :
|
|
561
|
+
# simplecov:enable
|
|
562
562
|
when Sequel::Model
|
|
563
563
|
if pkv = obj.get_column_value(ref.primary_key_method)
|
|
564
564
|
Sequel.pg_array_op(key).contains(Sequel.pg_array([pkv], ref.array_type))
|
|
@@ -261,9 +261,9 @@ module Sequel
|
|
|
261
261
|
messages = model.pg_auto_constraint_validations_messages
|
|
262
262
|
|
|
263
263
|
unless override
|
|
264
|
-
# :
|
|
264
|
+
# simplecov:disable
|
|
265
265
|
case e
|
|
266
|
-
# :
|
|
266
|
+
# simplecov:enable
|
|
267
267
|
when Sequel::NotNullConstraintViolation
|
|
268
268
|
if column = info[:column]
|
|
269
269
|
add_pg_constraint_validation_error([m.call(column)], messages[:not_null])
|
|
@@ -297,7 +297,7 @@ module Sequel
|
|
|
297
297
|
end
|
|
298
298
|
end
|
|
299
299
|
rescue
|
|
300
|
-
# If there is an error trying to
|
|
300
|
+
# If there is an error trying to convert the constraint violation
|
|
301
301
|
# into a validation failure, it's best to just raise the constraint
|
|
302
302
|
# violation. This can make debugging the above block of code more
|
|
303
303
|
# difficult.
|
|
@@ -45,7 +45,7 @@ module Sequel
|
|
|
45
45
|
key = key.column
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
# :
|
|
48
|
+
# simplecov:disable
|
|
49
49
|
# many_to_pg_array association type does not need changes, as it
|
|
50
50
|
# already converts the values to a typed postgres array, it does
|
|
51
51
|
# not call the code that uses :eager_loading_predicate_transform.
|
|
@@ -54,7 +54,7 @@ module Sequel
|
|
|
54
54
|
# unless it is one of these types, but external association types
|
|
55
55
|
# could potentially reach it.
|
|
56
56
|
sch = case ref[:type]
|
|
57
|
-
# :
|
|
57
|
+
# simplecov:enable
|
|
58
58
|
when :many_to_one, :one_to_one, :one_to_many, :pg_array_to_many
|
|
59
59
|
ref.associated_class.db_schema
|
|
60
60
|
when :many_to_many, :one_through_one
|
|
@@ -181,11 +181,11 @@ module Sequel
|
|
|
181
181
|
# Disabling usage of prepared statements for insert_select on SQLite seems to be the
|
|
182
182
|
# simplest way to workaround the problem.
|
|
183
183
|
db.database_type != :sqlite
|
|
184
|
-
# :
|
|
184
|
+
# simplecov:disable
|
|
185
185
|
when :delete, :refresh
|
|
186
186
|
Sequel::Deprecation.deprecate("The :delete and :refresh prepared statement types", "There should be no need to check if these types are supported")
|
|
187
187
|
false
|
|
188
|
-
# :
|
|
188
|
+
# simplecov:enable
|
|
189
189
|
else
|
|
190
190
|
raise Error, "unsupported type used: #{type.inspect}"
|
|
191
191
|
end
|
|
@@ -154,7 +154,7 @@ module Sequel
|
|
|
154
154
|
|
|
155
155
|
private
|
|
156
156
|
|
|
157
|
-
# Add serializated attribute
|
|
157
|
+
# Add serializated attribute accessor methods to the serialization_module
|
|
158
158
|
def define_serialized_attribute_accessor(serializer, deserializer, *columns)
|
|
159
159
|
m = self
|
|
160
160
|
include(@serialization_module ||= Sequel.set_temp_name(Module.new){"#{name}::@serialization_module"}) unless @serialization_module
|
|
@@ -6,7 +6,7 @@ module Sequel
|
|
|
6
6
|
# in the following ways:
|
|
7
7
|
#
|
|
8
8
|
# * It automatically saves model instances back to the
|
|
9
|
-
# shard they were
|
|
9
|
+
# shard they were retrieved from.
|
|
10
10
|
# * It makes model associations use the same shard as the model object.
|
|
11
11
|
# * It adds a slightly nicer API for creating model instances on
|
|
12
12
|
# specific shards.
|