sequel 5.106.0 → 5.109.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/amalgalite.rb +34 -8
- data/lib/sequel/adapters/ibmdb.rb +2 -2
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -1
- data/lib/sequel/adapters/jdbc/mssql.rb +28 -5
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
- data/lib/sequel/adapters/jdbc/postgresql.rb +14 -3
- data/lib/sequel/adapters/jdbc.rb +4 -3
- 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 +42 -39
- data/lib/sequel/adapters/shared/db2.rb +5 -2
- data/lib/sequel/adapters/shared/mssql.rb +11 -5
- data/lib/sequel/adapters/shared/mysql.rb +2 -2
- data/lib/sequel/adapters/shared/postgres.rb +80 -92
- data/lib/sequel/adapters/shared/sqlanywhere.rb +0 -32
- data/lib/sequel/adapters/shared/sqlite.rb +8 -7
- data/lib/sequel/adapters/sqlite.rb +13 -9
- data/lib/sequel/adapters/trilogy.rb +2 -1
- 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 +44 -24
- data/lib/sequel/database/connecting.rb +1 -1
- data/lib/sequel/database/features.rb +1 -1
- data/lib/sequel/database/misc.rb +6 -11
- data/lib/sequel/database/query.rb +2 -2
- data/lib/sequel/database/schema_generator.rb +7 -5
- data/lib/sequel/database/schema_methods.rb +2 -2
- data/lib/sequel/database/transactions.rb +5 -7
- data/lib/sequel/dataset/actions.rb +2 -2
- 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 +32 -13
- 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 +7 -10
- 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 +1 -3
- 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 +20 -4
- data/lib/sequel/extensions/migration.rb +21 -7
- data/lib/sequel/extensions/named_timezones.rb +9 -9
- data/lib/sequel/extensions/pg_array.rb +10 -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 +15 -13
- 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 +6 -10
- data/lib/sequel/extensions/schema_dumper.rb +10 -6
- 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 +12 -32
- data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -5
- data/lib/sequel/extensions/symbol_as.rb +1 -2
- data/lib/sequel/extensions/symbol_as_refinement.rb +1 -5
- data/lib/sequel/extensions/transaction_connection_validator.rb +1 -1
- data/lib/sequel/model/associations.rb +17 -17
- data/lib/sequel/model/base.rb +18 -15
- 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 +28 -3
- 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 +9 -20
- 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/instance_filters.rb +8 -0
- data/lib/sequel/plugins/instance_hooks.rb +19 -0
- 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/mssql_optimistic_locking.rb +9 -0
- data/lib/sequel/plugins/optimistic_locking.rb +12 -2
- data/lib/sequel/plugins/optimistic_locking_base.rb +14 -0
- 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/pg_xmin_optimistic_locking.rb +11 -2
- data/lib/sequel/plugins/prepared_statements.rb +2 -2
- data/lib/sequel/plugins/select_on_skipped_update.rb +63 -0
- data/lib/sequel/plugins/serialization.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +21 -3
- 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 +5 -16
- data/lib/sequel/plugins/tactical_eager_loading.rb +1 -1
- data/lib/sequel/plugins/throw_failures.rb +3 -3
- data/lib/sequel/plugins/unused_associations.rb +5 -5
- data/lib/sequel/plugins/validate_associated.rb +7 -1
- data/lib/sequel/plugins/validate_associated_context.rb +52 -0
- data/lib/sequel/plugins/validation_helpers.rb +1 -1
- data/lib/sequel/plugins/xml_serializer.rb +2 -0
- data/lib/sequel/sql.rb +120 -116
- data/lib/sequel/version.rb +1 -1
- metadata +5 -3
|
@@ -247,9 +247,9 @@ module Sequel
|
|
|
247
247
|
if skip(/\)/)
|
|
248
248
|
values << nil
|
|
249
249
|
else
|
|
250
|
-
# :
|
|
250
|
+
# simplecov:disable
|
|
251
251
|
until eos?
|
|
252
|
-
# :
|
|
252
|
+
# simplecov:enable
|
|
253
253
|
if skip(/"/)
|
|
254
254
|
values << scan(/(\\.|""|[^"])*/).gsub(/\\(.)|"(")/, '\1\2')
|
|
255
255
|
skip(/"[,)]/)
|
|
@@ -563,7 +563,7 @@ module Sequel
|
|
|
563
563
|
Database.register_extension(:pg_row, Postgres::PGRow::DatabaseMethods)
|
|
564
564
|
end
|
|
565
565
|
|
|
566
|
-
# :
|
|
566
|
+
# simplecov:disable
|
|
567
567
|
if Sequel.core_extensions?
|
|
568
568
|
class Array
|
|
569
569
|
# Wraps the receiver in an anonymous Sequel::Postgres::PGRow::ArrayRow instance.
|
|
@@ -582,4 +582,4 @@ if defined?(Sequel::CoreRefinements)
|
|
|
582
582
|
end
|
|
583
583
|
end
|
|
584
584
|
end
|
|
585
|
-
# :
|
|
585
|
+
# simplecov:enable
|
|
@@ -159,9 +159,9 @@ module Sequel
|
|
|
159
159
|
end
|
|
160
160
|
end
|
|
161
161
|
|
|
162
|
-
# :
|
|
162
|
+
# simplecov:disable
|
|
163
163
|
if defined?(PGRow::ArrayRow)
|
|
164
|
-
# :
|
|
164
|
+
# simplecov:enable
|
|
165
165
|
class PGRow::ArrayRow
|
|
166
166
|
# Wrap the PGRow::ArrayRow instance in an PGRowOp, allowing you to easily use
|
|
167
167
|
# the PostgreSQL row functions and operators with literal rows.
|
|
@@ -171,9 +171,9 @@ module Sequel
|
|
|
171
171
|
end
|
|
172
172
|
end
|
|
173
173
|
|
|
174
|
-
# :
|
|
174
|
+
# simplecov:disable
|
|
175
175
|
if defined?(PGRow::HashRow)
|
|
176
|
-
# :
|
|
176
|
+
# simplecov:enable
|
|
177
177
|
class PGRow::HashRow
|
|
178
178
|
# Wrap the PGRow::ArrayRow instance in an PGRowOp, allowing you to easily use
|
|
179
179
|
# the PostgreSQL row functions and operators with literal rows.
|
|
@@ -200,7 +200,7 @@ module Sequel
|
|
|
200
200
|
end
|
|
201
201
|
end
|
|
202
202
|
|
|
203
|
-
# :
|
|
203
|
+
# simplecov:disable
|
|
204
204
|
if Sequel.core_extensions?
|
|
205
205
|
class Symbol
|
|
206
206
|
include Sequel::Postgres::PGRowOp::ExpressionMethods
|
|
@@ -214,4 +214,4 @@ if defined?(Sequel::CoreRefinements)
|
|
|
214
214
|
end
|
|
215
215
|
end
|
|
216
216
|
end
|
|
217
|
-
# :
|
|
217
|
+
# simplecov:enable
|
|
@@ -46,11 +46,11 @@ module Sequel
|
|
|
46
46
|
super(provenance_opts(opts))
|
|
47
47
|
end
|
|
48
48
|
else
|
|
49
|
-
# :
|
|
49
|
+
# simplecov:disable
|
|
50
50
|
def clone(opts = OPTS) # :nodoc:
|
|
51
51
|
super(provenance_opts(opts))
|
|
52
52
|
end
|
|
53
|
-
# :
|
|
53
|
+
# simplecov:enable
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
%w'select insert update delete'.each do |type|
|
|
@@ -74,9 +74,9 @@ module Sequel
|
|
|
74
74
|
raise(Sequel::Error, "method #{method.inspect} did not return a dataset") unless @dataset.is_a?(Dataset)
|
|
75
75
|
self
|
|
76
76
|
end
|
|
77
|
-
# :
|
|
77
|
+
# simplecov:disable
|
|
78
78
|
ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
|
|
79
|
-
# :
|
|
79
|
+
# simplecov:enable
|
|
80
80
|
end
|
|
81
81
|
end
|
|
82
82
|
|
data/lib/sequel/extensions/s.rb
CHANGED
|
@@ -29,8 +29,7 @@
|
|
|
29
29
|
#
|
|
30
30
|
# Object.send(:include, Sequel::S)
|
|
31
31
|
#
|
|
32
|
-
#
|
|
33
|
-
# can use Sequel::S as a refinement, in which case the private #S method
|
|
32
|
+
# You can use also Sequel::S as a refinement, in which case the private #S method
|
|
34
33
|
# will be available on all objects while the refinement is active.
|
|
35
34
|
#
|
|
36
35
|
# using Sequel::S
|
|
@@ -39,7 +38,6 @@
|
|
|
39
38
|
#
|
|
40
39
|
# Related module: Sequel::S
|
|
41
40
|
|
|
42
|
-
|
|
43
41
|
#
|
|
44
42
|
module Sequel::S
|
|
45
43
|
private
|
|
@@ -49,12 +47,10 @@ module Sequel::S
|
|
|
49
47
|
Sequel.expr(*a, &block)
|
|
50
48
|
end
|
|
51
49
|
|
|
52
|
-
# :
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
send include_meth, Sequel::S
|
|
58
|
-
end
|
|
50
|
+
# simplecov:disable
|
|
51
|
+
include_meth = RUBY_VERSION >= '3.1' ? :import_methods : :include
|
|
52
|
+
# simplecov:enable
|
|
53
|
+
refine Object do
|
|
54
|
+
send include_meth, Sequel::S
|
|
59
55
|
end
|
|
60
56
|
end
|
|
@@ -27,9 +27,9 @@ Sequel.extension :eval_inspect
|
|
|
27
27
|
|
|
28
28
|
module Sequel
|
|
29
29
|
module SchemaDumper
|
|
30
|
-
# :
|
|
30
|
+
# simplecov:disable
|
|
31
31
|
IGNORE_INDEX_ERRORS_KEY = RUBY_VERSION >= '3.4' ? 'ignore_index_errors: ' : ':ignore_index_errors=>'
|
|
32
|
-
# :
|
|
32
|
+
# simplecov:enable
|
|
33
33
|
private_constant :IGNORE_INDEX_ERRORS_KEY
|
|
34
34
|
|
|
35
35
|
# Convert the column schema information to a hash of column options, one of which must
|
|
@@ -200,8 +200,12 @@ END_MIG
|
|
|
200
200
|
|
|
201
201
|
# Recreate the column in the passed Schema::CreateTableGenerator from the given name and parsed database schema.
|
|
202
202
|
def recreate_column(name, schema, gen, options)
|
|
203
|
+
db_type = schema[:db_type]
|
|
204
|
+
db_type = literal(db_type) if options[:same_db] && database_type == :sqlite
|
|
205
|
+
|
|
203
206
|
if options[:single_pk] && schema_autoincrementing_primary_key?(schema)
|
|
204
|
-
type_hash = options[:same_db] ? {:type=>
|
|
207
|
+
type_hash = options[:same_db] ? {:type=>db_type} : column_schema_to_ruby_type(schema)
|
|
208
|
+
|
|
205
209
|
[:table, :key, :on_delete, :on_update, :deferrable].each{|f| type_hash[f] = schema[f] if schema[f]}
|
|
206
210
|
if type_hash == {:type=>Integer} || type_hash == {:type=>"integer"} || type_hash == {:type=>"INTEGER"}
|
|
207
211
|
type_hash.delete(:type)
|
|
@@ -220,7 +224,7 @@ END_MIG
|
|
|
220
224
|
end
|
|
221
225
|
else
|
|
222
226
|
col_opts = if options[:same_db]
|
|
223
|
-
h = {:type=>
|
|
227
|
+
h = {:type=>db_type}
|
|
224
228
|
if database_type == :mysql && h[:type].start_with?("timestamp")
|
|
225
229
|
h[:null] = true
|
|
226
230
|
end
|
|
@@ -430,10 +434,10 @@ END_MIG
|
|
|
430
434
|
|
|
431
435
|
module Schema
|
|
432
436
|
class CreateTableGenerator
|
|
433
|
-
# :
|
|
437
|
+
# simplecov:disable
|
|
434
438
|
DEFAULT_KEY = RUBY_VERSION >= '3.4' ? 'default: ' : ':default=>'
|
|
435
439
|
IGNORE_ERRORS_KEY = RUBY_VERSION >= '3.4' ? 'ignore_errors: ' : ':ignore_errors=>'
|
|
436
|
-
# :
|
|
440
|
+
# simplecov:enable
|
|
437
441
|
private_constant :DEFAULT_KEY
|
|
438
442
|
private_constant :IGNORE_ERRORS_KEY
|
|
439
443
|
|
|
@@ -108,7 +108,7 @@ module Sequel
|
|
|
108
108
|
# injection.
|
|
109
109
|
#
|
|
110
110
|
# Additionally, due to the use of an SQL comment, if any
|
|
111
|
-
# SQL is
|
|
111
|
+
# SQL is appended to the query after the comment is added,
|
|
112
112
|
# it will become part of the comment unless it is preceded
|
|
113
113
|
# by a newline.
|
|
114
114
|
if sql.frozen?
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
# The normalization is done by scanning the SQL string being executed
|
|
15
15
|
# for literal strings and numbers, and replacing them with question
|
|
16
16
|
# marks. While this should work for all or almost all production queries,
|
|
17
|
-
# there are
|
|
17
|
+
# there are pathological queries that will not be handled correctly, such as
|
|
18
18
|
# the use of apostrophes in identifiers:
|
|
19
19
|
#
|
|
20
20
|
# DB[:"asf'bar"].where(a: 1, b: 'something').first
|
|
@@ -296,7 +296,7 @@ module Sequel
|
|
|
296
296
|
end
|
|
297
297
|
end
|
|
298
298
|
|
|
299
|
-
# :
|
|
299
|
+
# simplecov:disable
|
|
300
300
|
if Sequel.core_extensions?
|
|
301
301
|
class Symbol
|
|
302
302
|
include Sequel::SQLite::JSONOpMethods
|
|
@@ -310,4 +310,4 @@ if defined?(Sequel::CoreRefinements)
|
|
|
310
310
|
end
|
|
311
311
|
end
|
|
312
312
|
end
|
|
313
|
-
# :
|
|
313
|
+
# simplecov:enable
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
2
|
#
|
|
3
3
|
# The string_agg extension adds the ability to perform database-independent
|
|
4
|
-
# aggregate string
|
|
4
|
+
# aggregate string concatenation. For example, with a table like:
|
|
5
5
|
#
|
|
6
6
|
# c1 | c2
|
|
7
7
|
# ---+---
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
# # or:
|
|
29
29
|
# sa = Sequel.string_agg(:column_name, '-') # custom separator
|
|
30
30
|
#
|
|
31
|
-
# You can specify the order in which the
|
|
31
|
+
# You can specify the order in which the concatenation happens by
|
|
32
32
|
# calling +order+ on the expression:
|
|
33
33
|
#
|
|
34
34
|
# sa = Sequel.string_agg(:column_name).order(:other_column)
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
# select_group(:c1).
|
|
46
46
|
# select_append(Sequel.string_agg(:c2))
|
|
47
47
|
#
|
|
48
|
-
# This extension
|
|
48
|
+
# This extension currently supports the following databases:
|
|
49
49
|
#
|
|
50
50
|
# * PostgreSQL 9+
|
|
51
51
|
# * SQLAnywhere 12+
|
|
@@ -62,13 +62,13 @@
|
|
|
62
62
|
module Sequel
|
|
63
63
|
module SQL
|
|
64
64
|
module Builders
|
|
65
|
-
# Return a StringAgg expression for an aggregate string
|
|
65
|
+
# Return a StringAgg expression for an aggregate string concatenation.
|
|
66
66
|
def string_agg(*a)
|
|
67
67
|
StringAgg.new(*a)
|
|
68
68
|
end
|
|
69
69
|
end
|
|
70
70
|
|
|
71
|
-
# The StringAgg class represents an aggregate string
|
|
71
|
+
# The StringAgg class represents an aggregate string concatenation.
|
|
72
72
|
class StringAgg < GenericExpression
|
|
73
73
|
include StringMethods
|
|
74
74
|
include StringConcatenationMethods
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
2
|
#
|
|
3
3
|
# The symbol_aref extension makes Symbol#[] support Symbol,
|
|
4
|
-
# Sequel::SQL::
|
|
4
|
+
# Sequel::SQL::Identifier, and Sequel::SQL::QualifiedIdentifier instances,
|
|
5
5
|
# returning appropriate Sequel::SQL::QualifiedIdentifier instances. It's
|
|
6
6
|
# designed as a shortcut so that instead of:
|
|
7
7
|
#
|
|
@@ -15,41 +15,21 @@
|
|
|
15
15
|
#
|
|
16
16
|
# Sequel.extension :symbol_aref
|
|
17
17
|
#
|
|
18
|
-
#
|
|
19
|
-
# is a refinement version of this in the symbol_aref_refinement extension.
|
|
18
|
+
# There is a refinement version of this in the symbol_aref_refinement extension.
|
|
20
19
|
#
|
|
21
20
|
# Related module: Sequel::SymbolAref
|
|
22
21
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
super
|
|
31
|
-
end
|
|
22
|
+
module Sequel::SymbolAref
|
|
23
|
+
def [](v)
|
|
24
|
+
case v
|
|
25
|
+
when Symbol, Sequel::SQL::Identifier, Sequel::SQL::QualifiedIdentifier
|
|
26
|
+
Sequel::SQL::QualifiedIdentifier.new(self, v)
|
|
27
|
+
else
|
|
28
|
+
super
|
|
32
29
|
end
|
|
33
30
|
end
|
|
31
|
+
end
|
|
34
32
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
end
|
|
38
|
-
# :nocov:
|
|
39
|
-
else
|
|
40
|
-
class Symbol
|
|
41
|
-
if method_defined?(:[])
|
|
42
|
-
alias_method :aref_before_sequel, :[]
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def [](v)
|
|
46
|
-
case v
|
|
47
|
-
when Symbol, Sequel::SQL::Identifier, Sequel::SQL::QualifiedIdentifier
|
|
48
|
-
Sequel::SQL::QualifiedIdentifier.new(self, v)
|
|
49
|
-
else
|
|
50
|
-
aref_before_sequel(v)
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
33
|
+
class Symbol
|
|
34
|
+
prepend Sequel::SymbolAref
|
|
54
35
|
end
|
|
55
|
-
# :nocov:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
2
|
#
|
|
3
3
|
# The symbol_aref_refinement extension adds a refinement that makes
|
|
4
|
-
# Symbol#[] support Symbol, #Sequel::SQL::
|
|
4
|
+
# Symbol#[] support Symbol, #Sequel::SQL::Identifier, and
|
|
5
5
|
# Sequel::SQL::QualifiedIdentifier instances, returning appropriate
|
|
6
6
|
# Sequel::SQL::QualifiedIdentifier instances. It's designed as a
|
|
7
7
|
# shortcut so that instead of:
|
|
@@ -25,10 +25,7 @@
|
|
|
25
25
|
#
|
|
26
26
|
# Related module: Sequel::SymbolAref
|
|
27
27
|
|
|
28
|
-
#
|
|
29
|
-
raise(Sequel::Error, "Refinements require ruby 2.0.0 or greater") unless RUBY_VERSION >= '2.0.0'
|
|
30
|
-
# :nocov:
|
|
31
|
-
|
|
28
|
+
#
|
|
32
29
|
module Sequel::SymbolAref
|
|
33
30
|
refine Symbol do
|
|
34
31
|
def [](v)
|
|
@@ -14,8 +14,7 @@
|
|
|
14
14
|
#
|
|
15
15
|
# Sequel.extension :symbol_as
|
|
16
16
|
#
|
|
17
|
-
#
|
|
18
|
-
# is a refinement version of this in the symbol_as_refinement extension.
|
|
17
|
+
# There is a refinement version of this in the symbol_as_refinement extension.
|
|
19
18
|
|
|
20
19
|
#
|
|
21
20
|
class Symbol
|
|
@@ -23,10 +23,7 @@
|
|
|
23
23
|
#
|
|
24
24
|
# Related module: Sequel::SymbolAs
|
|
25
25
|
|
|
26
|
-
#
|
|
27
|
-
raise(Sequel::Error, "Refinements require ruby 2.0.0 or greater") unless RUBY_VERSION >= '2.0.0'
|
|
28
|
-
# :nocov:
|
|
29
|
-
|
|
26
|
+
#
|
|
30
27
|
module Sequel::SymbolAs
|
|
31
28
|
refine Symbol do
|
|
32
29
|
def as(aliaz, columns=nil)
|
|
@@ -34,4 +31,3 @@ module Sequel::SymbolAs
|
|
|
34
31
|
end
|
|
35
32
|
end
|
|
36
33
|
end
|
|
37
|
-
|
|
@@ -33,7 +33,7 @@ module Sequel
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
# Rescue disconnect errors raised when beginning a new transaction. If there
|
|
36
|
-
# is a
|
|
36
|
+
# is a disconnect error, it should be safe to retry the transaction using a
|
|
37
37
|
# new connection, as we haven't yielded control to the user yet.
|
|
38
38
|
def transaction(opts=OPTS)
|
|
39
39
|
super
|
|
@@ -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
|
|
@@ -2425,14 +2433,9 @@ END
|
|
|
2425
2433
|
plugin self
|
|
2426
2434
|
def_initialize_nil_instance_variables
|
|
2427
2435
|
|
|
2428
|
-
singleton_class.send(:undef_method, :dup, :clone, :initialize_copy)
|
|
2429
|
-
# :nocov:
|
|
2430
|
-
if RUBY_VERSION >= '1.9.3'
|
|
2431
|
-
# :nocov:
|
|
2432
|
-
singleton_class.send(:undef_method, :initialize_clone, :initialize_dup)
|
|
2433
|
-
end
|
|
2436
|
+
singleton_class.send(:undef_method, :dup, :clone, :initialize_copy, :initialize_clone, :initialize_dup)
|
|
2434
2437
|
|
|
2435
|
-
# :
|
|
2438
|
+
# simplecov:disable
|
|
2436
2439
|
if defined?(Sequel::Postgres::SEQUEL_PG_VERSION_INTEGER) && Sequel::Postgres::SEQUEL_PG_VERSION_INTEGER >= 11800
|
|
2437
2440
|
# Automatically optimize model loading when sequel/core was loaded,
|
|
2438
2441
|
# then sequel/adapters/postgres (with sequel_pg), then sequel/model
|
|
@@ -2442,6 +2445,6 @@ END
|
|
|
2442
2445
|
# nothing
|
|
2443
2446
|
end
|
|
2444
2447
|
end
|
|
2445
|
-
# :
|
|
2448
|
+
# simplecov:enable
|
|
2446
2449
|
end
|
|
2447
2450
|
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,
|