sequel 3.47.0 → 3.48.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +230 -0
- data/README.rdoc +31 -40
- data/Rakefile +1 -14
- data/doc/active_record.rdoc +29 -29
- data/doc/association_basics.rdoc +4 -13
- data/doc/cheat_sheet.rdoc +8 -6
- data/doc/code_order.rdoc +89 -0
- data/doc/core_extensions.rdoc +3 -3
- data/doc/dataset_basics.rdoc +7 -8
- data/doc/dataset_filtering.rdoc +7 -2
- data/doc/mass_assignment.rdoc +2 -3
- data/doc/migration.rdoc +8 -8
- data/doc/model_hooks.rdoc +11 -7
- data/doc/object_model.rdoc +2 -2
- data/doc/opening_databases.rdoc +5 -14
- data/doc/prepared_statements.rdoc +5 -9
- data/doc/querying.rdoc +23 -28
- data/doc/reflection.rdoc +11 -0
- data/doc/release_notes/3.48.0.txt +477 -0
- data/doc/schema_modification.rdoc +12 -5
- data/doc/security.rdoc +2 -2
- data/doc/sharding.rdoc +1 -2
- data/doc/sql.rdoc +10 -13
- data/doc/testing.rdoc +8 -4
- data/doc/transactions.rdoc +2 -2
- data/doc/validations.rdoc +40 -17
- data/doc/virtual_rows.rdoc +2 -2
- data/lib/sequel/adapters/ado.rb +25 -20
- data/lib/sequel/adapters/ado/access.rb +1 -0
- data/lib/sequel/adapters/ado/mssql.rb +1 -0
- data/lib/sequel/adapters/db2.rb +9 -7
- data/lib/sequel/adapters/dbi.rb +16 -16
- data/lib/sequel/adapters/do.rb +17 -18
- data/lib/sequel/adapters/do/mysql.rb +1 -0
- data/lib/sequel/adapters/do/postgres.rb +2 -0
- data/lib/sequel/adapters/do/sqlite.rb +1 -0
- data/lib/sequel/adapters/firebird.rb +5 -7
- data/lib/sequel/adapters/ibmdb.rb +23 -20
- data/lib/sequel/adapters/informix.rb +8 -2
- data/lib/sequel/adapters/jdbc.rb +39 -35
- data/lib/sequel/adapters/jdbc/as400.rb +1 -0
- data/lib/sequel/adapters/jdbc/cubrid.rb +1 -0
- data/lib/sequel/adapters/jdbc/db2.rb +1 -0
- data/lib/sequel/adapters/jdbc/derby.rb +1 -0
- data/lib/sequel/adapters/jdbc/firebird.rb +1 -0
- data/lib/sequel/adapters/jdbc/h2.rb +1 -0
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -0
- data/lib/sequel/adapters/jdbc/informix.rb +1 -0
- data/lib/sequel/adapters/jdbc/jtds.rb +1 -0
- data/lib/sequel/adapters/jdbc/mssql.rb +1 -0
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -0
- data/lib/sequel/adapters/jdbc/oracle.rb +1 -0
- data/lib/sequel/adapters/jdbc/postgresql.rb +2 -0
- data/lib/sequel/adapters/jdbc/progress.rb +1 -0
- data/lib/sequel/adapters/jdbc/sqlite.rb +1 -0
- data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -0
- data/lib/sequel/adapters/mock.rb +30 -31
- data/lib/sequel/adapters/mysql.rb +6 -7
- data/lib/sequel/adapters/mysql2.rb +5 -6
- data/lib/sequel/adapters/odbc.rb +22 -20
- data/lib/sequel/adapters/odbc/mssql.rb +1 -0
- data/lib/sequel/adapters/openbase.rb +4 -1
- data/lib/sequel/adapters/oracle.rb +10 -8
- data/lib/sequel/adapters/postgres.rb +12 -10
- data/lib/sequel/adapters/shared/access.rb +6 -0
- data/lib/sequel/adapters/shared/cubrid.rb +2 -0
- data/lib/sequel/adapters/shared/db2.rb +2 -0
- data/lib/sequel/adapters/shared/firebird.rb +2 -0
- data/lib/sequel/adapters/shared/informix.rb +2 -0
- data/lib/sequel/adapters/shared/mssql.rb +14 -8
- data/lib/sequel/adapters/shared/mysql.rb +6 -0
- data/lib/sequel/adapters/shared/oracle.rb +2 -0
- data/lib/sequel/adapters/shared/postgres.rb +14 -4
- data/lib/sequel/adapters/shared/progress.rb +1 -0
- data/lib/sequel/adapters/shared/sqlite.rb +4 -3
- data/lib/sequel/adapters/sqlite.rb +6 -7
- data/lib/sequel/adapters/swift.rb +20 -21
- data/lib/sequel/adapters/swift/mysql.rb +1 -0
- data/lib/sequel/adapters/swift/postgres.rb +2 -0
- data/lib/sequel/adapters/swift/sqlite.rb +1 -0
- data/lib/sequel/adapters/tinytds.rb +5 -6
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +68 -0
- data/lib/sequel/connection_pool.rb +1 -1
- data/lib/sequel/core.rb +57 -50
- data/lib/sequel/database/connecting.rb +9 -10
- data/lib/sequel/database/dataset.rb +11 -6
- data/lib/sequel/database/dataset_defaults.rb +61 -69
- data/lib/sequel/database/features.rb +21 -0
- data/lib/sequel/database/misc.rb +23 -3
- data/lib/sequel/database/query.rb +13 -7
- data/lib/sequel/database/schema_methods.rb +6 -6
- data/lib/sequel/database/transactions.rb +1 -0
- data/lib/sequel/dataset/actions.rb +51 -38
- data/lib/sequel/dataset/features.rb +1 -0
- data/lib/sequel/dataset/graph.rb +9 -33
- data/lib/sequel/dataset/misc.rb +30 -5
- data/lib/sequel/dataset/mutation.rb +2 -3
- data/lib/sequel/dataset/prepared_statements.rb +1 -1
- data/lib/sequel/dataset/query.rb +91 -27
- data/lib/sequel/dataset/sql.rb +40 -6
- data/lib/sequel/deprecated.rb +74 -0
- data/lib/sequel/deprecated_core_extensions.rb +135 -0
- data/lib/sequel/extensions/columns_introspection.rb +1 -5
- data/lib/sequel/extensions/core_extensions.rb +10 -3
- data/lib/sequel/extensions/date_arithmetic.rb +1 -0
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +33 -0
- data/lib/sequel/extensions/filter_having.rb +58 -0
- data/lib/sequel/extensions/graph_each.rb +63 -0
- data/lib/sequel/extensions/hash_aliases.rb +44 -0
- data/lib/sequel/extensions/looser_typecasting.rb +14 -3
- data/lib/sequel/extensions/migration.rb +2 -3
- data/lib/sequel/extensions/named_timezones.rb +14 -1
- data/lib/sequel/extensions/null_dataset.rb +7 -1
- data/lib/sequel/extensions/pagination.rb +15 -5
- data/lib/sequel/extensions/pg_auto_parameterize.rb +1 -0
- data/lib/sequel/extensions/pg_hstore_ops.rb +48 -14
- data/lib/sequel/extensions/pg_json.rb +7 -7
- data/lib/sequel/extensions/pg_range_ops.rb +8 -2
- data/lib/sequel/extensions/pg_statement_cache.rb +1 -0
- data/lib/sequel/extensions/pretty_table.rb +13 -4
- data/lib/sequel/extensions/query.rb +21 -4
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +22 -0
- data/lib/sequel/extensions/schema_caching.rb +10 -7
- data/lib/sequel/extensions/schema_dumper.rb +35 -48
- data/lib/sequel/extensions/select_remove.rb +13 -4
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +117 -0
- data/lib/sequel/extensions/set_overrides.rb +43 -0
- data/lib/sequel/extensions/to_dot.rb +6 -0
- data/lib/sequel/model.rb +12 -6
- data/lib/sequel/model/associations.rb +80 -38
- data/lib/sequel/model/base.rb +137 -52
- data/lib/sequel/model/errors.rb +7 -2
- data/lib/sequel/plugins/active_model.rb +13 -0
- data/lib/sequel/plugins/after_initialize.rb +43 -0
- data/lib/sequel/plugins/association_proxies.rb +63 -7
- data/lib/sequel/plugins/auto_validations.rb +56 -16
- data/lib/sequel/plugins/blacklist_security.rb +63 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +9 -0
- data/lib/sequel/plugins/constraint_validations.rb +50 -8
- data/lib/sequel/plugins/dataset_associations.rb +2 -0
- data/lib/sequel/plugins/hook_class_methods.rb +7 -1
- data/lib/sequel/plugins/identity_map.rb +4 -0
- data/lib/sequel/plugins/json_serializer.rb +32 -13
- data/lib/sequel/plugins/optimistic_locking.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +4 -4
- data/lib/sequel/plugins/scissors.rb +33 -0
- data/lib/sequel/plugins/serialization.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +6 -0
- data/lib/sequel/plugins/tree.rb +5 -1
- data/lib/sequel/plugins/validation_class_methods.rb +2 -1
- data/lib/sequel/plugins/validation_helpers.rb +15 -11
- data/lib/sequel/plugins/xml_serializer.rb +12 -3
- data/lib/sequel/sql.rb +12 -2
- data/lib/sequel/timezones.rb +1 -1
- data/lib/sequel/version.rb +1 -1
- data/lib/sequel_core.rb +1 -0
- data/lib/sequel_model.rb +1 -0
- data/spec/adapters/mssql_spec.rb +24 -57
- data/spec/adapters/postgres_spec.rb +27 -55
- data/spec/adapters/spec_helper.rb +1 -1
- data/spec/adapters/sqlite_spec.rb +1 -1
- data/spec/bin_spec.rb +251 -0
- data/spec/core/database_spec.rb +46 -32
- data/spec/core/dataset_spec.rb +233 -181
- data/spec/core/deprecated_spec.rb +78 -0
- data/spec/core/expression_filters_spec.rb +3 -4
- data/spec/core/mock_adapter_spec.rb +9 -9
- data/spec/core/object_graph_spec.rb +9 -19
- data/spec/core/schema_spec.rb +3 -1
- data/spec/core/spec_helper.rb +19 -0
- data/spec/core_extensions_spec.rb +80 -30
- data/spec/extensions/after_initialize_spec.rb +24 -0
- data/spec/extensions/association_proxies_spec.rb +37 -1
- data/spec/extensions/auto_validations_spec.rb +20 -4
- data/spec/extensions/blacklist_security_spec.rb +87 -0
- data/spec/extensions/boolean_readers_spec.rb +2 -1
- data/spec/extensions/class_table_inheritance_spec.rb +7 -0
- data/spec/extensions/columns_introspection_spec.rb +3 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +83 -5
- data/spec/extensions/core_refinements_spec.rb +7 -7
- data/spec/extensions/dataset_associations_spec.rb +2 -2
- data/spec/extensions/date_arithmetic_spec.rb +1 -1
- data/spec/extensions/defaults_setter_spec.rb +2 -1
- data/spec/extensions/empty_array_ignore_nulls_spec.rb +24 -0
- data/spec/extensions/filter_having_spec.rb +40 -0
- data/spec/extensions/graph_each_spec.rb +109 -0
- data/spec/extensions/hash_aliases_spec.rb +16 -0
- data/spec/extensions/hook_class_methods_spec.rb +2 -2
- data/spec/extensions/identity_map_spec.rb +3 -3
- data/spec/extensions/json_serializer_spec.rb +19 -19
- data/spec/extensions/lazy_attributes_spec.rb +1 -0
- data/spec/extensions/list_spec.rb +13 -13
- data/spec/extensions/looser_typecasting_spec.rb +10 -3
- data/spec/extensions/many_through_many_spec.rb +1 -1
- data/spec/extensions/migration_spec.rb +7 -7
- data/spec/extensions/named_timezones_spec.rb +6 -0
- data/spec/extensions/nested_attributes_spec.rb +2 -2
- data/spec/extensions/null_dataset_spec.rb +1 -1
- data/spec/extensions/pagination_spec.rb +2 -2
- data/spec/extensions/pg_hstore_ops_spec.rb +75 -0
- data/spec/extensions/pg_range_ops_spec.rb +4 -2
- data/spec/extensions/pg_row_plugin_spec.rb +1 -1
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_literals_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +3 -3
- data/spec/extensions/schema_caching_spec.rb +3 -3
- data/spec/extensions/schema_dumper_spec.rb +27 -2
- data/spec/extensions/schema_spec.rb +2 -2
- data/spec/extensions/scissors_spec.rb +26 -0
- data/spec/extensions/select_remove_spec.rb +1 -1
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +102 -0
- data/spec/extensions/set_overrides_spec.rb +45 -0
- data/spec/extensions/single_table_inheritance_spec.rb +10 -0
- data/spec/extensions/spec_helper.rb +24 -1
- data/spec/extensions/static_cache_spec.rb +1 -1
- data/spec/extensions/string_stripper_spec.rb +2 -1
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/typecast_on_load_spec.rb +3 -2
- data/spec/extensions/update_primary_key_spec.rb +2 -2
- data/spec/extensions/validation_class_methods_spec.rb +19 -19
- data/spec/extensions/validation_helpers_spec.rb +30 -21
- data/spec/extensions/xml_serializer_spec.rb +5 -5
- data/spec/integration/associations_test.rb +10 -30
- data/spec/integration/dataset_test.rb +20 -24
- data/spec/integration/eager_loader_test.rb +5 -5
- data/spec/integration/model_test.rb +3 -3
- data/spec/integration/plugin_test.rb +7 -39
- data/spec/integration/schema_test.rb +4 -38
- data/spec/integration/spec_helper.rb +2 -1
- data/spec/model/association_reflection_spec.rb +70 -5
- data/spec/model/associations_spec.rb +11 -11
- data/spec/model/base_spec.rb +25 -8
- data/spec/model/class_dataset_methods_spec.rb +143 -0
- data/spec/model/dataset_methods_spec.rb +1 -1
- data/spec/model/eager_loading_spec.rb +25 -25
- data/spec/model/hooks_spec.rb +1 -1
- data/spec/model/model_spec.rb +22 -7
- data/spec/model/plugins_spec.rb +1 -6
- data/spec/model/record_spec.rb +37 -29
- data/spec/model/spec_helper.rb +23 -1
- data/spec/model/validations_spec.rb +15 -17
- metadata +32 -3
data/lib/sequel/core.rb
CHANGED
@@ -28,15 +28,10 @@ module Sequel
|
|
28
28
|
@convert_two_digit_years = true
|
29
29
|
@datetime_class = Time
|
30
30
|
@empty_array_handle_nulls = true
|
31
|
-
|
32
|
-
@require_thread = nil
|
33
|
-
|
34
|
-
# Mutex used to protect file loading/requireing
|
35
|
-
@require_mutex = Mutex.new
|
36
|
-
|
31
|
+
|
37
32
|
# Whether Sequel is being run in single threaded mode
|
38
33
|
@single_threaded = false
|
39
|
-
|
34
|
+
|
40
35
|
class << self
|
41
36
|
# Sequel converts two digit years in <tt>Date</tt>s and <tt>DateTime</tt>s by default,
|
42
37
|
# so 01/02/03 is interpreted at January 2nd, 2003, and 12/13/99 is interpreted
|
@@ -79,29 +74,30 @@ module Sequel
|
|
79
74
|
#
|
80
75
|
# This may not handle NULLs correctly, but can be much faster on
|
81
76
|
# some databases.
|
82
|
-
|
77
|
+
attr_reader :empty_array_handle_nulls
|
78
|
+
|
79
|
+
def empty_array_handle_nulls=(v)
|
80
|
+
Sequel::Deprecation.deprecate('Sequel.empty_array_handle_nulls=', 'Please switch to loading the empty_array_ignore_nulls plugin if you wish empty array handling to ignore nulls')
|
81
|
+
@empty_array_handle_nulls = v
|
82
|
+
end
|
83
83
|
|
84
|
-
#
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
84
|
+
# REMOVE40
|
85
|
+
def virtual_row_instance_eval
|
86
|
+
Sequel::Deprecation.deprecate('Sequel.virtual_row_instance_eval', 'It has no effect, so you can safely stop calling it.')
|
87
|
+
end
|
88
|
+
def virtual_row_instance_eval=(v)
|
89
|
+
Sequel::Deprecation.deprecate('Sequel.virtual_row_instance_eval=', 'It has no effect, so you can safely stop calling it.')
|
90
|
+
end
|
91
|
+
def k_require(*a)
|
92
|
+
Sequel::Deprecation.deprecate('Sequel.k_require', 'Please switch to Kernel.require')
|
93
|
+
Kernel.require(*a)
|
94
|
+
end
|
89
95
|
|
90
96
|
private
|
91
97
|
|
92
98
|
# Make thread safe requiring reentrant to prevent deadlocks.
|
93
99
|
def check_requiring_thread
|
94
|
-
|
95
|
-
t = Thread.current
|
96
|
-
return(yield) if @require_thread == t
|
97
|
-
@require_mutex.synchronize do
|
98
|
-
begin
|
99
|
-
@require_thread = t
|
100
|
-
yield
|
101
|
-
ensure
|
102
|
-
@require_thread = nil
|
103
|
-
end
|
104
|
-
end
|
100
|
+
Sequel::Deprecation.deprecate('Sequel.check_requiring_thread', 'It has no effect, so you can safely stop calling it.')
|
105
101
|
end
|
106
102
|
end
|
107
103
|
|
@@ -119,7 +115,7 @@ module Sequel
|
|
119
115
|
when Hash
|
120
116
|
true
|
121
117
|
when Array
|
122
|
-
!obj.empty? && !obj.is_a?(SQL::ValueList) && obj.all?{|i| (Array
|
118
|
+
!obj.empty? && !obj.is_a?(SQL::ValueList) && obj.all?{|i| i.is_a?(Array) && (i.length == 2)}
|
123
119
|
else
|
124
120
|
false
|
125
121
|
end
|
@@ -152,7 +148,7 @@ module Sequel
|
|
152
148
|
def self.core_extensions?
|
153
149
|
false
|
154
150
|
end
|
155
|
-
|
151
|
+
|
156
152
|
# Convert the +exception+ to the given class. The given class should be
|
157
153
|
# <tt>Sequel::Error</tt> or a subclass. Returns an instance of +klass+ with
|
158
154
|
# the message and backtrace of +exception+.
|
@@ -175,7 +171,7 @@ module Sequel
|
|
175
171
|
# Sequel.extension(:schema_dumper)
|
176
172
|
# Sequel.extension(:pagination, :query)
|
177
173
|
def self.extension(*extensions)
|
178
|
-
extensions.each{|e|
|
174
|
+
extensions.each{|e| Kernel.require "sequel/extensions/#{e}"}
|
179
175
|
end
|
180
176
|
|
181
177
|
# Set the method to call on identifiers going into the database. This affects
|
@@ -192,7 +188,7 @@ module Sequel
|
|
192
188
|
def self.identifier_input_method=(value)
|
193
189
|
Database.identifier_input_method = value
|
194
190
|
end
|
195
|
-
|
191
|
+
|
196
192
|
# Set the method to call on identifiers coming out of the database. This affects
|
197
193
|
# the literalization of identifiers by calling this method on them when they are
|
198
194
|
# retrieved from the database. Sequel downcases identifiers retrieved for most
|
@@ -209,12 +205,24 @@ module Sequel
|
|
209
205
|
Database.identifier_output_method = value
|
210
206
|
end
|
211
207
|
|
208
|
+
# The exception classed raised if there is an error parsing JSON.
|
209
|
+
# This can be overridden to use an alternative json implementation.
|
210
|
+
def self.json_parser_error_class
|
211
|
+
JSON::ParserError
|
212
|
+
end
|
213
|
+
|
214
|
+
# Convert given object to json and return the result.
|
215
|
+
# This can be overridden to use an alternative json implementation.
|
216
|
+
def self.object_to_json(obj, *args)
|
217
|
+
obj.to_json(*args)
|
218
|
+
end
|
219
|
+
|
212
220
|
# Parse the string as JSON and return the result.
|
213
|
-
# This
|
214
|
-
def self.parse_json(json)
|
221
|
+
# This can be overridden to use an alternative json implementation.
|
222
|
+
def self.parse_json(json)
|
215
223
|
JSON.parse(json, :create_additions=>false)
|
216
224
|
end
|
217
|
-
|
225
|
+
|
218
226
|
# Set whether to quote identifiers for all databases by default. By default,
|
219
227
|
# Sequel quotes identifiers in all SQL strings, so to turn that off:
|
220
228
|
#
|
@@ -235,7 +243,7 @@ module Sequel
|
|
235
243
|
end
|
236
244
|
end
|
237
245
|
end
|
238
|
-
|
246
|
+
|
239
247
|
# Require all given +files+ which should be in the same or a subdirectory of
|
240
248
|
# this file. If a +subdir+ is given, assume all +files+ are in that subdir.
|
241
249
|
# This is used to ensure that the files loaded are from the same version of
|
@@ -243,7 +251,7 @@ module Sequel
|
|
243
251
|
def self.require(files, subdir=nil)
|
244
252
|
Array(files).each{|f| super("#{File.dirname(__FILE__).untaint}/#{"#{subdir}/" if subdir}#{f}")}
|
245
253
|
end
|
246
|
-
|
254
|
+
|
247
255
|
# Set whether Sequel is being used in single threaded mode. By default,
|
248
256
|
# Sequel uses a thread-safe connection pool, which isn't as fast as the
|
249
257
|
# single threaded connection pool, and also has some additional thread
|
@@ -377,14 +385,14 @@ module Sequel
|
|
377
385
|
end
|
378
386
|
end
|
379
387
|
|
380
|
-
#
|
388
|
+
# REMOVE40
|
381
389
|
def self.ts_require(*args)
|
382
|
-
|
390
|
+
Sequel::Deprecation.deprecate('Sequel.ts_require', 'Please switch to Sequel.require')
|
391
|
+
require(*args)
|
383
392
|
end
|
384
|
-
|
385
|
-
# Same as Kernel.require, but wrapped in a mutex in order to be thread safe.
|
386
393
|
def self.tsk_require(*args)
|
387
|
-
|
394
|
+
Sequel::Deprecation.deprecate('Sequel.tsk_require', 'Please switch to Kernel.require')
|
395
|
+
Kernel.require(*args)
|
388
396
|
end
|
389
397
|
|
390
398
|
# If the supplied block takes a single argument,
|
@@ -403,21 +411,20 @@ module Sequel
|
|
403
411
|
block.call(vr)
|
404
412
|
end
|
405
413
|
end
|
406
|
-
|
414
|
+
|
407
415
|
### Private Class Methods ###
|
408
416
|
|
409
417
|
# Helper method that the database adapter class methods that are added to Sequel via
|
410
418
|
# metaprogramming use to parse arguments.
|
411
|
-
def self.adapter_method(adapter, *args, &block)
|
412
|
-
|
413
|
-
opts = {:adapter=>adapter.to_sym}
|
414
|
-
opts[:database] = args.shift if args.
|
415
|
-
if
|
416
|
-
opts.merge!(arg)
|
417
|
-
elsif !arg.nil?
|
419
|
+
def self.adapter_method(adapter, *args, &block)
|
420
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
421
|
+
opts = {:adapter => adapter.to_sym}
|
422
|
+
opts[:database] = args.shift if args.first.is_a?(String)
|
423
|
+
if args.any?
|
418
424
|
raise ::Sequel::Error, "Wrong format of arguments, either use (), (String), (Hash), or (String, Hash)"
|
419
425
|
end
|
420
|
-
|
426
|
+
|
427
|
+
connect(opts.merge(options), &block)
|
421
428
|
end
|
422
429
|
|
423
430
|
# Method that adds a database adapter class method to Sequel that calls
|
@@ -432,11 +439,11 @@ module Sequel
|
|
432
439
|
end
|
433
440
|
|
434
441
|
private_class_method :adapter_method, :def_adapter_method
|
435
|
-
|
436
|
-
require(%w"sql connection_pool exceptions dataset database timezones ast_transformer version")
|
442
|
+
|
443
|
+
require(%w"deprecated sql connection_pool exceptions dataset database timezones ast_transformer version")
|
437
444
|
if !defined?(::SEQUEL_NO_CORE_EXTENSIONS) && !ENV.has_key?('SEQUEL_NO_CORE_EXTENSIONS')
|
438
445
|
# :nocov:
|
439
|
-
|
446
|
+
require(:deprecated_core_extensions)
|
440
447
|
# :nocov:
|
441
448
|
end
|
442
449
|
|
@@ -8,8 +8,12 @@ module Sequel
|
|
8
8
|
# Array of supported database adapters
|
9
9
|
ADAPTERS = %w'ado amalgalite cubrid db2 dbi do firebird ibmdb informix jdbc mock mysql mysql2 odbc openbase oracle postgres sqlite swift tinytds'.collect{|x| x.to_sym}
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
@single_threaded = false
|
12
|
+
|
13
|
+
class << self
|
14
|
+
# Whether to use the single threaded connection pool by default
|
15
|
+
attr_accessor :single_threaded
|
16
|
+
end
|
13
17
|
|
14
18
|
# The Database subclass for the given adapter scheme.
|
15
19
|
# Raises Sequel::AdapterNotFound if the adapter
|
@@ -22,7 +26,7 @@ module Sequel
|
|
22
26
|
unless klass = ADAPTER_MAP[scheme]
|
23
27
|
# attempt to load the adapter file
|
24
28
|
begin
|
25
|
-
|
29
|
+
require "sequel/adapters/#{scheme}"
|
26
30
|
rescue LoadError => e
|
27
31
|
raise Sequel.convert_exception_class(e, AdapterNotFound)
|
28
32
|
end
|
@@ -37,7 +41,7 @@ module Sequel
|
|
37
41
|
|
38
42
|
# Returns the scheme symbol for the Database class.
|
39
43
|
def self.adapter_scheme
|
40
|
-
@scheme
|
44
|
+
@scheme
|
41
45
|
end
|
42
46
|
|
43
47
|
# Connects to a database. See Sequel.connect.
|
@@ -86,12 +90,6 @@ module Sequel
|
|
86
90
|
db
|
87
91
|
end
|
88
92
|
|
89
|
-
# Sets the default single_threaded mode for new databases.
|
90
|
-
# See Sequel.single_threaded=.
|
91
|
-
def self.single_threaded=(value)
|
92
|
-
@@single_threaded = value
|
93
|
-
end
|
94
|
-
|
95
93
|
# Sets the adapter scheme for the Database class. Call this method in
|
96
94
|
# descendants of Database to allow connection using a URL. For example the
|
97
95
|
# following:
|
@@ -142,6 +140,7 @@ module Sequel
|
|
142
140
|
|
143
141
|
# Connects to the database. This method should be overridden by descendants.
|
144
142
|
def connect(server)
|
143
|
+
Sequel::Deprecation.deprecate('Database#connect default implementation and Sequel::NotImplemented', 'All database instance can be assumed to implement connect.')
|
145
144
|
raise NotImplemented, "#connect should be overridden by adapters"
|
146
145
|
end
|
147
146
|
|
@@ -17,15 +17,20 @@ module Sequel
|
|
17
17
|
#
|
18
18
|
# DB[:items].sql #=> "SELECT * FROM items"
|
19
19
|
def [](*args)
|
20
|
-
|
20
|
+
args.first.is_a?(String) ? fetch(*args) : from(*args)
|
21
21
|
end
|
22
22
|
|
23
23
|
# Returns a blank dataset for this database.
|
24
24
|
#
|
25
25
|
# DB.dataset # SELECT *
|
26
26
|
# DB.dataset.from(:items) # SELECT * FROM items
|
27
|
-
def dataset(opts=nil)
|
28
|
-
|
27
|
+
def dataset(opts=(no_arg_given=true; nil))
|
28
|
+
# REMOVE40
|
29
|
+
if no_arg_given
|
30
|
+
@dataset_class.new(self)
|
31
|
+
else
|
32
|
+
@dataset_class.new(self, opts)
|
33
|
+
end
|
29
34
|
end
|
30
35
|
|
31
36
|
# Fetches records for an arbitrary SQL statement. If a block is given,
|
@@ -42,7 +47,7 @@ module Sequel
|
|
42
47
|
#
|
43
48
|
# DB.fetch('SELECT * FROM items WHERE name = ?', my_name).all
|
44
49
|
def fetch(sql, *args, &block)
|
45
|
-
ds =
|
50
|
+
ds = @default_dataset.with_sql(sql, *args)
|
46
51
|
ds.each(&block) if block
|
47
52
|
ds
|
48
53
|
end
|
@@ -53,7 +58,7 @@ module Sequel
|
|
53
58
|
# DB.from(:items) # SELECT * FROM items
|
54
59
|
# DB.from(:items){id > 2} # SELECT * FROM items WHERE (id > 2)
|
55
60
|
def from(*args, &block)
|
56
|
-
ds =
|
61
|
+
ds = @default_dataset.from(*args)
|
57
62
|
block ? ds.filter(&block) : ds
|
58
63
|
end
|
59
64
|
|
@@ -63,7 +68,7 @@ module Sequel
|
|
63
68
|
# DB.select{server_version{}} # SELECT server_version()
|
64
69
|
# DB.select(:id).from(:items) # SELECT id FROM items
|
65
70
|
def select(*args, &block)
|
66
|
-
|
71
|
+
@default_dataset.select(*args, &block)
|
67
72
|
end
|
68
73
|
end
|
69
74
|
end
|
@@ -8,52 +8,54 @@ module Sequel
|
|
8
8
|
# The default class to use for datasets
|
9
9
|
DatasetClass = Sequel::Dataset
|
10
10
|
|
11
|
-
|
12
|
-
|
11
|
+
@identifier_input_method = nil
|
12
|
+
@identifier_output_method = nil
|
13
|
+
@quote_identifiers = nil
|
13
14
|
|
14
|
-
|
15
|
-
|
15
|
+
class << self
|
16
|
+
# The identifier input method to use by default for all databases (default: adapter default)
|
17
|
+
attr_reader :identifier_input_method
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
+
# The identifier output method to use by default for all databases (default: adapter default)
|
20
|
+
attr_reader :identifier_output_method
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
@@identifier_input_method
|
22
|
+
# Whether to quote identifiers (columns and tables) by default for all databases (default: adapter default)
|
23
|
+
attr_accessor :quote_identifiers
|
23
24
|
end
|
24
|
-
|
25
|
-
#
|
26
|
-
# See Sequel.identifier_input_method=.
|
25
|
+
|
26
|
+
# Change the default identifier input method to use for all databases,
|
27
27
|
def self.identifier_input_method=(v)
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
# The method to call on identifiers coming from the database
|
32
|
-
def self.identifier_output_method
|
33
|
-
@@identifier_output_method
|
34
|
-
end
|
35
|
-
|
36
|
-
# Set the method to call on identifiers coming from the database
|
37
|
-
# See Sequel.identifier_output_method=.
|
38
|
-
def self.identifier_output_method=(v)
|
39
|
-
@@identifier_output_method = v || ""
|
28
|
+
@identifier_input_method = v.nil? ? false : v
|
40
29
|
end
|
41
30
|
|
42
|
-
#
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
end
|
31
|
+
# Change the default identifier output method to use for all databases,
|
32
|
+
def self.identifier_output_method=(v)
|
33
|
+
@identifier_output_method = v.nil? ? false : v
|
34
|
+
end
|
47
35
|
|
48
36
|
# The class to use for creating datasets. Should respond to
|
49
37
|
# new with the Database argument as the first argument, and
|
50
38
|
# an optional options hash.
|
51
39
|
attr_reader :dataset_class
|
52
40
|
|
53
|
-
# The
|
54
|
-
|
55
|
-
|
56
|
-
|
41
|
+
# The identifier input method to use by default for this database (default: adapter default)
|
42
|
+
attr_reader :identifier_input_method
|
43
|
+
|
44
|
+
# The identifier output method to use by default for this database (default: adapter default)
|
45
|
+
attr_reader :identifier_output_method
|
46
|
+
|
47
|
+
# REMOVE40
|
48
|
+
def _default_schema
|
49
|
+
@default_schema
|
50
|
+
end
|
51
|
+
def default_schema
|
52
|
+
Sequel::Deprecation.deprecate('Database#default_schema', 'Use qualified tables instead')
|
53
|
+
@default_schema
|
54
|
+
end
|
55
|
+
def default_schema=(v)
|
56
|
+
Sequel::Deprecation.deprecate('Database#default_schema=', 'Use qualified tables instead') if v
|
57
|
+
@default_schema = v
|
58
|
+
end
|
57
59
|
|
58
60
|
# If the database has any dataset modules associated with it,
|
59
61
|
# use a subclass of the given class that includes the modules
|
@@ -64,6 +66,7 @@ module Sequel
|
|
64
66
|
@dataset_modules.each{|m| c.send(:include, m)}
|
65
67
|
end
|
66
68
|
@dataset_class = c
|
69
|
+
reset_default_dataset
|
67
70
|
end
|
68
71
|
|
69
72
|
# Equivalent to extending all datasets produced by the database with a
|
@@ -90,7 +93,6 @@ module Sequel
|
|
90
93
|
# end
|
91
94
|
def extend_datasets(mod=nil, &block)
|
92
95
|
raise(Error, "must provide either mod or block, not both") if mod && block
|
93
|
-
reset_schema_utility_dataset
|
94
96
|
mod = Module.new(&block) if block
|
95
97
|
if @dataset_modules.empty?
|
96
98
|
@dataset_modules = [mod]
|
@@ -99,42 +101,17 @@ module Sequel
|
|
99
101
|
@dataset_modules << mod
|
100
102
|
end
|
101
103
|
@dataset_class.send(:include, mod)
|
104
|
+
reset_default_dataset
|
102
105
|
end
|
103
106
|
|
104
|
-
# The method to call on identifiers going into the database
|
105
|
-
def identifier_input_method
|
106
|
-
case @identifier_input_method
|
107
|
-
when nil
|
108
|
-
@identifier_input_method = @opts.fetch(:identifier_input_method, (@@identifier_input_method.nil? ? identifier_input_method_default : @@identifier_input_method))
|
109
|
-
@identifier_input_method == "" ? nil : @identifier_input_method
|
110
|
-
when ""
|
111
|
-
nil
|
112
|
-
else
|
113
|
-
@identifier_input_method
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
107
|
# Set the method to call on identifiers going into the database:
|
118
108
|
#
|
119
109
|
# DB[:items] # SELECT * FROM items
|
120
110
|
# DB.identifier_input_method = :upcase
|
121
111
|
# DB[:items] # SELECT * FROM ITEMS
|
122
112
|
def identifier_input_method=(v)
|
123
|
-
|
124
|
-
@identifier_input_method = v
|
125
|
-
end
|
126
|
-
|
127
|
-
# The method to call on identifiers coming from the database
|
128
|
-
def identifier_output_method
|
129
|
-
case @identifier_output_method
|
130
|
-
when nil
|
131
|
-
@identifier_output_method = @opts.fetch(:identifier_output_method, (@@identifier_output_method.nil? ? identifier_output_method_default : @@identifier_output_method))
|
132
|
-
@identifier_output_method == "" ? nil : @identifier_output_method
|
133
|
-
when ""
|
134
|
-
nil
|
135
|
-
else
|
136
|
-
@identifier_output_method
|
137
|
-
end
|
113
|
+
reset_default_dataset
|
114
|
+
@identifier_input_method = v
|
138
115
|
end
|
139
116
|
|
140
117
|
# Set the method to call on identifiers coming from the database:
|
@@ -143,8 +120,8 @@ module Sequel
|
|
143
120
|
# DB.identifier_output_method = :upcase
|
144
121
|
# DB[:items].first # {:ID=>1, :NAME=>'foo'}
|
145
122
|
def identifier_output_method=(v)
|
146
|
-
|
147
|
-
@identifier_output_method = v
|
123
|
+
reset_default_dataset
|
124
|
+
@identifier_output_method = v
|
148
125
|
end
|
149
126
|
|
150
127
|
# Set whether to quote identifiers (columns and tables) for this database:
|
@@ -153,14 +130,13 @@ module Sequel
|
|
153
130
|
# DB.quote_identifiers = true
|
154
131
|
# DB[:items] # SELECT * FROM "items"
|
155
132
|
def quote_identifiers=(v)
|
156
|
-
|
133
|
+
reset_default_dataset
|
157
134
|
@quote_identifiers = v
|
158
135
|
end
|
159
136
|
|
160
137
|
# Returns true if the database quotes identifiers.
|
161
138
|
def quote_identifiers?
|
162
|
-
|
163
|
-
@quote_identifiers = @opts.fetch(:quote_identifiers, (@@quote_identifiers.nil? ? quote_identifiers_default : @@quote_identifiers))
|
139
|
+
@quote_identifiers
|
164
140
|
end
|
165
141
|
|
166
142
|
private
|
@@ -169,12 +145,19 @@ module Sequel
|
|
169
145
|
def dataset_class_default
|
170
146
|
self.class.const_get(:DatasetClass)
|
171
147
|
end
|
172
|
-
|
173
|
-
#
|
148
|
+
|
149
|
+
# REMOVE40
|
174
150
|
def default_schema_default
|
175
151
|
nil
|
176
152
|
end
|
177
153
|
|
154
|
+
# Reset the default dataset used by most Database methods that
|
155
|
+
# create datasets. Usually done after changes to the identifier
|
156
|
+
# mangling methods.
|
157
|
+
def reset_default_dataset
|
158
|
+
@default_dataset = dataset
|
159
|
+
end
|
160
|
+
|
178
161
|
# The method to apply to identifiers going into the database by default.
|
179
162
|
# Should be overridden in subclasses for databases that fold unquoted
|
180
163
|
# identifiers to lower case instead of uppercase, such as
|
@@ -196,5 +179,14 @@ module Sequel
|
|
196
179
|
def quote_identifiers_default
|
197
180
|
true
|
198
181
|
end
|
182
|
+
|
183
|
+
# Reset the identifier mangling options. Overrides any already set on
|
184
|
+
# the instance. Only for internal use by shared adapters.
|
185
|
+
def reset_identifier_mangling
|
186
|
+
@quote_identifiers = @opts.fetch(:quote_identifiers){(qi = Database.quote_identifiers).nil? ? quote_identifiers_default : qi}
|
187
|
+
@identifier_input_method = @opts.fetch(:identifier_input_method){(iim = Database.identifier_input_method).nil? ? identifier_input_method_default : (iim if iim)}
|
188
|
+
@identifier_output_method = @opts.fetch(:identifier_output_method){(iom = Database.identifier_output_method).nil? ? identifier_output_method_default : (iom if iom)}
|
189
|
+
reset_default_dataset
|
190
|
+
end
|
199
191
|
end
|
200
192
|
end
|