sequel 4.46.0 → 4.49.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +210 -0
- data/Rakefile +1 -1
- data/doc/advanced_associations.rdoc +1 -1
- data/doc/opening_databases.rdoc +3 -2
- data/doc/release_notes/4.47.0.txt +56 -0
- data/doc/release_notes/4.48.0.txt +293 -0
- data/doc/release_notes/4.49.0.txt +222 -0
- data/lib/sequel/adapters/ado/access.rb +2 -1
- data/lib/sequel/adapters/do/postgres.rb +5 -2
- data/lib/sequel/adapters/ibmdb.rb +30 -8
- data/lib/sequel/adapters/jdbc/as400.rb +1 -1
- data/lib/sequel/adapters/jdbc/db2.rb +12 -3
- data/lib/sequel/adapters/jdbc/derby.rb +4 -5
- data/lib/sequel/adapters/jdbc/h2.rb +10 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +16 -2
- data/lib/sequel/adapters/jdbc/postgresql.rb +46 -20
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +9 -7
- data/lib/sequel/adapters/jdbc/sqlserver.rb +20 -6
- data/lib/sequel/adapters/jdbc.rb +39 -23
- data/lib/sequel/adapters/mock.rb +27 -19
- data/lib/sequel/adapters/mysql.rb +17 -16
- data/lib/sequel/adapters/mysql2.rb +5 -6
- data/lib/sequel/adapters/oracle.rb +5 -9
- data/lib/sequel/adapters/postgres.rb +91 -103
- data/lib/sequel/adapters/shared/db2.rb +22 -6
- data/lib/sequel/adapters/shared/mssql.rb +5 -4
- data/lib/sequel/adapters/shared/mysql.rb +79 -25
- data/lib/sequel/adapters/shared/oracle.rb +26 -3
- data/lib/sequel/adapters/shared/postgres.rb +199 -95
- data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
- data/lib/sequel/adapters/shared/sqlite.rb +72 -82
- data/lib/sequel/adapters/sqlanywhere.rb +4 -1
- data/lib/sequel/adapters/sqlite.rb +5 -3
- data/lib/sequel/adapters/swift/postgres.rb +5 -2
- data/lib/sequel/adapters/tinytds.rb +0 -5
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -1
- data/lib/sequel/adapters/utils/pg_types.rb +2 -76
- data/lib/sequel/ast_transformer.rb +1 -1
- data/lib/sequel/connection_pool/sharded_single.rb +1 -1
- data/lib/sequel/connection_pool/sharded_threaded.rb +1 -1
- data/lib/sequel/connection_pool/single.rb +2 -2
- data/lib/sequel/connection_pool/threaded.rb +2 -2
- data/lib/sequel/connection_pool.rb +9 -2
- data/lib/sequel/core.rb +2 -2
- data/lib/sequel/database/connecting.rb +8 -8
- data/lib/sequel/database/dataset.rb +6 -3
- data/lib/sequel/database/dataset_defaults.rb +14 -1
- data/lib/sequel/database/misc.rb +1 -1
- data/lib/sequel/database/query.rb +3 -0
- data/lib/sequel/database/schema_methods.rb +1 -1
- data/lib/sequel/dataset/actions.rb +72 -10
- data/lib/sequel/dataset/dataset_module.rb +58 -0
- data/lib/sequel/dataset/graph.rb +1 -1
- data/lib/sequel/dataset/misc.rb +1 -0
- data/lib/sequel/dataset/prepared_statements.rb +3 -3
- data/lib/sequel/dataset/query.rb +22 -11
- data/lib/sequel/dataset.rb +1 -1
- data/lib/sequel/exceptions.rb +8 -0
- data/lib/sequel/extensions/_model_pg_row.rb +5 -2
- data/lib/sequel/extensions/core_extensions.rb +4 -1
- data/lib/sequel/extensions/current_datetime_timestamp.rb +2 -1
- data/lib/sequel/extensions/date_arithmetic.rb +1 -0
- data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -3
- data/lib/sequel/extensions/empty_array_ignore_nulls.rb +3 -0
- data/lib/sequel/extensions/filter_having.rb +2 -0
- data/lib/sequel/extensions/freeze_datasets.rb +2 -0
- data/lib/sequel/extensions/from_block.rb +1 -1
- data/lib/sequel/extensions/graph_each.rb +2 -2
- data/lib/sequel/extensions/hash_aliases.rb +2 -0
- data/lib/sequel/extensions/identifier_mangling.rb +0 -7
- data/lib/sequel/extensions/meta_def.rb +2 -0
- data/lib/sequel/extensions/migration.rb +11 -8
- data/lib/sequel/extensions/no_auto_literal_strings.rb +1 -1
- data/lib/sequel/extensions/null_dataset.rb +1 -0
- data/lib/sequel/extensions/pagination.rb +1 -1
- data/lib/sequel/extensions/pg_array.rb +207 -130
- data/lib/sequel/extensions/pg_hstore.rb +38 -20
- data/lib/sequel/extensions/pg_inet.rb +18 -6
- data/lib/sequel/extensions/pg_interval.rb +19 -12
- data/lib/sequel/extensions/pg_json.rb +25 -14
- data/lib/sequel/extensions/pg_json_ops.rb +2 -2
- data/lib/sequel/extensions/pg_range.rb +133 -100
- data/lib/sequel/extensions/pg_range_ops.rb +4 -3
- data/lib/sequel/extensions/pg_row.rb +68 -39
- data/lib/sequel/extensions/pg_row_ops.rb +11 -5
- data/lib/sequel/extensions/query_literals.rb +2 -0
- data/lib/sequel/extensions/ruby18_symbol_extensions.rb +2 -0
- data/lib/sequel/extensions/s.rb +1 -1
- data/lib/sequel/extensions/schema_dumper.rb +29 -25
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +3 -1
- data/lib/sequel/extensions/sequel_4_dataset_methods.rb +83 -0
- data/lib/sequel/extensions/server_block.rb +32 -15
- data/lib/sequel/extensions/set_overrides.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +0 -1
- data/lib/sequel/extensions/symbol_aref.rb +0 -4
- data/lib/sequel/model/associations.rb +35 -7
- data/lib/sequel/model/base.rb +113 -87
- data/lib/sequel/model/dataset_module.rb +5 -43
- data/lib/sequel/model/errors.rb +2 -1
- data/lib/sequel/model/inflections.rb +17 -5
- data/lib/sequel/model.rb +26 -58
- data/lib/sequel/plugins/active_model.rb +2 -2
- data/lib/sequel/plugins/association_autoreloading.rb +2 -0
- data/lib/sequel/plugins/association_dependencies.rb +3 -3
- data/lib/sequel/plugins/association_pks.rb +73 -46
- data/lib/sequel/plugins/association_proxies.rb +1 -1
- data/lib/sequel/plugins/auto_validations.rb +6 -2
- data/lib/sequel/plugins/boolean_readers.rb +2 -2
- data/lib/sequel/plugins/boolean_subsets.rb +1 -1
- data/lib/sequel/plugins/caching.rb +19 -13
- data/lib/sequel/plugins/class_table_inheritance.rb +24 -13
- data/lib/sequel/plugins/column_conflicts.rb +7 -2
- data/lib/sequel/plugins/column_select.rb +3 -3
- data/lib/sequel/plugins/composition.rb +2 -2
- data/lib/sequel/plugins/csv_serializer.rb +8 -8
- data/lib/sequel/plugins/dataset_associations.rb +25 -13
- data/lib/sequel/plugins/defaults_setter.rb +13 -1
- data/lib/sequel/plugins/eager_each.rb +1 -1
- data/lib/sequel/plugins/force_encoding.rb +2 -2
- data/lib/sequel/plugins/hook_class_methods.rb +9 -12
- data/lib/sequel/plugins/identifier_columns.rb +2 -0
- data/lib/sequel/plugins/instance_filters.rb +3 -1
- data/lib/sequel/plugins/instance_hooks.rb +17 -9
- data/lib/sequel/plugins/json_serializer.rb +19 -12
- data/lib/sequel/plugins/lazy_attributes.rb +8 -7
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +2 -0
- data/lib/sequel/plugins/modification_detection.rb +3 -0
- data/lib/sequel/plugins/nested_attributes.rb +6 -2
- data/lib/sequel/plugins/pg_array_associations.rb +5 -0
- data/lib/sequel/plugins/pg_row.rb +4 -2
- data/lib/sequel/plugins/pg_typecast_on_load.rb +2 -0
- data/lib/sequel/plugins/prepared_statements.rb +1 -0
- data/lib/sequel/plugins/rcte_tree.rb +4 -24
- data/lib/sequel/plugins/serialization.rb +9 -15
- data/lib/sequel/plugins/single_table_inheritance.rb +8 -3
- data/lib/sequel/plugins/split_values.rb +6 -5
- data/lib/sequel/plugins/static_cache.rb +31 -25
- data/lib/sequel/plugins/subset_conditions.rb +3 -1
- data/lib/sequel/plugins/table_select.rb +1 -1
- data/lib/sequel/plugins/touch.rb +4 -2
- data/lib/sequel/plugins/validation_class_methods.rb +5 -6
- data/lib/sequel/plugins/validation_helpers.rb +14 -8
- data/lib/sequel/plugins/xml_serializer.rb +4 -4
- data/lib/sequel/sql.rb +18 -9
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +115 -14
- data/spec/adapters/mssql_spec.rb +4 -4
- data/spec/adapters/mysql_spec.rb +83 -29
- data/spec/adapters/oracle_spec.rb +28 -24
- data/spec/adapters/postgres_spec.rb +40 -24
- data/spec/adapters/sqlanywhere_spec.rb +88 -86
- data/spec/adapters/sqlite_spec.rb +29 -24
- data/spec/bin_spec.rb +7 -1
- data/spec/core/connection_pool_spec.rb +45 -14
- data/spec/core/database_spec.rb +155 -0
- data/spec/core/dataset_spec.rb +219 -36
- data/spec/core/schema_spec.rb +16 -0
- data/spec/core/spec_helper.rb +1 -0
- data/spec/core_extensions_spec.rb +6 -2
- data/spec/extensions/active_model_spec.rb +1 -1
- data/spec/extensions/arbitrary_servers_spec.rb +1 -1
- data/spec/extensions/association_pks_spec.rb +34 -2
- data/spec/extensions/auto_literal_strings_spec.rb +5 -1
- data/spec/extensions/auto_validations_spec.rb +2 -0
- data/spec/extensions/boolean_readers_spec.rb +1 -1
- data/spec/extensions/boolean_subsets_spec.rb +1 -1
- data/spec/extensions/class_table_inheritance_spec.rb +106 -19
- data/spec/extensions/column_conflicts_spec.rb +11 -0
- data/spec/extensions/column_select_spec.rb +1 -0
- data/spec/extensions/composition_spec.rb +13 -0
- data/spec/extensions/connection_validator_spec.rb +1 -1
- data/spec/extensions/dataset_associations_spec.rb +20 -8
- data/spec/extensions/defaults_setter_spec.rb +15 -1
- data/spec/extensions/filter_having_spec.rb +5 -3
- data/spec/extensions/hash_aliases_spec.rb +3 -1
- data/spec/extensions/identifier_columns_spec.rb +3 -1
- data/spec/extensions/implicit_subquery_spec.rb +4 -2
- data/spec/extensions/json_serializer_spec.rb +18 -0
- data/spec/extensions/lazy_attributes_spec.rb +3 -3
- data/spec/extensions/many_through_many_spec.rb +4 -4
- data/spec/extensions/meta_def_spec.rb +9 -0
- data/spec/extensions/migration_spec.rb +3 -3
- data/spec/extensions/nested_attributes_spec.rb +14 -3
- data/spec/extensions/no_auto_literal_strings_spec.rb +8 -4
- data/spec/extensions/null_dataset_spec.rb +1 -1
- data/spec/extensions/pg_array_associations_spec.rb +29 -18
- data/spec/extensions/pg_array_spec.rb +44 -25
- data/spec/extensions/pg_hstore_spec.rb +10 -0
- data/spec/extensions/pg_inet_spec.rb +26 -0
- data/spec/extensions/pg_interval_spec.rb +20 -0
- data/spec/extensions/pg_json_spec.rb +24 -0
- data/spec/extensions/pg_range_spec.rb +98 -14
- data/spec/extensions/pg_row_spec.rb +14 -4
- data/spec/extensions/pg_typecast_on_load_spec.rb +11 -9
- data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
- data/spec/extensions/query_literals_spec.rb +3 -1
- data/spec/extensions/schema_dumper_spec.rb +108 -94
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +10 -6
- data/spec/extensions/sequel_4_dataset_methods_spec.rb +121 -0
- data/spec/extensions/serialization_spec.rb +1 -1
- data/spec/extensions/server_block_spec.rb +7 -0
- data/spec/extensions/single_table_inheritance_spec.rb +17 -1
- data/spec/extensions/spec_helper.rb +7 -1
- data/spec/extensions/static_cache_spec.rb +75 -24
- data/spec/extensions/string_agg_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +9 -0
- data/spec/extensions/validation_helpers_spec.rb +10 -5
- data/spec/extensions/whitelist_security_spec.rb +26 -0
- data/spec/integration/associations_test.rb +8 -0
- data/spec/integration/dataset_test.rb +45 -44
- data/spec/integration/model_test.rb +53 -4
- data/spec/integration/plugin_test.rb +28 -4
- data/spec/integration/prepared_statement_test.rb +3 -0
- data/spec/integration/schema_test.rb +21 -1
- data/spec/integration/transaction_test.rb +40 -40
- data/spec/model/association_reflection_spec.rb +43 -1
- data/spec/model/associations_spec.rb +29 -9
- data/spec/model/class_dataset_methods_spec.rb +20 -4
- data/spec/model/dataset_methods_spec.rb +12 -3
- data/spec/model/eager_loading_spec.rb +8 -8
- data/spec/model/model_spec.rb +45 -1
- data/spec/model/plugins_spec.rb +34 -0
- data/spec/model/record_spec.rb +1 -1
- data/spec/spec_config.rb +2 -0
- metadata +11 -4
- data/spec/adapters/firebird_spec.rb +0 -405
- data/spec/adapters/informix_spec.rb +0 -100
@@ -0,0 +1,222 @@
|
|
1
|
+
= Forward Compatibility
|
2
|
+
|
3
|
+
Sequel 4.49.0 will be the last minor release of Sequel 4. While the
|
4
|
+
vast majority of backwards incompatible changes in Sequel 5 have
|
5
|
+
deprecation warnings in 4.49.0, there are a few changes that do
|
6
|
+
not. Here is a brief list of changes coming in Sequel 5 that
|
7
|
+
do not have deprecation warnings (note that this list may not be
|
8
|
+
exhaustive):
|
9
|
+
|
10
|
+
* The {before,after,around}_validation hooks will always be called
|
11
|
+
when saving, even if the validate: false option is used. This
|
12
|
+
will allow you to use the before_validation hook to make changes
|
13
|
+
to the model instance that are required before validation and
|
14
|
+
before saving even if not validating. Currently, you would have
|
15
|
+
to use both a before_save and before_validation hook, which would
|
16
|
+
both be run on normal instance saving.
|
17
|
+
|
18
|
+
* Getting values for newly created model instances after insertion
|
19
|
+
now happens before after_create is called, instead of after.
|
20
|
+
This behavior is currently available via the before_after_save
|
21
|
+
plugin, and and will become the default behavior.
|
22
|
+
|
23
|
+
* Sequel will now immediately attempt to the connect to the database
|
24
|
+
when a Database instance is created, in order to fail fast. This
|
25
|
+
behavior is currently available via the test: true option, and
|
26
|
+
will become the default behavior. You can force not testing the
|
27
|
+
connection by using the test: false option.
|
28
|
+
|
29
|
+
* The validates_unique method in the validation_helpers plugin will
|
30
|
+
now only check for uniqueness by default if the record is new or
|
31
|
+
one of the related columns has been modified by default. You can
|
32
|
+
use only_if_modified: false to force the uniqueness check.
|
33
|
+
|
34
|
+
* Database schema methods and schema generator methods will return
|
35
|
+
nil instead of some internal value.
|
36
|
+
|
37
|
+
* Many cases where Sequel uses send internally will be switched to
|
38
|
+
public_send so they only call public methods, unless it is
|
39
|
+
specifically expected that they will call private methods.
|
40
|
+
|
41
|
+
* Model association hooks will be nil instead of empty arrays by
|
42
|
+
default. They will only be arrays if that hook has been set for
|
43
|
+
the association.
|
44
|
+
|
45
|
+
* Internal uses of instance_eval with a block will be changed to
|
46
|
+
instance_exec. This will allow them to be used with lambdas that
|
47
|
+
take no arguments. Unfortunately, it will break the case where a
|
48
|
+
lambda is currently used that takes one argument.
|
49
|
+
|
50
|
+
* Most internal constants will be frozen, unless there is a
|
51
|
+
requirement that they be modified at runtime.
|
52
|
+
|
53
|
+
* The @was_new instance variable set during model instance creation
|
54
|
+
will be removed.
|
55
|
+
|
56
|
+
= Deprecated Features
|
57
|
+
|
58
|
+
* Model association before callbacks returning false canceling the
|
59
|
+
action is now deprecated. The callbacks should now call
|
60
|
+
Model#cancel_action to cancel the action.
|
61
|
+
|
62
|
+
* Loading plugins by requiring them via sequel_#{plugin} is now
|
63
|
+
deprecated. Affected plugins should move the plugin file so it can
|
64
|
+
be required via sequel/plugins/#{plugin}.
|
65
|
+
|
66
|
+
* In the mock adapter, Dataset#autoid=, #_fetch=, and #numrows= are
|
67
|
+
now deprecated. They modified the dataset itself, which would not
|
68
|
+
work for frozen datasets. Dataset#with_autoid, #with_fetch,
|
69
|
+
and #with_numrows should be used instead, which return a modified
|
70
|
+
copy.
|
71
|
+
|
72
|
+
* In the null_dataset extension, Dataset#nullify! is now deprecated.
|
73
|
+
It modified the dataset itself, which would not work for frozen
|
74
|
+
datasets. Dataset#nullify should be used instead, which returns a
|
75
|
+
modified copy.
|
76
|
+
|
77
|
+
* Modifying the validation_helpers plugin DEFAULT_OPTIONS hash is now
|
78
|
+
deprecated. Any change to the default options should be done by
|
79
|
+
overriding the Model#default_validation_helpers_options private
|
80
|
+
method.
|
81
|
+
|
82
|
+
* Modifying ConnectionPool::CONNECTION_POOL_MAP to support an
|
83
|
+
external connection pool is now deprecated. To use an external
|
84
|
+
connection pool, pass the pool class via the :pool_class
|
85
|
+
Database option. Additionally, using a :pool_class option that
|
86
|
+
is not a class or a symbol for one of the default connection
|
87
|
+
pools is also deprecated.
|
88
|
+
|
89
|
+
* ConnectionPool#created_count is now deprecated. This method was
|
90
|
+
misnamed, as it was in alias to size, but the name implies it
|
91
|
+
returns how many connections have been created, as opposed to how
|
92
|
+
many connections are still in the pool.
|
93
|
+
|
94
|
+
* Sequel::SQL::Function#f is now deprecated, switch to using #name
|
95
|
+
instead.
|
96
|
+
|
97
|
+
* Sequel::SQL::AliasedExpression#aliaz is now deprecated, switch
|
98
|
+
to using #alias instead.
|
99
|
+
|
100
|
+
* The :eager_loading_predicate_key association option and
|
101
|
+
eager_loading_predicate_key association method are now deprecated.
|
102
|
+
The predicate_key option and method should be used instead.
|
103
|
+
|
104
|
+
* The cti_columns class method in the class_table_inheritance plugin
|
105
|
+
is now deprecated.
|
106
|
+
|
107
|
+
* The serialized_columns class method in the serialization plugin
|
108
|
+
is now deprecated.
|
109
|
+
|
110
|
+
* Having ds.join_table(:table, :cross, :a=>:b) be treated as an
|
111
|
+
inner join on MySQL is now deprecated.
|
112
|
+
|
113
|
+
* Sequel::IBMDB::Connection#prepared_statements= in the ibmdb
|
114
|
+
adapter is now deprecated.
|
115
|
+
|
116
|
+
* Additional internal constants are now deprecated.
|
117
|
+
|
118
|
+
= New Features
|
119
|
+
|
120
|
+
* Database#extend_datasets and Database#with_extend if given a block
|
121
|
+
now use a Dataset::DatasetModule instance instead of a plain Module
|
122
|
+
instance. Dataset::DatasetModule is a subset of
|
123
|
+
Model::DatasetModule, and allows for the easy creation of dataset
|
124
|
+
methods that can perform caching for frozen datasets.
|
125
|
+
|
126
|
+
Defining dataset methods is done by calling methods with the same
|
127
|
+
name as dataset methods inside the extend_datasets or with_extend
|
128
|
+
block:
|
129
|
+
|
130
|
+
DB.extend_datasets do
|
131
|
+
order :by_id, :id
|
132
|
+
select :with_id_and_name, :id, :name
|
133
|
+
where :active, :active
|
134
|
+
end
|
135
|
+
|
136
|
+
This is equivalent to:
|
137
|
+
|
138
|
+
DB.extend_datasets do
|
139
|
+
def by_id
|
140
|
+
order(:id)
|
141
|
+
end
|
142
|
+
|
143
|
+
def with_id_and_name
|
144
|
+
select(:id, :name)
|
145
|
+
end
|
146
|
+
|
147
|
+
def active
|
148
|
+
where(:active)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
Except that for frozen datasets (the default in Sequel 5),
|
153
|
+
code like:
|
154
|
+
|
155
|
+
100.times do
|
156
|
+
DB[:table].active.with_id_and_name.by_id
|
157
|
+
end
|
158
|
+
|
159
|
+
will only allocate 4 datasets instead of 400, and can be
|
160
|
+
3-4 times faster.
|
161
|
+
|
162
|
+
* Dataset#where_{all,each,single_value} are now core dataset methods
|
163
|
+
instead of just model dataset methods. These methods allow you to
|
164
|
+
replace:
|
165
|
+
|
166
|
+
dataset.where(cond).all
|
167
|
+
dataset.where(cond).each{}
|
168
|
+
dataset.where(cond).single_value
|
169
|
+
|
170
|
+
with:
|
171
|
+
|
172
|
+
dataset.where_all(cond)
|
173
|
+
dataset.where_each(cond){}
|
174
|
+
dataset.where_single_value(cond)
|
175
|
+
|
176
|
+
The advantage of #where_{all,each,single_value} is that frozen
|
177
|
+
datasets can take potentially advantage of caching and perform
|
178
|
+
70%-300% faster.
|
179
|
+
|
180
|
+
* Oracle 12 native limit/offset support is now supported, which
|
181
|
+
in particular makes offset queries much faster as they don't
|
182
|
+
have to be emulated using the row_number window function.
|
183
|
+
|
184
|
+
* Dataset#paged_each in the mysql2 adapter now supports a
|
185
|
+
:stream=>false option to disable streaming and fallback to
|
186
|
+
the default implementation.
|
187
|
+
|
188
|
+
* The postgres adapter now supports the :sslrootcert option
|
189
|
+
directly, you no longer need to specify it using the
|
190
|
+
:driver_options hash.
|
191
|
+
|
192
|
+
* The single_table_inheritance plugin now supports an
|
193
|
+
sti_class_from_sti_key method for getting the appropriate
|
194
|
+
subclass for the given key.
|
195
|
+
|
196
|
+
= Other Improvements
|
197
|
+
|
198
|
+
* Using the dataset_associations plugin with a many_through_many
|
199
|
+
association that joins to the same table multiple times is now
|
200
|
+
handled correctly by automatically aliasing the table
|
201
|
+
appropriately.
|
202
|
+
|
203
|
+
* On Ruby 2.1+, Sequel::Error#cause will use wrapped_exception
|
204
|
+
if one is set. This doesn't result in different behavior in
|
205
|
+
most cases, but it can in cases where nested exception handling
|
206
|
+
is done and Sequel tries to raise the most relevant exception.
|
207
|
+
|
208
|
+
* Using the composition plugin with the :mapping option now works
|
209
|
+
correctly when using the column_conflicts plugin.
|
210
|
+
|
211
|
+
* The validation_helpers plugin's validates_max_length method
|
212
|
+
now correctly gets the default :nil_message option from
|
213
|
+
the default_validation_helpers_options method instead of
|
214
|
+
looking at the plugin defaults.
|
215
|
+
|
216
|
+
* The duplicate_columns_handler extension no longer makes the
|
217
|
+
Dataset#columns= method public.
|
218
|
+
|
219
|
+
* On H2 1.4+, alter_table add_primary_key now works correctly.
|
220
|
+
|
221
|
+
* The jdbc/sqlserver adapter's datetimeoffset type handling now
|
222
|
+
works with more JDBC driver versions.
|
@@ -299,7 +299,8 @@ module Sequel
|
|
299
299
|
|
300
300
|
def fetch_ado_schema(type, criteria=[])
|
301
301
|
execute_open_ado_schema(type, criteria) do |s|
|
302
|
-
cols =
|
302
|
+
cols = []
|
303
|
+
s.Fields.each{|f| cols << f.Name}
|
303
304
|
s.getRows.transpose.each do |r|
|
304
305
|
row = {}
|
305
306
|
cols.each{|c| row[c] = r.shift}
|
@@ -4,8 +4,6 @@ Sequel::DataObjects.load_driver 'do_postgres'
|
|
4
4
|
Sequel.require 'adapters/shared/postgres'
|
5
5
|
|
6
6
|
module Sequel
|
7
|
-
Postgres::CONVERTED_EXCEPTIONS << ::DataObjects::Error
|
8
|
-
|
9
7
|
module DataObjects
|
10
8
|
Sequel.synchronize do
|
11
9
|
DATABASE_SETUP[:postgres] = proc do |db|
|
@@ -31,6 +29,11 @@ module Sequel
|
|
31
29
|
|
32
30
|
private
|
33
31
|
|
32
|
+
DATABASE_ERROR_CLASSES = [::DataObjects::Error].freeze
|
33
|
+
def database_error_classes
|
34
|
+
DATABASE_ERROR_CLASSES
|
35
|
+
end
|
36
|
+
|
34
37
|
# Extend the adapter with the DataObjects PostgreSQL AdapterMethods
|
35
38
|
def setup_connection(conn)
|
36
39
|
conn = super(conn)
|
@@ -6,12 +6,17 @@ Sequel.require 'adapters/shared/db2'
|
|
6
6
|
module Sequel
|
7
7
|
|
8
8
|
module IBMDB
|
9
|
+
# SEQUEL5: Remove
|
9
10
|
@convert_smallint_to_bool = true
|
10
|
-
|
11
11
|
class << self
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
def convert_smallint_to_bool
|
13
|
+
Sequel::Deprecation.deprecate("Sequel::IBMDB.convert_smallint_to_bool", "Call this method on the Database instance")
|
14
|
+
@convert_smallint_to_bool
|
15
|
+
end
|
16
|
+
def convert_smallint_to_bool=(v)
|
17
|
+
Sequel::Deprecation.deprecate("Sequel::IBMDB.convert_smallint_to_bool=", "Call this method on the Database instance")
|
18
|
+
@convert_smallint_to_bool = v
|
19
|
+
end
|
15
20
|
end
|
16
21
|
|
17
22
|
tt = Class.new do
|
@@ -32,7 +37,12 @@ module Sequel
|
|
32
37
|
class Connection
|
33
38
|
# A hash with prepared statement name symbol keys, where each value is
|
34
39
|
# a two element array with an sql string and cached Statement value.
|
35
|
-
|
40
|
+
attr_reader :prepared_statements
|
41
|
+
|
42
|
+
def prepared_statements=(v)
|
43
|
+
Sequel::Deprecation.deprecate("Sequel::IBMDB::Connection#prepared_statements=", "Use replace on the hash instead of reassigning it")
|
44
|
+
@prepared_statements = v
|
45
|
+
end
|
36
46
|
|
37
47
|
# Error class for exceptions raised by the connection.
|
38
48
|
class Error < StandardError
|
@@ -187,6 +197,16 @@ module Sequel
|
|
187
197
|
|
188
198
|
# Hash of connection procs for converting
|
189
199
|
attr_reader :conversion_procs
|
200
|
+
|
201
|
+
# Whether to convert smallint values to bool for this Database instance
|
202
|
+
#attr_accessor :convert_smallint_to_bool # SEQUEL5
|
203
|
+
|
204
|
+
# SEQUEL5: Remove
|
205
|
+
attr_writer :convert_smallint_to_bool
|
206
|
+
def convert_smallint_to_bool
|
207
|
+
v = @convert_smallint_to_bool
|
208
|
+
v.nil? ? Sequel::IBMDB.instance_variable_get(:@convert_smallint_to_bool) : v
|
209
|
+
end
|
190
210
|
|
191
211
|
# Create a new connection object for the given server.
|
192
212
|
def connect(server)
|
@@ -284,6 +304,7 @@ module Sequel
|
|
284
304
|
end
|
285
305
|
|
286
306
|
def adapter_initialize
|
307
|
+
#@convert_smallint_to_bool = typecast_value_boolean(opts.fetch(:convert_smallint_to_bool, true)) # SEQUEL5
|
287
308
|
@conversion_procs = DB2_TYPES.dup
|
288
309
|
@conversion_procs[:timestamp] = method(:to_application_timestamp)
|
289
310
|
end
|
@@ -349,7 +370,7 @@ module Sequel
|
|
349
370
|
|
350
371
|
# Convert smallint type to boolean if convert_smallint_to_bool is true
|
351
372
|
def schema_column_type(db_type)
|
352
|
-
if
|
373
|
+
if convert_smallint_to_bool && db_type =~ /smallint/i
|
353
374
|
:boolean
|
354
375
|
else
|
355
376
|
super
|
@@ -379,13 +400,14 @@ module Sequel
|
|
379
400
|
|
380
401
|
# Override the default IBMDB.convert_smallint_to_bool setting for this dataset.
|
381
402
|
def convert_smallint_to_bool=(v)
|
403
|
+
Sequel::Deprecation.deprecate("Sequel::IBMDB::Dataset#convert_smallint_to_bool=", "Call with_convert_smallint_to_bool instead, which returns a modified copy instead of modifying the object")
|
382
404
|
@opts[:convert_smallint_to_bool] = v
|
383
405
|
end
|
384
406
|
|
385
407
|
# Whether to convert smallint to boolean arguments for this dataset.
|
386
408
|
# Defaults to the IBMDB module setting.
|
387
409
|
def convert_smallint_to_bool
|
388
|
-
opts.has_key?(:convert_smallint_to_bool) ? opts[:convert_smallint_to_bool] :
|
410
|
+
opts.has_key?(:convert_smallint_to_bool) ? opts[:convert_smallint_to_bool] : db.convert_smallint_to_bool
|
389
411
|
end
|
390
412
|
|
391
413
|
# Return a cloned dataset with the convert_smallint_to_bool option set.
|
@@ -405,7 +427,7 @@ module Sequel
|
|
405
427
|
type = stmt.field_type(i).downcase.to_sym
|
406
428
|
# decide if it is a smallint from precision
|
407
429
|
type = :boolean if type == :int && convert && stmt.field_precision(i) < 8
|
408
|
-
type = :blob if type == :clob &&
|
430
|
+
type = :blob if type == :clob && db.use_clob_as_blob
|
409
431
|
columns << [key, cps[type]]
|
410
432
|
end
|
411
433
|
cols = columns.map{|c| c[0]}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen-string-literal: true
|
2
2
|
|
3
|
-
Sequel::Deprecation.deprecate("The jdbc/as400 adapter", "
|
3
|
+
Sequel::Deprecation.deprecate("The jdbc/as400 adapter", "This gem will replace it: https://github.com/ecraft/sequel-jdbc-as400")
|
4
4
|
|
5
5
|
Sequel::JDBC.load_driver('com.ibm.as400.access.AS400JDBCDriver')
|
6
6
|
Sequel.require 'adapters/jdbc/transactions'
|
@@ -35,7 +35,8 @@ module Sequel
|
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
|
38
|
+
# SEQUEL5: Remove
|
39
|
+
class Type_Convertor
|
39
40
|
def DB2Clob(r, i)
|
40
41
|
if v = r.getClob(i)
|
41
42
|
v = v.getSubString(1, v.length)
|
@@ -63,7 +64,7 @@ module Sequel
|
|
63
64
|
def set_ps_arg(cps, arg, i)
|
64
65
|
case arg
|
65
66
|
when Sequel::SQL::Blob
|
66
|
-
if
|
67
|
+
if use_clob_as_blob
|
67
68
|
cps.setString(i, arg)
|
68
69
|
else
|
69
70
|
super
|
@@ -91,7 +92,15 @@ module Sequel
|
|
91
92
|
super
|
92
93
|
map = @type_convertor_map
|
93
94
|
types = Java::JavaSQL::Types
|
94
|
-
map[types::NCLOB] = map[types::CLOB] =
|
95
|
+
map[types::NCLOB] = map[types::CLOB] = method(:convert_clob)
|
96
|
+
end
|
97
|
+
|
98
|
+
def convert_clob(r, i)
|
99
|
+
if v = r.getClob(i)
|
100
|
+
v = v.getSubString(1, v.length)
|
101
|
+
v = Sequel::SQL::Blob.new(v) if use_clob_as_blob
|
102
|
+
v
|
103
|
+
end
|
95
104
|
end
|
96
105
|
end
|
97
106
|
|
@@ -54,7 +54,7 @@ module Sequel
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
# Derby supports
|
57
|
+
# Derby supports transactional DDL statements.
|
58
58
|
def supports_transactional_ddl?
|
59
59
|
true
|
60
60
|
end
|
@@ -227,8 +227,7 @@ module Sequel
|
|
227
227
|
Sequel::Deprecation.deprecate_constant(self, :EMULATED_FUNCTION_MAP)
|
228
228
|
|
229
229
|
# Derby doesn't support an expression between CASE and WHEN,
|
230
|
-
# so remove
|
231
|
-
# conditions.
|
230
|
+
# so remove conditions.
|
232
231
|
def case_expression_sql_append(sql, ce)
|
233
232
|
super(sql, ce.with_merged_expression)
|
234
233
|
end
|
@@ -300,7 +299,7 @@ module Sequel
|
|
300
299
|
end
|
301
300
|
|
302
301
|
# Derby uses an expression yielding false for false values.
|
303
|
-
# Newer versions can use the FALSE literal, but
|
302
|
+
# Newer versions can use the FALSE literal, but older versions cannot.
|
304
303
|
def literal_false
|
305
304
|
if db.svn_version >= 1040133
|
306
305
|
'FALSE'
|
@@ -315,7 +314,7 @@ module Sequel
|
|
315
314
|
end
|
316
315
|
|
317
316
|
# Derby uses an expression yielding true for true values.
|
318
|
-
# Newer versions can use the TRUE literal, but
|
317
|
+
# Newer versions can use the TRUE literal, but older versions cannot.
|
319
318
|
def literal_true
|
320
319
|
if db.svn_version >= 1040133
|
321
320
|
'TRUE'
|
@@ -30,6 +30,15 @@ module Sequel
|
|
30
30
|
:h2
|
31
31
|
end
|
32
32
|
|
33
|
+
def freeze
|
34
|
+
h2_version
|
35
|
+
super
|
36
|
+
end
|
37
|
+
|
38
|
+
def h2_version
|
39
|
+
@h2_version ||= get(Sequel.function(:H2VERSION))
|
40
|
+
end
|
41
|
+
|
33
42
|
# Rollback an existing prepared transaction with the given transaction
|
34
43
|
# identifier string.
|
35
44
|
def rollback_prepared_transaction(transaction_id, opts=OPTS)
|
@@ -84,7 +93,7 @@ module Sequel
|
|
84
93
|
|
85
94
|
sqls = [super(table, op)]
|
86
95
|
|
87
|
-
if pk && op[:type] != :identity
|
96
|
+
if pk && (h2_version >= '1.4' || op[:type] != :identity)
|
88
97
|
sqls << "ALTER TABLE #{quote_schema_table(table)} ADD PRIMARY KEY (#{quote_identifier(op[:name])})"
|
89
98
|
end
|
90
99
|
|
@@ -14,7 +14,8 @@ module Sequel
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
|
17
|
+
# SEQUEL5: Remove
|
18
|
+
class Type_Convertor
|
18
19
|
JAVA_BIG_DECIMAL_CONSTRUCTOR = java.math.BigDecimal.java_class.constructor(Java::long).method(:new_instance)
|
19
20
|
|
20
21
|
def OracleDecimal(r, i)
|
@@ -31,6 +32,19 @@ module Sequel
|
|
31
32
|
|
32
33
|
# Database and Dataset support for Oracle databases accessed via JDBC.
|
33
34
|
module Oracle
|
35
|
+
JAVA_BIG_DECIMAL_CONSTRUCTOR = java.math.BigDecimal.java_class.constructor(Java::long).method(:new_instance)
|
36
|
+
|
37
|
+
def self.OracleDecimal(r, i)
|
38
|
+
if v = r.getBigDecimal(i)
|
39
|
+
i = v.long_value
|
40
|
+
if v == JAVA_BIG_DECIMAL_CONSTRUCTOR.call(i)
|
41
|
+
i
|
42
|
+
else
|
43
|
+
BigDecimal.new(v.to_string)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
34
48
|
# Instance methods for Oracle Database objects accessed via JDBC.
|
35
49
|
module DatabaseMethods
|
36
50
|
PRIMARY_KEY_INDEX_RE = /\Asys_/i.freeze
|
@@ -110,7 +124,7 @@ module Sequel
|
|
110
124
|
|
111
125
|
def setup_type_convertor_map
|
112
126
|
super
|
113
|
-
@type_convertor_map[:OracleDecimal] =
|
127
|
+
@type_convertor_map[:OracleDecimal] = Oracle.method(:OracleDecimal)
|
114
128
|
end
|
115
129
|
end
|
116
130
|
|
@@ -4,8 +4,6 @@ Sequel::JDBC.load_driver('org.postgresql.Driver', :Postgres)
|
|
4
4
|
Sequel.require 'adapters/shared/postgres'
|
5
5
|
|
6
6
|
module Sequel
|
7
|
-
Postgres::CONVERTED_EXCEPTIONS << NativeException
|
8
|
-
|
9
7
|
module JDBC
|
10
8
|
Sequel.synchronize do
|
11
9
|
DATABASE_SETUP[:postgresql] = proc do |db|
|
@@ -15,11 +13,27 @@ module Sequel
|
|
15
13
|
end
|
16
14
|
end
|
17
15
|
|
18
|
-
|
16
|
+
# SEQUEL5: Remove
|
17
|
+
class Type_Convertor
|
18
|
+
def RubyPGArray(r, i)
|
19
|
+
if v = r.getArray(i)
|
20
|
+
v.array.to_ary
|
21
|
+
end
|
22
|
+
end
|
23
|
+
def RubyPGHstore(r, i)
|
24
|
+
if v = r.getObject(i)
|
25
|
+
v.to_hash
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Adapter, Database, and Dataset support for accessing a PostgreSQL
|
31
|
+
# database via JDBC.
|
32
|
+
module Postgres
|
19
33
|
# Return PostgreSQL array types as ruby Arrays instead of
|
20
34
|
# JDBC PostgreSQL driver-specific array type. Only used if the
|
21
35
|
# database does not have a conversion proc for the type.
|
22
|
-
def RubyPGArray(r, i)
|
36
|
+
def self.RubyPGArray(r, i)
|
23
37
|
if v = r.getArray(i)
|
24
38
|
v.array.to_ary
|
25
39
|
end
|
@@ -28,16 +42,12 @@ module Sequel
|
|
28
42
|
# Return PostgreSQL hstore types as ruby Hashes instead of
|
29
43
|
# Java HashMaps. Only used if the database does not have a
|
30
44
|
# conversion proc for the type.
|
31
|
-
def RubyPGHstore(r, i)
|
45
|
+
def self.RubyPGHstore(r, i)
|
32
46
|
if v = r.getObject(i)
|
33
47
|
v.to_hash
|
34
48
|
end
|
35
49
|
end
|
36
|
-
end
|
37
50
|
|
38
|
-
# Adapter, Database, and Dataset support for accessing a PostgreSQL
|
39
|
-
# database via JDBC.
|
40
|
-
module Postgres
|
41
51
|
# Methods to add to Database instances that access PostgreSQL via
|
42
52
|
# JDBC.
|
43
53
|
module DatabaseMethods
|
@@ -50,6 +60,12 @@ module Sequel
|
|
50
60
|
db.send(:initialize_postgres_adapter)
|
51
61
|
end
|
52
62
|
|
63
|
+
# Remove any current entry for the oid in the oid_convertor_map.
|
64
|
+
def add_conversion_proc(oid, *)
|
65
|
+
super
|
66
|
+
Sequel.synchronize{@oid_convertor_map.delete(oid)}
|
67
|
+
end
|
68
|
+
|
53
69
|
# See Sequel::Postgres::Adapter#copy_into
|
54
70
|
def copy_into(table, opts=OPTS)
|
55
71
|
data = opts[:data]
|
@@ -61,7 +77,7 @@ module Sequel
|
|
61
77
|
raise Error, "Must provide either a :data option or a block to copy_into"
|
62
78
|
end
|
63
79
|
|
64
|
-
synchronize(opts) do |conn|
|
80
|
+
synchronize(opts[:server]) do |conn|
|
65
81
|
begin
|
66
82
|
copy_manager = org.postgresql.copy.CopyManager.new(conn)
|
67
83
|
copier = copy_manager.copy_in(copy_into_sql(table, opts))
|
@@ -73,7 +89,7 @@ module Sequel
|
|
73
89
|
data.each { |d| copier.writeToCopy(d.to_java_bytes, 0, d.length) }
|
74
90
|
end
|
75
91
|
rescue Exception => e
|
76
|
-
copier.cancelCopy
|
92
|
+
copier.cancelCopy if copier
|
77
93
|
raise
|
78
94
|
ensure
|
79
95
|
unless e
|
@@ -105,8 +121,12 @@ module Sequel
|
|
105
121
|
end
|
106
122
|
b
|
107
123
|
end
|
124
|
+
rescue => e
|
125
|
+
raise_error(e, :disconnect=>true)
|
108
126
|
ensure
|
109
|
-
|
127
|
+
if buf && !e
|
128
|
+
raise DatabaseDisconnectError, "disconnecting as a partial COPY may leave the connection in an unusable state"
|
129
|
+
end
|
110
130
|
end
|
111
131
|
end
|
112
132
|
end
|
@@ -122,19 +142,24 @@ module Sequel
|
|
122
142
|
else
|
123
143
|
false
|
124
144
|
end
|
125
|
-
|
145
|
+
Sequel.synchronize{@oid_convertor_map[oid] = conv}
|
126
146
|
end
|
127
147
|
conv
|
128
148
|
end
|
129
149
|
|
130
150
|
private
|
131
151
|
|
132
|
-
#
|
152
|
+
# SEQUEL5: Remove
|
133
153
|
def conversion_procs_updated
|
134
154
|
super
|
135
155
|
Sequel.synchronize{@oid_convertor_map = {}}
|
136
156
|
end
|
137
157
|
|
158
|
+
DATABASE_ERROR_CLASSES = [NativeException].freeze
|
159
|
+
def database_error_classes
|
160
|
+
DATABASE_ERROR_CLASSES
|
161
|
+
end
|
162
|
+
|
138
163
|
def disconnect_error?(exception, opts)
|
139
164
|
super || exception.message =~ /\A(This connection has been closed\.|FATAL: terminating connection due to administrator command|An I\/O error occurred while sending to the backend\.)\z/
|
140
165
|
end
|
@@ -178,8 +203,6 @@ module Sequel
|
|
178
203
|
def setup_type_convertor_map
|
179
204
|
super
|
180
205
|
@oid_convertor_map = {}
|
181
|
-
@type_convertor_map[:RubyPGArray] = TypeConvertor::INSTANCE.method(:RubyPGArray)
|
182
|
-
@type_convertor_map[:RubyPGHstore] = TypeConvertor::INSTANCE.method(:RubyPGHstore)
|
183
206
|
end
|
184
207
|
end
|
185
208
|
|
@@ -188,6 +211,8 @@ module Sequel
|
|
188
211
|
include Sequel::Postgres::DatasetMethods
|
189
212
|
APOS = "'".freeze
|
190
213
|
Sequel::Deprecation.deprecate_constant(self, :APOS)
|
214
|
+
HSTORE_TYPE = 'hstore'.freeze
|
215
|
+
Sequel::Deprecation.deprecate_constant(self, :HSTORE_TYPE)
|
191
216
|
|
192
217
|
private
|
193
218
|
|
@@ -203,8 +228,9 @@ module Sequel
|
|
203
228
|
|
204
229
|
STRING_TYPE = Java::JavaSQL::Types::VARCHAR
|
205
230
|
ARRAY_TYPE = Java::JavaSQL::Types::ARRAY
|
231
|
+
ARRAY_METHOD = Postgres.method(:RubyPGArray)
|
206
232
|
PG_SPECIFIC_TYPES = [ARRAY_TYPE, Java::JavaSQL::Types::OTHER, Java::JavaSQL::Types::STRUCT]#.freeze # SEQUEL5
|
207
|
-
|
233
|
+
HSTORE_METHOD = Postgres.method(:RubyPGHstore)
|
208
234
|
|
209
235
|
def type_convertor(map, meta, type, i)
|
210
236
|
case type
|
@@ -213,11 +239,11 @@ module Sequel
|
|
213
239
|
if pr = db.oid_convertor_proc(oid)
|
214
240
|
pr
|
215
241
|
elsif type == ARRAY_TYPE
|
216
|
-
|
242
|
+
ARRAY_METHOD
|
217
243
|
elsif oid == 2950 # UUID
|
218
244
|
map[STRING_TYPE]
|
219
|
-
elsif meta.getPGType(i) ==
|
220
|
-
|
245
|
+
elsif meta.getPGType(i) == 'hstore'
|
246
|
+
HSTORE_METHOD
|
221
247
|
else
|
222
248
|
super
|
223
249
|
end
|