sequel 3.47.0 → 3.48.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/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.
|