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
@@ -36,6 +36,17 @@ module Sequel
|
|
36
36
|
supports_create_table_if_not_exists?
|
37
37
|
end
|
38
38
|
|
39
|
+
# Whether the database supports Database#foreign_key_list for
|
40
|
+
# parsing foreign keys.
|
41
|
+
def supports_foreign_key_parsing?
|
42
|
+
[:access, :mssql, :mysql, :postgres, :sqlite].include?(database_type)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Whether the database supports Database#indexes for parsing indexes.
|
46
|
+
def supports_index_parsing?
|
47
|
+
[:access, :cubrid, :db2, :mssql, :mysql, :postgres, :sqlite].include?(database_type) || adapter_scheme == :jdbc
|
48
|
+
end
|
49
|
+
|
39
50
|
# Whether the database and adapter support prepared transactions
|
40
51
|
# (two-phase commit), false by default.
|
41
52
|
def supports_prepared_transactions?
|
@@ -58,6 +69,16 @@ module Sequel
|
|
58
69
|
respond_to?(:schema_parse_table, true)
|
59
70
|
end
|
60
71
|
|
72
|
+
# Whether the database supports Database#tables for getting list of tables.
|
73
|
+
def supports_table_listing?
|
74
|
+
[:access, :cubrid, :db2, :firebird, :mssql, :mysql, :oracle, :postgres, :sqlite].include?(database_type) || adapter_scheme == :jdbc
|
75
|
+
end
|
76
|
+
#
|
77
|
+
# Whether the database supports Database#views for getting list of views.
|
78
|
+
def supports_view_listing?
|
79
|
+
supports_table_listing?
|
80
|
+
end
|
81
|
+
|
61
82
|
# Whether the database and adapter support transaction isolation levels, false by default.
|
62
83
|
def supports_transaction_isolation_levels?
|
63
84
|
false
|
data/lib/sequel/database/misc.rb
CHANGED
@@ -24,6 +24,14 @@ module Sequel
|
|
24
24
|
:time=>Sequel::SQLTime, :boolean=>[TrueClass, FalseClass].freeze, :float=>Float, :decimal=>BigDecimal,
|
25
25
|
:blob=>Sequel::SQL::Blob}.freeze
|
26
26
|
|
27
|
+
# Module to be included in shared adapters so that when the DatabaseMethods are
|
28
|
+
# included in the database, the identifier mangling defaults are reset correctly.
|
29
|
+
module ResetIdentifierMangling
|
30
|
+
def extended(obj)
|
31
|
+
obj.send(:reset_identifier_mangling)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
27
35
|
# Nested hook Proc; each new hook Proc just wraps the previous one.
|
28
36
|
@initialize_hook = Proc.new {|db| }
|
29
37
|
|
@@ -91,7 +99,6 @@ module Sequel
|
|
91
99
|
# options hash.
|
92
100
|
#
|
93
101
|
# Accepts the following options:
|
94
|
-
# :default_schema :: The default schema to use, see #default_schema.
|
95
102
|
# :default_string_column_size :: The default size of string columns, 255 by default.
|
96
103
|
# :identifier_input_method :: A string method symbol to call on identifiers going into the database
|
97
104
|
# :identifier_output_method :: A string method symbol to call on identifiers coming from the database
|
@@ -112,7 +119,7 @@ module Sequel
|
|
112
119
|
@opts[:servers] = {} if @opts[:servers].is_a?(String)
|
113
120
|
@opts[:adapter_class] = self.class
|
114
121
|
|
115
|
-
@opts[:single_threaded] = @single_threaded = typecast_value_boolean(@opts.fetch(:single_threaded,
|
122
|
+
@opts[:single_threaded] = @single_threaded = typecast_value_boolean(@opts.fetch(:single_threaded, Database.single_threaded))
|
116
123
|
@schemas = {}
|
117
124
|
@default_schema = @opts.fetch(:default_schema, default_schema_default)
|
118
125
|
@default_string_column_size = @opts[:default_string_column_size] || DEFAULT_STRING_COLUMN_SIZE
|
@@ -129,6 +136,9 @@ module Sequel
|
|
129
136
|
self.sql_log_level = @opts[:sql_log_level] ? @opts[:sql_log_level].to_sym : :info
|
130
137
|
@pool = ConnectionPool.get_pool(self, @opts)
|
131
138
|
|
139
|
+
reset_identifier_mangling
|
140
|
+
adapter_initialize
|
141
|
+
|
132
142
|
unless typecast_value_boolean(@opts[:keep_reference]) == false
|
133
143
|
Sequel.synchronize{::Sequel::DATABASES.push(self)}
|
134
144
|
end
|
@@ -295,6 +305,10 @@ module Sequel
|
|
295
305
|
|
296
306
|
private
|
297
307
|
|
308
|
+
# Per adapter initialization method, empty by default.
|
309
|
+
def adapter_initialize
|
310
|
+
end
|
311
|
+
|
298
312
|
# Returns true when the object is considered blank.
|
299
313
|
# The only objects that are blank are nil, false,
|
300
314
|
# strings with all whitespace, and ones that respond
|
@@ -479,7 +493,13 @@ module Sequel
|
|
479
493
|
|
480
494
|
# Typecast the value to a String
|
481
495
|
def typecast_value_string(value)
|
482
|
-
value
|
496
|
+
case value
|
497
|
+
when Hash, Array
|
498
|
+
Sequel::Deprecation.deprecate('Automatically typecasting a hash or array to string for a string column', 'Either typecast the input manually or use the looser_typecasting extension')
|
499
|
+
value.to_s
|
500
|
+
else
|
501
|
+
value.to_s
|
502
|
+
end
|
483
503
|
end
|
484
504
|
|
485
505
|
# Typecast the value to a Time
|
@@ -39,6 +39,7 @@ module Sequel
|
|
39
39
|
# Executes the given SQL on the database. This method should be overridden in descendants.
|
40
40
|
# This method should not be called directly by user code.
|
41
41
|
def execute(sql, opts={})
|
42
|
+
Sequel::Deprecation.deprecate('Database#execute default implementation and Sequel::NotImplemented', 'All database instances can be assumed to implement execute')
|
42
43
|
raise NotImplemented, "#execute should be overridden by adapters"
|
43
44
|
end
|
44
45
|
|
@@ -78,6 +79,7 @@ module Sequel
|
|
78
79
|
# :on_delete :: The action to take ON DELETE
|
79
80
|
# :on_update :: The action to take ON UPDATE
|
80
81
|
def foreign_key_list(table, opts={})
|
82
|
+
Sequel::Deprecation.deprecate('Database#foreign_key_list default implementation and Sequel::NotImplemented', 'Use Database#supports_foreign_key_parsing? to check for support')
|
81
83
|
raise NotImplemented, "#foreign_key_list should be overridden by adapters"
|
82
84
|
end
|
83
85
|
|
@@ -87,7 +89,7 @@ module Sequel
|
|
87
89
|
# # => 1
|
88
90
|
# DB.get{server_version{}} # SELECT server_version()
|
89
91
|
def get(*args, &block)
|
90
|
-
|
92
|
+
@default_dataset.get(*args, &block)
|
91
93
|
end
|
92
94
|
|
93
95
|
# Return a hash containing index information for the table. Hash keys are index name symbols.
|
@@ -100,6 +102,7 @@ module Sequel
|
|
100
102
|
# DB.indexes(:artists)
|
101
103
|
# # => {:artists_name_ukey=>{:columns=>[:name], :unique=>true}}
|
102
104
|
def indexes(table, opts={})
|
105
|
+
Sequel::Deprecation.deprecate('Database#indexes default implementation and Sequel::NotImplemented', 'Use Database#supports_index_parsing? to check for support')
|
103
106
|
raise NotImplemented, "#indexes should be overridden by adapters"
|
104
107
|
end
|
105
108
|
|
@@ -219,6 +222,7 @@ module Sequel
|
|
219
222
|
#
|
220
223
|
# DB.tables # => [:albums, :artists]
|
221
224
|
def tables(opts={})
|
225
|
+
Sequel::Deprecation.deprecate('Database#tables default implementation and Sequel::NotImplemented', 'Use Database#supports_table_listing? to check for support')
|
222
226
|
raise NotImplemented, "#tables should be overridden by adapters"
|
223
227
|
end
|
224
228
|
|
@@ -226,6 +230,7 @@ module Sequel
|
|
226
230
|
#
|
227
231
|
# DB.views # => [:gold_albums, :artists_with_many_albums]
|
228
232
|
def views(opts={})
|
233
|
+
Sequel::Deprecation.deprecate('Database#views default implementation and Sequel::NotImplemented', 'Use Database#supports_view_listing? to check for support')
|
229
234
|
raise NotImplemented, "#views should be overridden by adapters"
|
230
235
|
end
|
231
236
|
|
@@ -234,7 +239,7 @@ module Sequel
|
|
234
239
|
# Should raise an error if the table doesn't not exist,
|
235
240
|
# and not raise an error if the table does exist.
|
236
241
|
def _table_exists?(ds)
|
237
|
-
ds.get(Sequel::NULL)
|
242
|
+
ds.get(SQL::AliasedExpression.new(Sequel::NULL, :nil))
|
238
243
|
end
|
239
244
|
|
240
245
|
# Whether the type should be treated as a string type when parsing the
|
@@ -312,11 +317,12 @@ module Sequel
|
|
312
317
|
# for this database. Used when parsing metadata so that column symbols are
|
313
318
|
# returned as expected.
|
314
319
|
def metadata_dataset
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
+
@metadata_dataset ||= (
|
321
|
+
ds = dataset;
|
322
|
+
ds.identifier_input_method = identifier_input_method_default;
|
323
|
+
ds.identifier_output_method = identifier_output_method_default;
|
324
|
+
ds
|
325
|
+
)
|
320
326
|
end
|
321
327
|
|
322
328
|
# Return a Method object for the dataset's output_identifier_method.
|
@@ -646,7 +646,7 @@ module Sequel
|
|
646
646
|
# for certain databases.
|
647
647
|
def default_index_name(table_name, columns)
|
648
648
|
schema, table = schema_and_table(table_name)
|
649
|
-
"#{"#{schema}_" if schema and schema !=
|
649
|
+
"#{"#{schema}_" if schema and schema != _default_schema}#{table}_#{columns.map{|c| [String, Symbol].any?{|cl| c.is_a?(cl)} ? c : literal(c).gsub(/\W/, '_')}.join(UNDERSCORE)}_index"
|
650
650
|
end
|
651
651
|
|
652
652
|
# Get foreign key name for given table and columns.
|
@@ -752,12 +752,12 @@ module Sequel
|
|
752
752
|
"ALTER TABLE #{quote_schema_table(name)} RENAME TO #{quote_schema_table(new_name)}"
|
753
753
|
end
|
754
754
|
|
755
|
-
#
|
756
|
-
# quoting has changed.
|
755
|
+
# REMOVE40
|
757
756
|
def reset_schema_utility_dataset
|
758
|
-
|
757
|
+
Sequel::Deprecation.deprecate('Database#reset_schema_utility_dataset', 'Switch to Database#reset_default_dataset')
|
758
|
+
reset_default_dataset
|
759
759
|
end
|
760
|
-
|
760
|
+
|
761
761
|
# Split the schema information from the table
|
762
762
|
def schema_and_table(table_name)
|
763
763
|
schema_utility_dataset.schema_and_table(table_name)
|
@@ -770,7 +770,7 @@ module Sequel
|
|
770
770
|
|
771
771
|
# The dataset to use for proxying certain schema methods.
|
772
772
|
def schema_utility_dataset
|
773
|
-
@
|
773
|
+
@default_dataset
|
774
774
|
end
|
775
775
|
|
776
776
|
# Split the schema information from the table
|
@@ -74,6 +74,7 @@ module Sequel
|
|
74
74
|
# and :remote_write (9.2+).
|
75
75
|
def transaction(opts={}, &block)
|
76
76
|
if opts[:disconnect] == :retry
|
77
|
+
Sequel::Deprecation.deprecate('Database#transaction :disconnect=>:retry option', 'Please switch to :retry_on=>Sequel::DatabaseDisconnectError.')
|
77
78
|
raise(Error, 'cannot specify both :disconnect=>:retry and :retry_on') if opts[:retry_on]
|
78
79
|
return transaction(opts.merge(:retry_on=>Sequel::DatabaseDisconnectError, :disconnect=>nil), &block)
|
79
80
|
end
|
@@ -14,6 +14,7 @@ module Sequel
|
|
14
14
|
map max min multi_insert paged_each range select_hash select_hash_groups select_map select_order_map
|
15
15
|
set single_record single_value sum to_csv to_hash to_hash_groups truncate update
|
16
16
|
METHS
|
17
|
+
# REMOVE40 []= insert_multiple set to_csv
|
17
18
|
|
18
19
|
# Inserts the given argument into the database. Returns self so it
|
19
20
|
# can be used safely when chaining:
|
@@ -39,6 +40,7 @@ module Sequel
|
|
39
40
|
# DB[:table][:id=>1] = {:id=>2} # UPDATE table SET id = 2 WHERE id = 1
|
40
41
|
# # => 1 # number of rows affected
|
41
42
|
def []=(conditions, values)
|
43
|
+
Sequel::Deprecation.deprecate('Dataset#[]=', 'Please load the sequel_3_dataset_methods extension to continue using it')
|
42
44
|
filter(conditions).update(values)
|
43
45
|
end
|
44
46
|
|
@@ -66,7 +68,7 @@ module Sequel
|
|
66
68
|
# DB[:table].avg{function(column)} # SELECT avg(function(column)) FROM table LIMIT 1
|
67
69
|
# # => 1
|
68
70
|
def avg(column=Sequel.virtual_row(&Proc.new))
|
69
|
-
aggregate_dataset.get{avg(column)}
|
71
|
+
aggregate_dataset.get{avg(column).as(:avg)}
|
70
72
|
end
|
71
73
|
|
72
74
|
# Returns the columns in the result set in order as an array of symbols.
|
@@ -101,24 +103,24 @@ module Sequel
|
|
101
103
|
# treated as a virtual row, and the result is used as the argument to
|
102
104
|
# count.
|
103
105
|
#
|
104
|
-
# DB[:table].count # SELECT
|
106
|
+
# DB[:table].count # SELECT count(*) AS count FROM table LIMIT 1
|
105
107
|
# # => 3
|
106
|
-
# DB[:table].count(:column) # SELECT
|
108
|
+
# DB[:table].count(:column) # SELECT count(column) AS count FROM table LIMIT 1
|
107
109
|
# # => 2
|
108
|
-
# DB[:table].count{foo(column)} # SELECT
|
110
|
+
# DB[:table].count{foo(column)} # SELECT count(foo(column)) AS count FROM table LIMIT 1
|
109
111
|
# # => 1
|
110
112
|
def count(arg=(no_arg=true), &block)
|
111
113
|
if no_arg
|
112
114
|
if block
|
113
115
|
arg = Sequel.virtual_row(&block)
|
114
|
-
aggregate_dataset.get{
|
116
|
+
aggregate_dataset.get{count(arg).as(count)}
|
115
117
|
else
|
116
|
-
aggregate_dataset.get{
|
118
|
+
aggregate_dataset.get{count(:*){}.as(count)}.to_i
|
117
119
|
end
|
118
120
|
elsif block
|
119
121
|
raise Error, 'cannot provide both argument and block to Dataset#count'
|
120
122
|
else
|
121
|
-
aggregate_dataset.get{
|
123
|
+
aggregate_dataset.get{count(arg).as(count)}
|
122
124
|
end
|
123
125
|
end
|
124
126
|
|
@@ -144,11 +146,11 @@ module Sequel
|
|
144
146
|
# Note that this method is not safe to use on many adapters if you are
|
145
147
|
# running additional queries inside the provided block. If you are
|
146
148
|
# running queries inside the block, you should use +all+ instead of +each+
|
147
|
-
# for the outer queries, or use a separate thread or shard inside +each
|
149
|
+
# for the outer queries, or use a separate thread or shard inside +each+.
|
148
150
|
def each
|
149
151
|
if @opts[:graph]
|
150
152
|
graph_each{|r| yield r}
|
151
|
-
elsif
|
153
|
+
elsif row_proc = @row_proc
|
152
154
|
fetch_rows(select_sql){|r| yield row_proc.call(r)}
|
153
155
|
else
|
154
156
|
fetch_rows(select_sql){|r| yield r}
|
@@ -169,6 +171,7 @@ module Sequel
|
|
169
171
|
# This method should probably should not be called by user code, use +each+
|
170
172
|
# instead.
|
171
173
|
def fetch_rows(sql)
|
174
|
+
Sequel::Deprecation.deprecate('Dataset#fetch_rows default implementation and Sequel::NotImplemented', 'All dataset instances can be assumed to implement fetch_rows')
|
172
175
|
raise NotImplemented, NOTIMPL_MSG
|
173
176
|
end
|
174
177
|
|
@@ -214,7 +217,7 @@ module Sequel
|
|
214
217
|
ds.single_record
|
215
218
|
else
|
216
219
|
args = (args.size == 1) ? args.first : args
|
217
|
-
if Integer
|
220
|
+
if args.is_a?(Integer)
|
218
221
|
ds.limit(args).all
|
219
222
|
else
|
220
223
|
ds.filter(args).single_record
|
@@ -263,7 +266,7 @@ module Sequel
|
|
263
266
|
|
264
267
|
if column.is_a?(Array)
|
265
268
|
if r = ds.single_record
|
266
|
-
r.values_at(*column
|
269
|
+
r.values_at(*hash_key_symbols(column))
|
267
270
|
end
|
268
271
|
else
|
269
272
|
ds.single_value
|
@@ -373,6 +376,7 @@ module Sequel
|
|
373
376
|
# # INSERT INTO table (x, y) VALUES (1, 2)
|
374
377
|
# # INSERT INTO table (x, y) VALUES (2, 4)
|
375
378
|
def insert_multiple(array, &block)
|
379
|
+
Sequel::Deprecation.deprecate('Dataset#insert_multiple', 'Please load the sequel_3_dataset_methods extension to continue using it')
|
376
380
|
if block
|
377
381
|
array.map{|i| insert(block.call(i))}
|
378
382
|
else
|
@@ -388,7 +392,7 @@ module Sequel
|
|
388
392
|
# DB[:table].interval{function(column)} # SELECT (max(function(column)) - min(function(column))) FROM table LIMIT 1
|
389
393
|
# # => 7
|
390
394
|
def interval(column=Sequel.virtual_row(&Proc.new))
|
391
|
-
aggregate_dataset.get{max(column) - min(column)}
|
395
|
+
aggregate_dataset.get{(max(column) - min(column)).as(:interval)}
|
392
396
|
end
|
393
397
|
|
394
398
|
# Reverses the order and then runs #first with the given arguments and block. Note that this
|
@@ -442,7 +446,7 @@ module Sequel
|
|
442
446
|
# DB[:table].max{function(column)} # SELECT max(function(column)) FROM table LIMIT 1
|
443
447
|
# # => 7
|
444
448
|
def max(column=Sequel.virtual_row(&Proc.new))
|
445
|
-
aggregate_dataset.get{max(column)}
|
449
|
+
aggregate_dataset.get{max(column).as(:max)}
|
446
450
|
end
|
447
451
|
|
448
452
|
# Returns the minimum value for the given column/expression.
|
@@ -453,7 +457,7 @@ module Sequel
|
|
453
457
|
# DB[:table].min{function(column)} # SELECT min(function(column)) FROM table LIMIT 1
|
454
458
|
# # => 0
|
455
459
|
def min(column=Sequel.virtual_row(&Proc.new))
|
456
|
-
aggregate_dataset.get{min(column)}
|
460
|
+
aggregate_dataset.get{min(column).as(:min)}
|
457
461
|
end
|
458
462
|
|
459
463
|
# This is a front end for import that allows you to submit an array of
|
@@ -621,6 +625,7 @@ module Sequel
|
|
621
625
|
# Alias for update, but not aliased directly so subclasses
|
622
626
|
# don't have to override both methods.
|
623
627
|
def set(*args)
|
628
|
+
Sequel::Deprecation.deprecate('Dataset#set', 'Please switch to Dataset#update or load the sequel_3_dataset_methods extension to continue using it')
|
624
629
|
update(*args)
|
625
630
|
end
|
626
631
|
|
@@ -649,7 +654,7 @@ module Sequel
|
|
649
654
|
# DB[:table].sum{function(column)} # SELECT sum(function(column)) FROM table LIMIT 1
|
650
655
|
# # => 10
|
651
656
|
def sum(column=Sequel.virtual_row(&Proc.new))
|
652
|
-
aggregate_dataset.get{sum(column)}
|
657
|
+
aggregate_dataset.get{sum(column).as(:sum)}
|
653
658
|
end
|
654
659
|
|
655
660
|
# Returns a string in CSV format containing the dataset records. By
|
@@ -666,6 +671,7 @@ module Sequel
|
|
666
671
|
# # 1,Jim
|
667
672
|
# # 2,Bob
|
668
673
|
def to_csv(include_column_titles = true)
|
674
|
+
Sequel::Deprecation.deprecate('Dataset#to_csv', 'Please load the sequel_3_dataset_methods extension to continue using it')
|
669
675
|
n = naked
|
670
676
|
cols = n.columns
|
671
677
|
csv = ''
|
@@ -824,17 +830,8 @@ module Sequel
|
|
824
830
|
|
825
831
|
# Internals of +select_hash+ and +select_hash_groups+
|
826
832
|
def _select_hash(meth, key_column, value_column)
|
827
|
-
|
828
|
-
|
829
|
-
select(*(key_column + value_column)).send(meth, key_column.map{|c| hash_key_symbol(c)}, value_column.map{|c| hash_key_symbol(c)})
|
830
|
-
else
|
831
|
-
select(*(key_column + [value_column])).send(meth, key_column.map{|c| hash_key_symbol(c)}, hash_key_symbol(value_column))
|
832
|
-
end
|
833
|
-
elsif value_column.is_a?(Array)
|
834
|
-
select(key_column, *value_column).send(meth, hash_key_symbol(key_column), value_column.map{|c| hash_key_symbol(c)})
|
835
|
-
else
|
836
|
-
select(key_column, value_column).send(meth, hash_key_symbol(key_column), hash_key_symbol(value_column))
|
837
|
-
end
|
833
|
+
select(*(key_column.is_a?(Array) ? key_column : [key_column]) + (value_column.is_a?(Array) ? value_column : [value_column])).
|
834
|
+
send(meth, hash_key_symbols(key_column), hash_key_symbols(value_column))
|
838
835
|
end
|
839
836
|
|
840
837
|
# Internals of +select_map+ and +select_order_map+
|
@@ -846,7 +843,7 @@ module Sequel
|
|
846
843
|
ds = ds.select(*select_cols)
|
847
844
|
ds = ds.order(*columns.map{|c| unaliased_identifier(c)}) if order
|
848
845
|
if column.is_a?(Array) || (columns.length > 1)
|
849
|
-
ds._select_map_multiple(select_cols
|
846
|
+
ds._select_map_multiple(hash_key_symbols(select_cols))
|
850
847
|
else
|
851
848
|
ds._select_map_single
|
852
849
|
end
|
@@ -881,28 +878,44 @@ module Sequel
|
|
881
878
|
|
882
879
|
# Return a plain symbol given a potentially qualified or aliased symbol,
|
883
880
|
# specifying the symbol that is likely to be used as the hash key
|
884
|
-
# for the column when records are returned.
|
885
|
-
|
881
|
+
# for the column when records are returned. Return nil if no hash key
|
882
|
+
# can be determined
|
883
|
+
def _hash_key_symbol(s, recursing=false)
|
886
884
|
case s
|
887
885
|
when Symbol
|
888
886
|
_, c, a = split_symbol(s)
|
889
887
|
(a || c).to_sym
|
890
888
|
when SQL::Identifier, SQL::Wrapper
|
891
|
-
|
889
|
+
_hash_key_symbol(s.value, true)
|
892
890
|
when SQL::QualifiedIdentifier
|
893
|
-
|
891
|
+
_hash_key_symbol(s.column, true)
|
894
892
|
when SQL::AliasedExpression
|
895
|
-
|
893
|
+
_hash_key_symbol(s.aliaz, true)
|
896
894
|
when String
|
897
|
-
if recursing
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
895
|
+
s.to_sym if recursing
|
896
|
+
end
|
897
|
+
end
|
898
|
+
|
899
|
+
# Return a plain symbol given a potentially qualified or aliased symbol,
|
900
|
+
# specifying the symbol that is likely to be used as the hash key
|
901
|
+
# for the column when records are returned. Raise Error if the hash key
|
902
|
+
# symbol cannot be returned.
|
903
|
+
def hash_key_symbol(s)
|
904
|
+
if v = _hash_key_symbol(s)
|
905
|
+
v
|
906
|
+
elsif block_given?
|
907
|
+
yield
|
902
908
|
else
|
903
|
-
raise(Error, "#{s.inspect} is not supported, should be a Symbol, SQL::Identifier, SQL::QualifiedIdentifier, or SQL::AliasedExpression")
|
909
|
+
raise(Error, "#{s.inspect} is not supported, should be a Symbol, SQL::Identifier, SQL::QualifiedIdentifier, or SQL::AliasedExpression")
|
904
910
|
end
|
905
911
|
end
|
912
|
+
|
913
|
+
# If s is an array, return an array with the given hash key symbols.
|
914
|
+
# Otherwise, return a hash key symbol for the given expression
|
915
|
+
# If a hash key symbol cannot be determined, raise an error.
|
916
|
+
def hash_key_symbols(s)
|
917
|
+
s.is_a?(Array) ? s.map{|c| hash_key_symbol(c)} : hash_key_symbol(s)
|
918
|
+
end
|
906
919
|
|
907
920
|
# Modify the identifier returned from the database based on the
|
908
921
|
# identifier_output_method.
|