sequel 5.106.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 +997 -38
- data/lib/sequel/adapters/shared/sqlite.rb +8 -7
- 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 +7 -5
- 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 +2 -2
|
@@ -210,7 +210,7 @@ module Sequel
|
|
|
210
210
|
if ops.length > 1 && ops.all?{|op| op[:op] == :add_constraint || op[:op] == :set_column_null}
|
|
211
211
|
null_ops, ops = ops.partition{|op| op[:op] == :set_column_null}
|
|
212
212
|
|
|
213
|
-
# Apply NULL/NOT NULL ops first, since those should be purely
|
|
213
|
+
# Apply NULL/NOT NULL ops first, since those should be purely independent of the constraints.
|
|
214
214
|
null_ops.each{|op| alter_table_sql_list(table, [op]).flatten.each{|sql| execute_ddl(sql)}}
|
|
215
215
|
|
|
216
216
|
# If you are just doing constraints, apply all of them at the same time,
|
|
@@ -677,14 +677,15 @@ module Sequel
|
|
|
677
677
|
super
|
|
678
678
|
end
|
|
679
679
|
|
|
680
|
-
# Return
|
|
681
|
-
# current dataset.
|
|
682
|
-
#
|
|
680
|
+
# Return a string specifying a query explanation for a SELECT of the
|
|
681
|
+
# current dataset. Options:
|
|
682
|
+
# :query_plan :: Use EXPLAIN QUERY PLAN instead of EXPLAIN if true.
|
|
683
683
|
def explain(opts=nil)
|
|
684
684
|
# Load the PrettyTable class, needed for explain output
|
|
685
685
|
Sequel.extension(:_pretty_table) unless defined?(Sequel::PrettyTable)
|
|
686
686
|
|
|
687
|
-
|
|
687
|
+
keyword = (opts && opts[:query_plan]) ? "EXPLAIN QUERY PLAN" : "EXPLAIN"
|
|
688
|
+
ds = db.send(:metadata_dataset).clone(:sql=>"#{keyword} #{select_sql}".freeze)
|
|
688
689
|
rows = ds.all
|
|
689
690
|
Sequel::PrettyTable.string(rows, ds.columns)
|
|
690
691
|
end
|
|
@@ -729,7 +730,7 @@ module Sequel
|
|
|
729
730
|
|
|
730
731
|
# Handle uniqueness violations when inserting, by using a specified
|
|
731
732
|
# resolution algorithm. With no options, uses INSERT OR REPLACE. SQLite
|
|
732
|
-
# supports the following conflict resolution
|
|
733
|
+
# supports the following conflict resolution algorithms: ROLLBACK, ABORT,
|
|
733
734
|
# FAIL, IGNORE and REPLACE.
|
|
734
735
|
#
|
|
735
736
|
# On SQLite 3.24.0+, you can pass a hash to use an ON CONFLICT clause.
|
|
@@ -891,7 +892,7 @@ module Sequel
|
|
|
891
892
|
end
|
|
892
893
|
|
|
893
894
|
# Use from_self for aggregate dataset using VALUES.
|
|
894
|
-
def
|
|
895
|
+
def aggregate_dataset_use_from_self?
|
|
895
896
|
super || @opts[:values]
|
|
896
897
|
end
|
|
897
898
|
|
|
@@ -49,7 +49,7 @@ module Sequel
|
|
|
49
49
|
else
|
|
50
50
|
# Sequel doesn't allow a nonpositive limit. If the offset
|
|
51
51
|
# is greater than the number of rows, the empty result set
|
|
52
|
-
#
|
|
52
|
+
# should be returned, so use a condition that is always false.
|
|
53
53
|
ds.where(1=>0)
|
|
54
54
|
end
|
|
55
55
|
sql = @opts[:append_sql] || String.new
|
|
@@ -22,7 +22,17 @@ module Sequel
|
|
|
22
22
|
END
|
|
23
23
|
# Error messages for mysql and mysql2 that indicate the current connection should be disconnected
|
|
24
24
|
MYSQL_DATABASE_DISCONNECT_ERRORS = /\A#{Regexp.union(disconnect_errors)}/
|
|
25
|
-
|
|
25
|
+
|
|
26
|
+
# 2027 (CR_MALFORMED_PACKET) deliberately not included (protocol error, not connection error)
|
|
27
|
+
MYSQL_DISCONNECT_ERROR_CODES = [
|
|
28
|
+
2002, # CR_CONNECTION_ERROR
|
|
29
|
+
2006, # CR_SERVER_GONE_ERROR
|
|
30
|
+
2013, # CR_SERVER_LOST
|
|
31
|
+
2014, # CR_COMMANDS_OUT_OF_SYNC
|
|
32
|
+
2055, # CR_SERVER_LOST_EXTENDED
|
|
33
|
+
].freeze
|
|
34
|
+
private_constant :MYSQL_DISCONNECT_ERROR_CODES
|
|
35
|
+
|
|
26
36
|
# Support stored procedures on MySQL
|
|
27
37
|
def call_sproc(name, opts=OPTS, &block)
|
|
28
38
|
args = opts[:args] || []
|
|
@@ -38,7 +38,7 @@ class Sequel::ShardedSingleConnectionPool < Sequel::ConnectionPool
|
|
|
38
38
|
|
|
39
39
|
# Disconnects from the database. Once a connection is requested using
|
|
40
40
|
# #hold, the connection is reestablished. Options:
|
|
41
|
-
# :server :: Should be a symbol
|
|
41
|
+
# :server :: Should be a symbol specifying the server to disconnect from,
|
|
42
42
|
# or an array of symbols to specify multiple servers.
|
|
43
43
|
def disconnect(opts=OPTS)
|
|
44
44
|
(opts[:server] ? Array(opts[:server]) : servers).each do |s|
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
2
|
|
|
3
|
+
# SEQUEL6: Remove, deprecation: add warning if used on Ruby 3.2+
|
|
4
|
+
|
|
3
5
|
require_relative 'threaded'
|
|
4
6
|
|
|
5
7
|
# The slowest and most advanced connection pool, dealing with both multi-threaded
|
|
@@ -95,7 +97,7 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
95
97
|
#
|
|
96
98
|
# Once a connection is requested using #hold, the connection pool
|
|
97
99
|
# creates new connections to the database. Options:
|
|
98
|
-
# :server :: Should be a symbol
|
|
100
|
+
# :server :: Should be a symbol specifying the server to disconnect from,
|
|
99
101
|
# or an array of symbols to specify multiple servers.
|
|
100
102
|
def disconnect(opts=OPTS)
|
|
101
103
|
(opts[:server] ? Array(opts[:server]) : sync{@servers.keys}).each do |s|
|
|
@@ -203,7 +205,7 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
203
205
|
|
|
204
206
|
until conn = assign_connection(thread, server)
|
|
205
207
|
elapsed = Sequel.elapsed_seconds_since(timer)
|
|
206
|
-
# :
|
|
208
|
+
# simplecov:disable
|
|
207
209
|
raise_pool_timeout(elapsed, server) if elapsed > timeout
|
|
208
210
|
|
|
209
211
|
# It's difficult to get to this point, it can only happen if there is a race condition
|
|
@@ -211,7 +213,7 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
211
213
|
if conn = acquire_available(thread, server, timeout - elapsed)
|
|
212
214
|
return conn
|
|
213
215
|
end
|
|
214
|
-
# :
|
|
216
|
+
# simplecov:enable
|
|
215
217
|
end
|
|
216
218
|
|
|
217
219
|
conn
|
|
@@ -223,11 +225,11 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
|
|
|
223
225
|
# Check if connection was checked in between when assign_connection failed and now.
|
|
224
226
|
# This is very unlikely, but necessary to prevent a situation where the waiter
|
|
225
227
|
# will wait for a connection even though one has already been checked in.
|
|
226
|
-
# :
|
|
228
|
+
# simplecov:disable
|
|
227
229
|
if conn = next_available(server)
|
|
228
230
|
return(allocated(server)[thread] = conn)
|
|
229
231
|
end
|
|
230
|
-
# :
|
|
232
|
+
# simplecov:enable
|
|
231
233
|
|
|
232
234
|
@waiters[server].wait(@mutex, timeout)
|
|
233
235
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
2
|
|
|
3
|
-
# :
|
|
3
|
+
# simplecov:disable
|
|
4
4
|
raise LoadError, "Sequel::ShardedTimedQueueConnectionPool is only available on Ruby 3.2+" unless RUBY_VERSION >= '3.2'
|
|
5
|
-
# :
|
|
5
|
+
# simplecov:enable
|
|
6
6
|
|
|
7
7
|
# A connection pool allowing multi-threaded access to a sharded pool of connections,
|
|
8
8
|
# using a timed queue (only available in Ruby 3.2+).
|
|
@@ -148,7 +148,7 @@ class Sequel::ShardedTimedQueueConnectionPool < Sequel::ConnectionPool
|
|
|
148
148
|
@queues[pick_server(server)].num_waiting
|
|
149
149
|
end
|
|
150
150
|
|
|
151
|
-
# The total number of connections in the pool. Using a non-
|
|
151
|
+
# The total number of connections in the pool. Using a non-existent server will return nil.
|
|
152
152
|
def size(server=:default)
|
|
153
153
|
sync{@sizes[server]}
|
|
154
154
|
end
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
2
|
|
|
3
|
+
# SEQUEL6: Remove, deprecation: add warning if used on Ruby 3.2+
|
|
4
|
+
|
|
3
5
|
# A connection pool allowing multi-threaded access to a pool of connections.
|
|
4
6
|
# This is the default connection pool used by Sequel.
|
|
5
7
|
class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
6
|
-
USE_WAITER = true
|
|
8
|
+
USE_WAITER = true
|
|
7
9
|
Sequel::Deprecation.deprecate_constant(self, :USE_WAITER)
|
|
8
10
|
|
|
9
11
|
# The maximum number of connections this pool will create (per shard/server
|
|
@@ -12,11 +14,11 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
|
12
14
|
|
|
13
15
|
# An array of connections that are available for use by the pool.
|
|
14
16
|
# The calling code should already have the mutex before calling this.
|
|
15
|
-
attr_reader :available_connections
|
|
17
|
+
attr_reader :available_connections
|
|
16
18
|
|
|
17
19
|
# A hash with thread/fiber keys and connection values for currently allocated connections.
|
|
18
20
|
# The calling code should already have the mutex before calling this.
|
|
19
|
-
attr_reader :allocated
|
|
21
|
+
attr_reader :allocated
|
|
20
22
|
|
|
21
23
|
# The following additional options are respected:
|
|
22
24
|
# :max_connections :: The maximum number of connections the connection pool
|
|
@@ -149,7 +151,7 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
|
149
151
|
|
|
150
152
|
until conn = assign_connection(thread)
|
|
151
153
|
elapsed = Sequel.elapsed_seconds_since(timer)
|
|
152
|
-
# :
|
|
154
|
+
# simplecov:disable
|
|
153
155
|
raise_pool_timeout(elapsed) if elapsed > timeout
|
|
154
156
|
|
|
155
157
|
# It's difficult to get to this point, it can only happen if there is a race condition
|
|
@@ -157,7 +159,7 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
|
157
159
|
if conn = acquire_available(thread, timeout - elapsed)
|
|
158
160
|
return conn
|
|
159
161
|
end
|
|
160
|
-
# :
|
|
162
|
+
# simplecov:enable
|
|
161
163
|
end
|
|
162
164
|
|
|
163
165
|
conn
|
|
@@ -169,11 +171,11 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
|
|
|
169
171
|
# Check if connection was checked in between when assign_connection failed and now.
|
|
170
172
|
# This is very unlikely, but necessary to prevent a situation where the waiter
|
|
171
173
|
# will wait for a connection even though one has already been checked in.
|
|
172
|
-
# :
|
|
174
|
+
# simplecov:disable
|
|
173
175
|
if conn = next_available
|
|
174
176
|
return(@allocated[thread] = conn)
|
|
175
177
|
end
|
|
176
|
-
# :
|
|
178
|
+
# simplecov:enable
|
|
177
179
|
|
|
178
180
|
@waiter.wait(@mutex, timeout)
|
|
179
181
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen-string-literal: true
|
|
2
2
|
|
|
3
|
-
# :
|
|
3
|
+
# simplecov:disable
|
|
4
4
|
raise LoadError, "Sequel::TimedQueueConnectionPool is only available on Ruby 3.2+" unless RUBY_VERSION >= '3.2'
|
|
5
|
-
# :
|
|
5
|
+
# simplecov:enable
|
|
6
6
|
|
|
7
7
|
# A connection pool allowing multi-threaded access to a pool of connections,
|
|
8
8
|
# using a timed queue (only available in Ruby 3.2+).
|
|
@@ -38,7 +38,7 @@ class Sequel::ConnectionPool
|
|
|
38
38
|
POOL_CLASS_MAP.freeze
|
|
39
39
|
|
|
40
40
|
# Class methods used to return an appropriate pool subclass, separated
|
|
41
|
-
# into a module for easier
|
|
41
|
+
# into a module for easier overriding by extensions.
|
|
42
42
|
module ClassMethods
|
|
43
43
|
# Return a pool subclass instance based on the given options. If a <tt>:pool_class</tt>
|
|
44
44
|
# option is provided is provided, use that pool class, otherwise
|
|
@@ -72,11 +72,11 @@ class Sequel::ConnectionPool
|
|
|
72
72
|
opts[:servers] ? :sharded_single : :single
|
|
73
73
|
elsif RUBY_VERSION >= '3.2'
|
|
74
74
|
opts[:servers] ? :sharded_timed_queue : :timed_queue
|
|
75
|
-
# :
|
|
75
|
+
# simplecov:disable
|
|
76
76
|
else
|
|
77
77
|
opts[:servers] ? :sharded_threaded : :threaded
|
|
78
78
|
end
|
|
79
|
-
# :
|
|
79
|
+
# simplecov:enable
|
|
80
80
|
|
|
81
81
|
connection_pool_class(:pool_class=>pc)
|
|
82
82
|
end
|
data/lib/sequel/core.rb
CHANGED
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
# For a quicker introduction, see the {cheat sheet}[rdoc-ref:doc/cheat_sheet.rdoc].
|
|
27
27
|
module Sequel
|
|
28
28
|
@convert_two_digit_years = true
|
|
29
|
-
@datetime_class = Time
|
|
30
|
-
@split_symbols = false
|
|
29
|
+
@datetime_class = Time # SEQUEL6: Remove
|
|
30
|
+
@split_symbols = false # SEQUEL6: Remove
|
|
31
31
|
@single_threaded = false
|
|
32
32
|
|
|
33
33
|
# Mutex used to protect mutable data structures
|
|
@@ -36,7 +36,7 @@ module Sequel
|
|
|
36
36
|
# Frozen hash used as the default options hash for most options.
|
|
37
37
|
OPTS = {}.freeze
|
|
38
38
|
|
|
39
|
-
SPLIT_SYMBOL_CACHE = {}
|
|
39
|
+
SPLIT_SYMBOL_CACHE = {} # SEQUEL6: Remove
|
|
40
40
|
|
|
41
41
|
module SequelMethods
|
|
42
42
|
# Sequel converts two digit years in <tt>Date</tt>s and <tt>DateTime</tt>s by default,
|
|
@@ -56,6 +56,8 @@ module Sequel
|
|
|
56
56
|
# cases where they implement the same methods, they often implement them
|
|
57
57
|
# differently (e.g. + using seconds on +Time+ and days on +DateTime+).
|
|
58
58
|
attr_accessor :datetime_class
|
|
59
|
+
# SEQUEL6: Remove datetime_class=
|
|
60
|
+
# SEQUEL6.1: Remove datetime_class
|
|
59
61
|
|
|
60
62
|
# Set whether Sequel is being used in single threaded mode. By default,
|
|
61
63
|
# Sequel uses a thread-safe connection pool, which isn't as fast as the
|
|
@@ -66,8 +68,7 @@ module Sequel
|
|
|
66
68
|
# Sequel.single_threaded = true
|
|
67
69
|
attr_accessor :single_threaded
|
|
68
70
|
|
|
69
|
-
#
|
|
70
|
-
# require for backwards compatibility.
|
|
71
|
+
# # SEQUEL6: Remove
|
|
71
72
|
alias orig_require require
|
|
72
73
|
private :orig_require
|
|
73
74
|
|
|
@@ -169,14 +170,14 @@ module Sequel
|
|
|
169
170
|
def array_or_set_join(obj, arg)
|
|
170
171
|
obj.join(arg)
|
|
171
172
|
end
|
|
172
|
-
# :
|
|
173
|
+
# simplecov:disable
|
|
173
174
|
else
|
|
174
175
|
def array_or_set_join(obj, arg)
|
|
175
176
|
obj = obj.to_a if obj.is_a?(Set)
|
|
176
177
|
obj.join(arg)
|
|
177
178
|
end
|
|
178
179
|
end
|
|
179
|
-
# :
|
|
180
|
+
# simplecov:enable
|
|
180
181
|
|
|
181
182
|
if RUBY_VERSION >= '3.3'
|
|
182
183
|
# Create a new module using the block, and set the temporary name
|
|
@@ -185,13 +186,13 @@ module Sequel
|
|
|
185
186
|
mod.set_temporary_name(yield)
|
|
186
187
|
mod
|
|
187
188
|
end
|
|
188
|
-
# :
|
|
189
|
+
# simplecov:disable
|
|
189
190
|
else
|
|
190
191
|
def set_temp_name(mod)
|
|
191
192
|
mod
|
|
192
193
|
end
|
|
193
194
|
end
|
|
194
|
-
# :
|
|
195
|
+
# simplecov:enable
|
|
195
196
|
|
|
196
197
|
# Convert given object to json and return the result.
|
|
197
198
|
# This can be overridden to use an alternative json implementation.
|
|
@@ -231,18 +232,23 @@ module Sequel
|
|
|
231
232
|
|
|
232
233
|
# For backwards compatibility only. require_relative should be used instead.
|
|
233
234
|
def require(files, subdir=nil)
|
|
235
|
+
# SEQUEL6: Remove
|
|
234
236
|
# Use Kernel.require_relative to work around JRuby 9.0 bug
|
|
237
|
+
# simplecov:disable
|
|
235
238
|
Array(files).each{|f| Kernel.require_relative "#{"#{subdir}/" if subdir}#{f}"}
|
|
239
|
+
# simplecov:enable
|
|
240
|
+
Sequel::Deprecation.deprecate("Sequel.require is deprecated and will be removed in Sequel 6.")
|
|
236
241
|
end
|
|
237
242
|
|
|
238
243
|
# Splits the symbol into three parts, if symbol splitting is enabled (not the default).
|
|
239
244
|
# Each part will either be a string or nil. If symbol splitting
|
|
240
245
|
# is disabled, returns an array with the first and third parts
|
|
241
|
-
# being nil, and the second part
|
|
246
|
+
# being nil, and the second part behind a string version of the symbol.
|
|
242
247
|
#
|
|
243
248
|
# For columns, these parts are the table, column, and alias.
|
|
244
249
|
# For tables, these parts are the schema, table, and alias.
|
|
245
250
|
def split_symbol(sym)
|
|
251
|
+
# SEQUEL6.1: Remove
|
|
246
252
|
unless v = Sequel.synchronize{SPLIT_SYMBOL_CACHE[sym]}
|
|
247
253
|
if split_symbols?
|
|
248
254
|
v = case s = sym.to_s
|
|
@@ -284,7 +290,7 @@ module Sequel
|
|
|
284
290
|
#
|
|
285
291
|
# Disabling symbol splitting will also disable the handling
|
|
286
292
|
# of double underscores in virtual row methods, causing such methods to
|
|
287
|
-
# yield regular
|
|
293
|
+
# yield regular identifiers instead of qualified identifiers:
|
|
288
294
|
#
|
|
289
295
|
# # Sequel.split_symbols = true
|
|
290
296
|
# Sequel.expr{table__column} # table.column
|
|
@@ -294,12 +300,14 @@ module Sequel
|
|
|
294
300
|
# Sequel.expr{table__column} # table__column
|
|
295
301
|
# Sequel.expr{table[:column]} # table.column
|
|
296
302
|
def split_symbols=(v)
|
|
303
|
+
# SEQUEL6: Remove
|
|
297
304
|
Sequel.synchronize{SPLIT_SYMBOL_CACHE.clear}
|
|
298
305
|
@split_symbols = v
|
|
299
306
|
end
|
|
300
307
|
|
|
301
308
|
# Whether Sequel currently splits symbols into qualified/aliased identifiers.
|
|
302
309
|
def split_symbols?
|
|
310
|
+
# SEQUEL6.1: Remove
|
|
303
311
|
@split_symbols
|
|
304
312
|
end
|
|
305
313
|
|
|
@@ -352,11 +360,11 @@ module Sequel
|
|
|
352
360
|
Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
353
361
|
end
|
|
354
362
|
else
|
|
355
|
-
# :
|
|
363
|
+
# simplecov:disable
|
|
356
364
|
def start_timer # :nodoc:
|
|
357
365
|
Time.now
|
|
358
366
|
end
|
|
359
|
-
# :
|
|
367
|
+
# simplecov:enable
|
|
360
368
|
end
|
|
361
369
|
|
|
362
370
|
# The elapsed seconds since the given timer object was created. The
|
|
@@ -451,15 +459,15 @@ module Sequel
|
|
|
451
459
|
end
|
|
452
460
|
extend SequelMethods
|
|
453
461
|
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
462
|
+
require_relative "deprecated"
|
|
463
|
+
require_relative "sql"
|
|
464
|
+
require_relative "connection_pool"
|
|
465
|
+
require_relative "exceptions"
|
|
466
|
+
require_relative "dataset"
|
|
467
|
+
require_relative "database"
|
|
468
|
+
require_relative "timezones"
|
|
469
|
+
require_relative "ast_transformer"
|
|
470
|
+
require_relative "version"
|
|
463
471
|
|
|
464
472
|
class << self
|
|
465
473
|
# Allow nicer syntax for creating Sequel expressions:
|
|
@@ -192,7 +192,7 @@ module Sequel
|
|
|
192
192
|
|
|
193
193
|
# Disconnects all available connections from the connection pool. Any
|
|
194
194
|
# connections currently in use will not be disconnected. Options:
|
|
195
|
-
# :server :: Should be a symbol
|
|
195
|
+
# :server :: Should be a symbol specifying the server to disconnect from,
|
|
196
196
|
# or an array of symbols to specify multiple servers.
|
|
197
197
|
#
|
|
198
198
|
# Example:
|
|
@@ -5,7 +5,7 @@ module Sequel
|
|
|
5
5
|
# ---------------------
|
|
6
6
|
# :section: 9 - Methods that describe what the database supports
|
|
7
7
|
# These methods all return booleans, with most describing whether or not the
|
|
8
|
-
# database
|
|
8
|
+
# database supports a given feature.
|
|
9
9
|
# ---------------------
|
|
10
10
|
|
|
11
11
|
# Whether the database uses a global namespace for the index, true by default. If
|
data/lib/sequel/database/misc.rb
CHANGED
|
@@ -26,9 +26,9 @@ module Sequel
|
|
|
26
26
|
:time=>Sequel::SQLTime, :boolean=>[TrueClass, FalseClass].freeze, :float=>Float, :decimal=>BigDecimal,
|
|
27
27
|
:blob=>Sequel::SQL::Blob}.freeze
|
|
28
28
|
|
|
29
|
-
# :
|
|
29
|
+
# simplecov:disable
|
|
30
30
|
URI_PARSER = defined?(::URI::RFC2396_PARSER) ? ::URI::RFC2396_PARSER : ::URI::DEFAULT_PARSER
|
|
31
|
-
# :
|
|
31
|
+
# simplecov:enable
|
|
32
32
|
private_constant :URI_PARSER
|
|
33
33
|
|
|
34
34
|
# Nested hook Proc; each new hook Proc just wraps the previous one.
|
|
@@ -98,7 +98,7 @@ module Sequel
|
|
|
98
98
|
# The options hash for this database
|
|
99
99
|
attr_reader :opts
|
|
100
100
|
|
|
101
|
-
# Set the timezone to use for this database,
|
|
101
|
+
# Set the timezone to use for this database, overriding <tt>Sequel.database_timezone</tt>.
|
|
102
102
|
attr_writer :timezone
|
|
103
103
|
|
|
104
104
|
# The specific default size of string columns for this Sequel::Database, usually 255 by default.
|
|
@@ -230,9 +230,9 @@ module Sequel
|
|
|
230
230
|
|
|
231
231
|
# Disallow dup/clone for Database instances
|
|
232
232
|
undef_method :dup, :clone, :initialize_copy
|
|
233
|
-
# :
|
|
233
|
+
# simplecov:disable
|
|
234
234
|
if RUBY_VERSION >= '1.9.3'
|
|
235
|
-
# :
|
|
235
|
+
# simplecov:enable
|
|
236
236
|
undef_method :initialize_clone, :initialize_dup
|
|
237
237
|
end
|
|
238
238
|
|
|
@@ -580,7 +580,7 @@ module Sequel
|
|
|
580
580
|
# Typecast a string to a BigDecimal
|
|
581
581
|
alias _typecast_value_string_to_decimal BigDecimal
|
|
582
582
|
else
|
|
583
|
-
# :
|
|
583
|
+
# simplecov:disable
|
|
584
584
|
def _typecast_value_string_to_decimal(value)
|
|
585
585
|
d = BigDecimal(value)
|
|
586
586
|
if d.zero?
|
|
@@ -595,7 +595,7 @@ module Sequel
|
|
|
595
595
|
end
|
|
596
596
|
d
|
|
597
597
|
end
|
|
598
|
-
# :
|
|
598
|
+
# simplecov:enable
|
|
599
599
|
end
|
|
600
600
|
|
|
601
601
|
# Typecast the value to a BigDecimal
|
|
@@ -415,9 +415,9 @@ module Sequel
|
|
|
415
415
|
|
|
416
416
|
# Post process the schema values.
|
|
417
417
|
def schema_post_process(cols)
|
|
418
|
-
# :
|
|
418
|
+
# simplecov:disable
|
|
419
419
|
if RUBY_VERSION >= '2.5'
|
|
420
|
-
# :
|
|
420
|
+
# simplecov:enable
|
|
421
421
|
cols.each do |_, h|
|
|
422
422
|
db_type = h[:db_type]
|
|
423
423
|
if db_type.is_a?(String)
|
|
@@ -13,11 +13,13 @@ module Sequel
|
|
|
13
13
|
def _merge_column_options(defaults, opts)
|
|
14
14
|
defaults.merge!(opts) do |k, defv, v|
|
|
15
15
|
unless defv == v
|
|
16
|
-
# :
|
|
16
|
+
# simplecov:disable
|
|
17
17
|
if RUBY_VERSION >= "3.2"
|
|
18
|
-
# :
|
|
18
|
+
# simplecov:enable
|
|
19
19
|
caller_loc = Thread.each_caller_location do |loc|
|
|
20
|
-
|
|
20
|
+
# Skip core library methods implemented in Ruby
|
|
21
|
+
path = loc.path
|
|
22
|
+
break loc unless path == __FILE__ || (path && path.start_with?('<internal:'))
|
|
21
23
|
end
|
|
22
24
|
caller_loc &&= "#{caller_loc.path}:#{caller_loc.lineno}: "
|
|
23
25
|
end
|
|
@@ -150,7 +152,7 @@ module Sequel
|
|
|
150
152
|
# :not_null :: Similar to setting <tt>null: false</tt>, but you can provide a hash value
|
|
151
153
|
# to specify options for the NOT NULL constraint on PostgreSQL 18+:
|
|
152
154
|
# :name :: The name of the NOT NULL constraint
|
|
153
|
-
# :no_inherit :: Set NO INHERIT on the constraint, so it will not
|
|
155
|
+
# :no_inherit :: Set NO INHERIT on the constraint, so it will not propagate to
|
|
154
156
|
# child tables.
|
|
155
157
|
# :null :: Mark the column as allowing NULL values (if true),
|
|
156
158
|
# or not allowing NULL values (if false). The default is to allow NULL values.
|
|
@@ -225,7 +227,7 @@ module Sequel
|
|
|
225
227
|
# :deferrable :: Whether the CHECK constraint should be marked DEFERRABLE.
|
|
226
228
|
#
|
|
227
229
|
# PostgreSQL specific options:
|
|
228
|
-
# :no_inherit :: Set NO INHERIT on the constraint, so it will not
|
|
230
|
+
# :no_inherit :: Set NO INHERIT on the constraint, so it will not propagate to
|
|
229
231
|
# child tables.
|
|
230
232
|
# :not_enforced :: Whether the CHECK constraint should be marked NOT ENFORCED.
|
|
231
233
|
# :not_valid :: Whether the CHECK constraint should be marked NOT VALID.
|
|
@@ -984,7 +984,7 @@ module Sequel
|
|
|
984
984
|
on_delete_clause(action)
|
|
985
985
|
end
|
|
986
986
|
|
|
987
|
-
# Add fragment for primary key specification, separated for easier
|
|
987
|
+
# Add fragment for primary key specification, separated for easier overriding.
|
|
988
988
|
def primary_key_constraint_sql_fragment(_)
|
|
989
989
|
'PRIMARY KEY'
|
|
990
990
|
end
|
|
@@ -1144,7 +1144,7 @@ module Sequel
|
|
|
1144
1144
|
"#{type}#{literal(Array(elements)) if elements}#{' UNSIGNED' if column[:unsigned]}"
|
|
1145
1145
|
end
|
|
1146
1146
|
|
|
1147
|
-
# Add fragment for unique specification, separated for easier
|
|
1147
|
+
# Add fragment for unique specification, separated for easier overriding.
|
|
1148
1148
|
def unique_constraint_sql_fragment(_)
|
|
1149
1149
|
'UNIQUE'
|
|
1150
1150
|
end
|
|
@@ -50,7 +50,7 @@ module Sequel
|
|
|
50
50
|
# Options:
|
|
51
51
|
# :savepoint :: If currently inside a savepoint, run this hook immediately when
|
|
52
52
|
# any enclosing savepoint is rolled back, which may be before the transaction
|
|
53
|
-
# commits or
|
|
53
|
+
# commits or rolls back.
|
|
54
54
|
# :server :: The server/shard to use.
|
|
55
55
|
def after_rollback(opts=OPTS, &block)
|
|
56
56
|
raise Error, "must provide block to after_rollback" unless block
|
|
@@ -69,7 +69,7 @@ module Sequel
|
|
|
69
69
|
# When exiting the transaction block through methods other than an exception
|
|
70
70
|
# (e.g. normal exit, non-local return, or throw), set the current transaction
|
|
71
71
|
# to rollback instead of committing. This is designed for use in cases where
|
|
72
|
-
# you want to
|
|
72
|
+
# you want to perform a non-local return but also want to rollback instead of
|
|
73
73
|
# committing.
|
|
74
74
|
# Options:
|
|
75
75
|
# :cancel :: Cancel the current rollback_on_exit setting, so exiting will commit instead
|
|
@@ -246,7 +246,7 @@ module Sequel
|
|
|
246
246
|
# Internal generic transaction method. Any exception raised by the given
|
|
247
247
|
# block will cause the transaction to be rolled back. If the exception is
|
|
248
248
|
# not a Sequel::Rollback, the error will be reraised. If no exception occurs
|
|
249
|
-
# inside the block, the transaction is
|
|
249
|
+
# inside the block, the transaction is committed.
|
|
250
250
|
def _transaction(conn, opts=OPTS)
|
|
251
251
|
rollback = opts[:rollback]
|
|
252
252
|
begin
|
|
@@ -538,7 +538,7 @@ module Sequel
|
|
|
538
538
|
end
|
|
539
539
|
|
|
540
540
|
# Finish a subtransaction. If savepoints are supported, pops the current
|
|
541
|
-
#
|
|
541
|
+
# transaction off the savepoint stack.
|
|
542
542
|
def transaction_finished?(conn)
|
|
543
543
|
if supports_savepoints?
|
|
544
544
|
stack = _trans(conn)[:savepoints]
|
|
@@ -1343,7 +1343,7 @@ module Sequel
|
|
|
1343
1343
|
Sequel.|(*cond)
|
|
1344
1344
|
end
|
|
1345
1345
|
|
|
1346
|
-
# Downcase identifiers by default when
|
|
1346
|
+
# Downcase identifiers by default when outputting them from the database.
|
|
1347
1347
|
def output_identifier(v)
|
|
1348
1348
|
v = 'untitled' if v == ''
|
|
1349
1349
|
v.to_s.downcase.to_sym
|
|
@@ -25,7 +25,7 @@ module Sequel
|
|
|
25
25
|
false
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
# :
|
|
28
|
+
# simplecov:disable
|
|
29
29
|
|
|
30
30
|
# Whether the dataset requires SQL standard datetimes. False by default,
|
|
31
31
|
# as most allow strings with ISO 8601 format. Only for backwards compatibility,
|
|
@@ -34,7 +34,7 @@ module Sequel
|
|
|
34
34
|
# SEQUEL6: Remove
|
|
35
35
|
false
|
|
36
36
|
end
|
|
37
|
-
# :
|
|
37
|
+
# simplecov:enable
|
|
38
38
|
|
|
39
39
|
# Whether type specifiers are required for prepared statement/bound
|
|
40
40
|
# variable argument placeholders (i.e. :bv__integer), false by default.
|
|
@@ -188,14 +188,14 @@ module Sequel
|
|
|
188
188
|
true
|
|
189
189
|
end
|
|
190
190
|
|
|
191
|
-
# :
|
|
191
|
+
# simplecov:disable
|
|
192
192
|
|
|
193
193
|
# Whether the dataset supports timezones in literal timestamps, false by default.
|
|
194
194
|
def supports_timestamp_timezones?
|
|
195
195
|
# SEQUEL6: Remove
|
|
196
196
|
false
|
|
197
197
|
end
|
|
198
|
-
# :
|
|
198
|
+
# simplecov:enable
|
|
199
199
|
|
|
200
200
|
# Whether the dataset supports fractional seconds in literal timestamps, true by default.
|
|
201
201
|
def supports_timestamp_usecs?
|
data/lib/sequel/dataset/graph.rb
CHANGED
|
@@ -165,7 +165,7 @@ module Sequel
|
|
|
165
165
|
# columns in the subselect, qualified by the subselect alias.
|
|
166
166
|
Sequel.qualify(qualifier, Sequel.identifier(column))
|
|
167
167
|
else
|
|
168
|
-
# Initial dataset not wrapped in
|
|
168
|
+
# Initial dataset not wrapped in subselect, just make
|
|
169
169
|
# sure columns are qualified in some way.
|
|
170
170
|
qualified_expression(sel, qualifier)
|
|
171
171
|
end
|
data/lib/sequel/dataset/misc.rb
CHANGED
|
@@ -76,7 +76,7 @@ module Sequel
|
|
|
76
76
|
super
|
|
77
77
|
end
|
|
78
78
|
else
|
|
79
|
-
# :
|
|
79
|
+
# simplecov:disable
|
|
80
80
|
def freeze # :nodoc:
|
|
81
81
|
self
|
|
82
82
|
end
|
|
@@ -84,7 +84,7 @@ module Sequel
|
|
|
84
84
|
def frozen? # :nodoc:
|
|
85
85
|
true
|
|
86
86
|
end
|
|
87
|
-
# :
|
|
87
|
+
# simplecov:enable
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
# Alias of +first_source_alias+
|
|
@@ -259,7 +259,7 @@ module Sequel
|
|
|
259
259
|
# underscore are reserved for internal use.
|
|
260
260
|
attr_reader :cache
|
|
261
261
|
|
|
262
|
-
#
|
|
262
|
+
# Retrieve a value from the dataset's cache in a thread safe manner.
|
|
263
263
|
def cache_get(k)
|
|
264
264
|
Sequel.synchronize{@cache[k]}
|
|
265
265
|
end
|