sequel 4.45.0 → 4.46.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 +108 -0
- data/doc/release_notes/4.46.0.txt +404 -0
- data/doc/security.rdoc +9 -0
- data/doc/sql.rdoc +2 -2
- data/doc/testing.rdoc +1 -1
- data/doc/validations.rdoc +1 -2
- data/lib/sequel/adapters/ado.rb +8 -3
- data/lib/sequel/adapters/ado/access.rb +8 -4
- data/lib/sequel/adapters/ado/mssql.rb +3 -1
- data/lib/sequel/adapters/amalgalite.rb +5 -0
- data/lib/sequel/adapters/cubrid.rb +16 -7
- data/lib/sequel/adapters/do.rb +7 -1
- data/lib/sequel/adapters/do/mysql.rb +8 -4
- data/lib/sequel/adapters/ibmdb.rb +10 -5
- data/lib/sequel/adapters/jdbc.rb +8 -2
- data/lib/sequel/adapters/jdbc/as400.rb +10 -3
- data/lib/sequel/adapters/jdbc/db2.rb +27 -16
- data/lib/sequel/adapters/jdbc/derby.rb +47 -20
- data/lib/sequel/adapters/jdbc/h2.rb +13 -7
- data/lib/sequel/adapters/jdbc/hsqldb.rb +18 -9
- data/lib/sequel/adapters/jdbc/mssql.rb +5 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +3 -2
- data/lib/sequel/adapters/jdbc/oracle.rb +3 -2
- data/lib/sequel/adapters/jdbc/postgresql.rb +4 -3
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +2 -1
- data/lib/sequel/adapters/jdbc/sqlite.rb +10 -3
- data/lib/sequel/adapters/jdbc/sqlserver.rb +23 -0
- data/lib/sequel/adapters/jdbc/transactions.rb +16 -10
- data/lib/sequel/adapters/mock.rb +5 -0
- data/lib/sequel/adapters/mysql.rb +8 -1
- data/lib/sequel/adapters/mysql2.rb +6 -1
- data/lib/sequel/adapters/odbc.rb +20 -8
- data/lib/sequel/adapters/odbc/mssql.rb +6 -3
- data/lib/sequel/adapters/oracle.rb +12 -6
- data/lib/sequel/adapters/postgres.rb +20 -8
- data/lib/sequel/adapters/shared/access.rb +76 -47
- data/lib/sequel/adapters/shared/cubrid.rb +16 -11
- data/lib/sequel/adapters/shared/db2.rb +46 -19
- data/lib/sequel/adapters/shared/firebird.rb +20 -8
- data/lib/sequel/adapters/shared/informix.rb +6 -3
- data/lib/sequel/adapters/shared/mssql.rb +132 -72
- data/lib/sequel/adapters/shared/mysql.rb +112 -65
- data/lib/sequel/adapters/shared/oracle.rb +36 -21
- data/lib/sequel/adapters/shared/postgres.rb +91 -56
- data/lib/sequel/adapters/shared/sqlanywhere.rb +65 -37
- data/lib/sequel/adapters/shared/sqlite.rb +67 -32
- data/lib/sequel/adapters/sqlanywhere.rb +9 -1
- data/lib/sequel/adapters/sqlite.rb +8 -1
- data/lib/sequel/adapters/swift.rb +5 -0
- data/lib/sequel/adapters/swift/mysql.rb +4 -2
- data/lib/sequel/adapters/swift/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +10 -3
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
- data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -0
- data/lib/sequel/adapters/utils/pg_types.rb +14 -6
- data/lib/sequel/adapters/utils/replace.rb +4 -2
- data/lib/sequel/connection_pool/single.rb +2 -2
- data/lib/sequel/core.rb +24 -11
- data/lib/sequel/database/connecting.rb +9 -3
- data/lib/sequel/database/dataset_defaults.rb +7 -1
- data/lib/sequel/database/logging.rb +1 -0
- data/lib/sequel/database/misc.rb +5 -2
- data/lib/sequel/database/query.rb +7 -5
- data/lib/sequel/database/schema_generator.rb +1 -0
- data/lib/sequel/database/schema_methods.rb +50 -27
- data/lib/sequel/database/transactions.rb +19 -9
- data/lib/sequel/dataset/actions.rb +15 -6
- data/lib/sequel/dataset/graph.rb +15 -5
- data/lib/sequel/dataset/misc.rb +12 -4
- data/lib/sequel/dataset/mutation.rb +17 -8
- data/lib/sequel/dataset/prepared_statements.rb +3 -2
- data/lib/sequel/dataset/query.rb +84 -38
- data/lib/sequel/dataset/sql.rb +302 -191
- data/lib/sequel/deprecated.rb +26 -17
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +2 -2
- data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
- data/lib/sequel/extensions/from_block.rb +1 -0
- data/lib/sequel/extensions/graph_each.rb +1 -1
- data/lib/sequel/extensions/identifier_mangling.rb +2 -2
- data/lib/sequel/extensions/migration.rb +28 -4
- data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -0
- data/lib/sequel/extensions/schema_dumper.rb +4 -4
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +5 -3
- data/lib/sequel/extensions/set_overrides.rb +2 -0
- data/lib/sequel/extensions/split_array_nil.rb +2 -2
- data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
- data/lib/sequel/model.rb +11 -7
- data/lib/sequel/model/associations.rb +5 -7
- data/lib/sequel/model/base.rb +47 -45
- data/lib/sequel/model/dataset_module.rb +9 -14
- data/lib/sequel/model/plugins.rb +3 -0
- data/lib/sequel/no_core_ext.rb +1 -0
- data/lib/sequel/plugins/blacklist_security.rb +1 -1
- data/lib/sequel/plugins/boolean_subsets.rb +7 -5
- data/lib/sequel/plugins/class_table_inheritance.rb +47 -10
- data/lib/sequel/plugins/dataset_associations.rb +1 -1
- data/lib/sequel/plugins/def_dataset_method.rb +90 -0
- data/lib/sequel/plugins/finder.rb +240 -0
- data/lib/sequel/plugins/inverted_subsets.rb +19 -12
- data/lib/sequel/plugins/many_through_many.rb +1 -1
- data/lib/sequel/plugins/nested_attributes.rb +1 -1
- data/lib/sequel/plugins/schema.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +7 -1
- data/lib/sequel/plugins/subset_conditions.rb +11 -3
- data/lib/sequel/plugins/whitelist_security.rb +118 -0
- data/lib/sequel/sql.rb +80 -36
- data/lib/sequel/timezones.rb +2 -0
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mssql_spec.rb +20 -0
- data/spec/adapters/mysql_spec.rb +1 -1
- data/spec/adapters/oracle_spec.rb +12 -8
- data/spec/adapters/postgres_spec.rb +1 -1
- data/spec/adapters/spec_helper.rb +1 -1
- data/spec/adapters/sqlite_spec.rb +36 -34
- data/spec/core/connection_pool_spec.rb +2 -1
- data/spec/core/database_spec.rb +87 -9
- data/spec/core/dataset_spec.rb +501 -129
- data/spec/core/deprecated_spec.rb +1 -1
- data/spec/core/expression_filters_spec.rb +146 -60
- data/spec/core/mock_adapter_spec.rb +1 -1
- data/spec/core/object_graph_spec.rb +61 -9
- data/spec/core/placeholder_literalizer_spec.rb +20 -2
- data/spec/core/schema_generator_spec.rb +6 -6
- data/spec/core/schema_spec.rb +54 -5
- data/spec/core_extensions_spec.rb +122 -18
- data/spec/deprecation_helper.rb +27 -2
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +6 -6
- data/spec/extensions/association_proxies_spec.rb +2 -2
- data/spec/extensions/auto_literal_strings_spec.rb +212 -0
- data/spec/extensions/blacklist_security_spec.rb +1 -0
- data/spec/extensions/class_table_inheritance_spec.rb +1037 -39
- data/spec/extensions/column_select_spec.rb +20 -8
- data/spec/extensions/columns_introspection_spec.rb +3 -3
- data/spec/extensions/core_refinements_spec.rb +29 -12
- data/spec/extensions/dataset_associations_spec.rb +12 -12
- data/spec/extensions/def_dataset_method_spec.rb +100 -0
- data/spec/extensions/error_sql_spec.rb +1 -1
- data/spec/extensions/finder_spec.rb +260 -0
- data/spec/extensions/graph_each_spec.rb +2 -2
- data/spec/extensions/identifier_mangling_spec.rb +14 -8
- data/spec/extensions/inverted_subsets_spec.rb +4 -4
- data/spec/extensions/lazy_attributes_spec.rb +7 -0
- data/spec/extensions/many_through_many_spec.rb +38 -14
- data/spec/extensions/nested_attributes_spec.rb +18 -6
- data/spec/extensions/no_auto_literal_strings_spec.rb +1 -1
- data/spec/extensions/pg_enum_spec.rb +16 -1
- data/spec/extensions/pg_interval_spec.rb +11 -2
- data/spec/extensions/pg_loose_count_spec.rb +5 -0
- data/spec/extensions/pg_row_spec.rb +25 -0
- data/spec/extensions/prepared_statements_spec.rb +10 -1
- data/spec/extensions/query_spec.rb +2 -2
- data/spec/extensions/schema_dumper_spec.rb +2 -2
- data/spec/extensions/schema_spec.rb +2 -2
- data/spec/extensions/set_overrides_spec.rb +7 -3
- data/spec/extensions/sql_expr_spec.rb +0 -1
- data/spec/extensions/subset_conditions_spec.rb +6 -6
- data/spec/extensions/table_select_spec.rb +24 -12
- data/spec/extensions/to_dot_spec.rb +4 -4
- data/spec/extensions/whitelist_security_spec.rb +131 -0
- data/spec/integration/dataset_test.rb +9 -5
- data/spec/integration/model_test.rb +2 -0
- data/spec/integration/plugin_test.rb +2 -2
- data/spec/integration/spec_helper.rb +1 -1
- data/spec/model/associations_spec.rb +39 -11
- data/spec/model/base_spec.rb +44 -24
- data/spec/model/class_dataset_methods_spec.rb +18 -16
- data/spec/model/dataset_methods_spec.rb +4 -4
- data/spec/model/eager_loading_spec.rb +84 -24
- data/spec/model/model_spec.rb +97 -63
- data/spec/model/record_spec.rb +21 -13
- metadata +13 -2
data/doc/security.rdoc
CHANGED
|
@@ -23,6 +23,7 @@ could conceivably be abused to do so:
|
|
|
23
23
|
* Sequel.def_adapter_method (private)
|
|
24
24
|
* Sequel::SQL::Expression.to_s_method (private)
|
|
25
25
|
* Sequel::Plugins::HookClassMethods::ClassMethods#add_hook_type
|
|
26
|
+
* Sequel::Plugins.def_dataset_methods
|
|
26
27
|
|
|
27
28
|
As long as you don't call those with user input, you should not be
|
|
28
29
|
vulnerable to code execution.
|
|
@@ -196,6 +197,14 @@ for plain strings as literal strings in update methods.
|
|
|
196
197
|
The Sequel::Dataset#lock_style and Sequel::Model#lock! methods also treat
|
|
197
198
|
an input string as SQL code. This method should not be called with user input.
|
|
198
199
|
|
|
200
|
+
==== SQL Fragment passed to Virtual Row #` method
|
|
201
|
+
|
|
202
|
+
Virtual row blocks currently support a #` method for using literal SQL:
|
|
203
|
+
|
|
204
|
+
DB[:table].where{a > `some SQL`}
|
|
205
|
+
|
|
206
|
+
This method should not be called with user input.
|
|
207
|
+
|
|
199
208
|
==== SQL Type Names
|
|
200
209
|
|
|
201
210
|
In general, most places where Sequel needs to use an SQL type that should
|
data/doc/sql.rdoc
CHANGED
|
@@ -239,8 +239,8 @@ If the database supports window functions, Sequel can handle them by calling the
|
|
|
239
239
|
DB[:albums].select{function(:col1).over(:partition=>col2, :order=>col3)}
|
|
240
240
|
# SELECT function(col1) OVER (PARTITION BY col2 ORDER BY col3) FROM albums
|
|
241
241
|
|
|
242
|
-
DB[:albums].select{function(c1, c2).over(:partition=>[c3, c4], :order=>[c5, c6])}
|
|
243
|
-
# SELECT function(c1, c2) OVER (PARTITION BY c3, c4 ORDER BY c5, c6) FROM albums
|
|
242
|
+
DB[:albums].select{function(c1, c2).over(:partition=>[c3, c4], :order=>[c5, c6.desc])}
|
|
243
|
+
# SELECT function(c1, c2) OVER (PARTITION BY c3, c4 ORDER BY c5, c6 DESC) FROM albums
|
|
244
244
|
|
|
245
245
|
=== Schema Qualified Functions
|
|
246
246
|
|
data/doc/testing.rdoc
CHANGED
|
@@ -158,11 +158,11 @@ SEQUEL_DUPLICATE_COLUMNS_HANDLER :: Use the duplicate columns handler extension
|
|
|
158
158
|
SEQUEL_ERROR_SQL :: Use the error_sql extension when running the specs
|
|
159
159
|
SEQUEL_FREEZE_DATASETS :: Use the freeze_datasets extension when running the specs
|
|
160
160
|
SEQUEL_FREEZE_DATABASE :: Freeze the database before running the integration specs
|
|
161
|
+
SEQUEL_IDENTIFIER_MANGLING :: Use the identifier_mangling extension when running the specs
|
|
161
162
|
SEQUEL_MODEL_PREPARED_STATEMENTS :: Use the prepared_statements and prepared_statements_associations plugins when running the specs
|
|
162
163
|
SEQUEL_NO_AUTO_LITERAL_STRINGS :: Use the no_auto_string_literals extension when running the specs
|
|
163
164
|
SEQUEL_NO_CACHE_ASSOCIATIONS :: Don't cache association metadata when running the specs
|
|
164
165
|
SEQUEL_NO_CHECK_SQLS :: Don't check for specific SQL syntax when running the specs
|
|
165
|
-
SEQUEL_NO_MANGLE :: Don't use the identifier_mangling extension when runnsing the specs
|
|
166
166
|
SEQUEL_NO_PENDING :: Don't skip any specs, try running all specs (note, can cause lockups for some adapters)
|
|
167
167
|
SEQUEL_NO_SPLIT_SYMBOLS :: Turn off symbol splitting when running the specs
|
|
168
168
|
SKIPPED_TEST_WARN :: Warn when skipping any tests because libraries aren't available
|
data/doc/validations.rdoc
CHANGED
|
@@ -496,7 +496,6 @@ This will make sure that all string columns in the model are validated to make s
|
|
|
496
496
|
If you forget to call +super+, the validations that you defined in <tt>Sequel::Model</tt> will not be enforced. It's a good idea to call super whenever you override one of <tt>Sequel::Model</tt>'s methods, unless you specifically do not want the default behavior.
|
|
497
497
|
|
|
498
498
|
== <tt>Sequel::Model::Errors</tt>
|
|
499
|
-
'
|
|
500
499
|
As mentioned earlier, <tt>Sequel::Model::Errors</tt> is a subclass of Hash with a few special methods, the most common of which are described here:
|
|
501
500
|
|
|
502
501
|
=== +add+
|
|
@@ -513,7 +512,7 @@ As mentioned earlier, <tt>Sequel::Model::Errors</tt> is a subclass of Hash with
|
|
|
513
512
|
|
|
514
513
|
If you want to make some validations dependent upon the results of other validations, you may want to use +on+ inside your validates method:
|
|
515
514
|
|
|
516
|
-
validates_integer(:release_date)
|
|
515
|
+
validates_integer(:release_date) unless errors.on(:record_date)
|
|
517
516
|
|
|
518
517
|
Here, you don't care about validating the release date if there were validation errors for the record date.
|
|
519
518
|
|
data/lib/sequel/adapters/ado.rb
CHANGED
|
@@ -83,9 +83,11 @@ module Sequel
|
|
|
83
83
|
CONVERSION_PROCS[i] = method
|
|
84
84
|
end
|
|
85
85
|
end
|
|
86
|
+
# CONVERSION_PROCS.freeze # SEQUEL5
|
|
86
87
|
|
|
87
88
|
class Database < Sequel::Database
|
|
88
89
|
DISCONNECT_ERROR_RE = /Communication link failure/
|
|
90
|
+
Sequel::Deprecation.deprecate_constant(self, :DISCONNECT_ERROR_RE)
|
|
89
91
|
|
|
90
92
|
set_adapter_scheme :ado
|
|
91
93
|
|
|
@@ -201,6 +203,10 @@ module Sequel
|
|
|
201
203
|
super
|
|
202
204
|
end
|
|
203
205
|
|
|
206
|
+
def dataset_class_default
|
|
207
|
+
Dataset
|
|
208
|
+
end
|
|
209
|
+
|
|
204
210
|
# The ADO adapter's default provider doesn't support transactions, since it
|
|
205
211
|
# creates a new native connection for each query. So Sequel only attempts
|
|
206
212
|
# to use transactions if an explicit :provider is given.
|
|
@@ -217,7 +223,7 @@ module Sequel
|
|
|
217
223
|
end
|
|
218
224
|
|
|
219
225
|
def disconnect_error?(e, opts)
|
|
220
|
-
super || (e.is_a?(::WIN32OLERuntimeError) && e.message =~
|
|
226
|
+
super || (e.is_a?(::WIN32OLERuntimeError) && e.message =~ /Communication link failure/)
|
|
221
227
|
end
|
|
222
228
|
|
|
223
229
|
def rollback_transaction(conn, opts=OPTS)
|
|
@@ -227,8 +233,7 @@ module Sequel
|
|
|
227
233
|
|
|
228
234
|
class Dataset < Sequel::Dataset
|
|
229
235
|
Database::DatasetClass = self
|
|
230
|
-
|
|
231
|
-
|
|
236
|
+
Sequel::Deprecation.deprecate_constant(Database, :DatasetClass)
|
|
232
237
|
|
|
233
238
|
def fetch_rows(sql)
|
|
234
239
|
execute(sql) do |recordset|
|
|
@@ -15,7 +15,7 @@ module Sequel
|
|
|
15
15
|
:tables => 20,
|
|
16
16
|
:views => 23,
|
|
17
17
|
:foreign_keys => 27
|
|
18
|
-
}
|
|
18
|
+
}#.freeze # SEQUEL5
|
|
19
19
|
|
|
20
20
|
attr_reader :type, :criteria
|
|
21
21
|
|
|
@@ -42,7 +42,8 @@ module Sequel
|
|
|
42
42
|
131 => "DECIMAL",
|
|
43
43
|
201 => "TEXT",
|
|
44
44
|
205 => "IMAGE"
|
|
45
|
-
}
|
|
45
|
+
}#.freeze # SEQUEL5
|
|
46
|
+
#DATA_TYPE.each_value(&:freeze) # SEQUEL5
|
|
46
47
|
|
|
47
48
|
def initialize(row)
|
|
48
49
|
@row = row
|
|
@@ -90,7 +91,9 @@ module Sequel
|
|
|
90
91
|
include Sequel::Database::SplitAlterTable
|
|
91
92
|
|
|
92
93
|
DECIMAL_TYPE_RE = /decimal/io
|
|
94
|
+
Sequel::Deprecation.deprecate_constant(self, :DECIMAL_TYPE_RE)
|
|
93
95
|
LAST_INSERT_ID = "SELECT @@IDENTITY".freeze
|
|
96
|
+
Sequel::Deprecation.deprecate_constant(self, :LAST_INSERT_ID)
|
|
94
97
|
|
|
95
98
|
# Remove cached schema after altering a table, since otherwise it can be cached
|
|
96
99
|
# incorrectly in the rename column case.
|
|
@@ -111,7 +114,8 @@ module Sequel
|
|
|
111
114
|
synchronize(opts[:server]) do |conn|
|
|
112
115
|
begin
|
|
113
116
|
log_connection_yield(sql, conn){conn.Execute(sql)}
|
|
114
|
-
|
|
117
|
+
last_insert_sql = "SELECT @@IDENTITY"
|
|
118
|
+
res = log_connection_yield(last_insert_sql, conn){conn.Execute(last_insert_sql)}
|
|
115
119
|
res.getRows.transpose.each{|r| return r.shift}
|
|
116
120
|
rescue ::WIN32OLERuntimeError => e
|
|
117
121
|
raise_error(e)
|
|
@@ -240,7 +244,7 @@ module Sequel
|
|
|
240
244
|
idx["COLUMN_NAME"] == row["COLUMN_NAME"] &&
|
|
241
245
|
idx["PRIMARY_KEY"]
|
|
242
246
|
},
|
|
243
|
-
:type => if row.db_type =~
|
|
247
|
+
:type => if row.db_type =~ /decimal/i && row.scale == 0
|
|
244
248
|
:integer
|
|
245
249
|
else
|
|
246
250
|
schema_column_type(row.db_type)
|
|
@@ -12,6 +12,7 @@ module Sequel
|
|
|
12
12
|
# Query to use to get the number of rows affected by an update or
|
|
13
13
|
# delete query.
|
|
14
14
|
ROWS_AFFECTED = "SELECT @@ROWCOUNT AS AffectedRows"
|
|
15
|
+
Sequel::Deprecation.deprecate_constant(self, :ROWS_AFFECTED)
|
|
15
16
|
|
|
16
17
|
# Issue a separate query to get the rows modified. ADO appears to
|
|
17
18
|
# use pass by reference with an integer variable, which is obviously
|
|
@@ -21,7 +22,8 @@ module Sequel
|
|
|
21
22
|
synchronize(opts[:server]) do |conn|
|
|
22
23
|
begin
|
|
23
24
|
log_connection_yield(sql, conn){conn.Execute(sql)}
|
|
24
|
-
|
|
25
|
+
rows_affected_sql = "SELECT @@ROWCOUNT AS AffectedRows"
|
|
26
|
+
res = log_connection_yield(rows_affected_sql, conn){conn.Execute(rows_affected_sql)}
|
|
25
27
|
res.getRows.transpose.each{|r| return r.shift}
|
|
26
28
|
rescue ::WIN32OLERuntimeError => e
|
|
27
29
|
raise_error(e)
|
|
@@ -145,6 +145,10 @@ module Sequel
|
|
|
145
145
|
o
|
|
146
146
|
end
|
|
147
147
|
|
|
148
|
+
def dataset_class_default
|
|
149
|
+
Dataset
|
|
150
|
+
end
|
|
151
|
+
|
|
148
152
|
# Both main error classes that Amalgalite raises
|
|
149
153
|
def database_error_classes
|
|
150
154
|
[::Amalgalite::Error, ::Amalgalite::SQLite3::Error]
|
|
@@ -156,6 +160,7 @@ module Sequel
|
|
|
156
160
|
include ::Sequel::SQLite::DatasetMethods
|
|
157
161
|
|
|
158
162
|
Database::DatasetClass = self
|
|
163
|
+
Sequel::Deprecation.deprecate_constant(Database, :DatasetClass)
|
|
159
164
|
|
|
160
165
|
# Yield a hash for each row in the dataset.
|
|
161
166
|
def fetch_rows(sql)
|
|
@@ -11,13 +11,15 @@ module Sequel
|
|
|
11
11
|
::Cubrid::DATE => lambda{|t| Date.new(t.year, t.month, t.day)},
|
|
12
12
|
::Cubrid::TIME => lambda{|t| SQLTime.create(t.hour, t.min, t.sec)},
|
|
13
13
|
21 => lambda(&:to_i)
|
|
14
|
-
}
|
|
14
|
+
}#.freeze # SEQUEL5
|
|
15
15
|
|
|
16
16
|
class Database < Sequel::Database
|
|
17
17
|
include Sequel::Cubrid::DatabaseMethods
|
|
18
18
|
|
|
19
19
|
ROW_COUNT = "SELECT ROW_COUNT()".freeze
|
|
20
|
+
Sequel::Deprecation.deprecate_constant(self, :ROW_COUNT)
|
|
20
21
|
LAST_INSERT_ID = "SELECT LAST_INSERT_ID()".freeze
|
|
22
|
+
Sequel::Deprecation.deprecate_constant(self, :LAST_INSERT_ID)
|
|
21
23
|
|
|
22
24
|
set_adapter_scheme :cubrid
|
|
23
25
|
|
|
@@ -59,14 +61,14 @@ module Sequel
|
|
|
59
61
|
|
|
60
62
|
# Work around bugs by using the ROW_COUNT function.
|
|
61
63
|
begin
|
|
62
|
-
r2 = conn.query(ROW_COUNT)
|
|
64
|
+
r2 = conn.query("SELECT ROW_COUNT()")
|
|
63
65
|
r2.each{|a| return a.first.to_i}
|
|
64
66
|
ensure
|
|
65
67
|
r2.close if r2
|
|
66
68
|
end
|
|
67
69
|
when :insert
|
|
68
70
|
begin
|
|
69
|
-
r2 = conn.query(LAST_INSERT_ID)
|
|
71
|
+
r2 = conn.query("SELECT LAST_INSERT_ID()")
|
|
70
72
|
r2.each{|a| return a.first.to_i}
|
|
71
73
|
ensure
|
|
72
74
|
r2.close if r2
|
|
@@ -99,11 +101,15 @@ module Sequel
|
|
|
99
101
|
private
|
|
100
102
|
|
|
101
103
|
def begin_transaction(conn, opts=OPTS)
|
|
102
|
-
log_connection_yield(
|
|
104
|
+
log_connection_yield("Transaction.begin", conn){conn.auto_commit = false}
|
|
103
105
|
end
|
|
104
106
|
|
|
105
107
|
def commit_transaction(conn, opts=OPTS)
|
|
106
|
-
log_connection_yield(
|
|
108
|
+
log_connection_yield('Transaction.commit', conn){conn.commit}
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def dataset_class_default
|
|
112
|
+
Dataset
|
|
107
113
|
end
|
|
108
114
|
|
|
109
115
|
def database_error_classes
|
|
@@ -119,21 +125,24 @@ module Sequel
|
|
|
119
125
|
# This doesn't actually work, as the cubrid ruby driver
|
|
120
126
|
# does not implement transactions correctly.
|
|
121
127
|
def rollback_transaction(conn, opts=OPTS)
|
|
122
|
-
log_connection_yield(
|
|
128
|
+
log_connection_yield('Transaction.rollback', conn){conn.rollback}
|
|
123
129
|
end
|
|
124
130
|
end
|
|
125
131
|
|
|
126
132
|
class Dataset < Sequel::Dataset
|
|
127
133
|
include Sequel::Cubrid::DatasetMethods
|
|
128
134
|
COLUMN_INFO_NAME = "name".freeze
|
|
135
|
+
Sequel::Deprecation.deprecate_constant(self, :COLUMN_INFO_NAME)
|
|
129
136
|
COLUMN_INFO_TYPE = "type_name".freeze
|
|
137
|
+
Sequel::Deprecation.deprecate_constant(self, :COLUMN_INFO_TYPE)
|
|
130
138
|
|
|
131
139
|
Database::DatasetClass = self
|
|
140
|
+
Sequel::Deprecation.deprecate_constant(Database, :DatasetClass)
|
|
132
141
|
|
|
133
142
|
def fetch_rows(sql)
|
|
134
143
|
execute(sql) do |stmt|
|
|
135
144
|
begin
|
|
136
|
-
cols = stmt.column_info.map{|c| [output_identifier(c[
|
|
145
|
+
cols = stmt.column_info.map{|c| [output_identifier(c["name"]), CUBRID_TYPE_PROCS[c["type_name"]]]}
|
|
137
146
|
self.columns = cols.map(&:first)
|
|
138
147
|
stmt.each do |r|
|
|
139
148
|
row = {}
|
data/lib/sequel/adapters/do.rb
CHANGED
|
@@ -33,6 +33,7 @@ module Sequel
|
|
|
33
33
|
# use a pool size at least as large as the pool size being used by Sequel.
|
|
34
34
|
class Database < Sequel::Database
|
|
35
35
|
DISCONNECT_ERROR_RE = /terminating connection due to administrator command/
|
|
36
|
+
Sequel::Deprecation.deprecate_constant(self, :DISCONNECT_ERROR_RE)
|
|
36
37
|
|
|
37
38
|
set_adapter_scheme :do
|
|
38
39
|
|
|
@@ -121,9 +122,13 @@ module Sequel
|
|
|
121
122
|
[::DataObjects::Error]
|
|
122
123
|
end
|
|
123
124
|
|
|
125
|
+
def dataset_class_default
|
|
126
|
+
Dataset
|
|
127
|
+
end
|
|
128
|
+
|
|
124
129
|
# Recognize DataObjects::ConnectionError instances as disconnect errors.
|
|
125
130
|
def disconnect_error?(e, opts)
|
|
126
|
-
super || (e.is_a?(::DataObjects::Error) && (e.is_a?(::DataObjects::ConnectionError) || e.message =~
|
|
131
|
+
super || (e.is_a?(::DataObjects::Error) && (e.is_a?(::DataObjects::ConnectionError) || e.message =~ /terminating connection due to administrator command/))
|
|
127
132
|
end
|
|
128
133
|
|
|
129
134
|
# Execute SQL on the connection by creating a command first
|
|
@@ -141,6 +146,7 @@ module Sequel
|
|
|
141
146
|
# Dataset class for Sequel::DataObjects::Database objects.
|
|
142
147
|
class Dataset < Sequel::Dataset
|
|
143
148
|
Database::DatasetClass = self
|
|
149
|
+
Sequel::Deprecation.deprecate_constant(Database, :DatasetClass)
|
|
144
150
|
|
|
145
151
|
# Execute the SQL on the database and yield the rows as hashes
|
|
146
152
|
# with symbol keys.
|
|
@@ -43,9 +43,13 @@ module Sequel
|
|
|
43
43
|
# Dataset class for MySQL datasets accessed via DataObjects.
|
|
44
44
|
class Dataset < DataObjects::Dataset
|
|
45
45
|
include Sequel::MySQL::DatasetMethods
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
|
|
47
|
+
APOS = "'".freeze
|
|
48
|
+
Sequel::Deprecation.deprecate_constant(self, :APOS)
|
|
49
|
+
APOS_RE = /'/.freeze
|
|
50
|
+
Sequel::Deprecation.deprecate_constant(self, :APOS_RE)
|
|
51
|
+
DOUBLE_APOS = "''".freeze
|
|
52
|
+
Sequel::Deprecation.deprecate_constant(self, :DOUBLE_APOS)
|
|
49
53
|
|
|
50
54
|
# The DataObjects MySQL driver uses the number of rows actually modified in the update,
|
|
51
55
|
# instead of the number of matched by the filter.
|
|
@@ -57,7 +61,7 @@ module Sequel
|
|
|
57
61
|
|
|
58
62
|
# do_mysql sets NO_BACKSLASH_ESCAPES, so use standard SQL string escaping
|
|
59
63
|
def literal_string_append(sql, s)
|
|
60
|
-
sql <<
|
|
64
|
+
sql << "'" << s.gsub("'", "''") << "'"
|
|
61
65
|
end
|
|
62
66
|
end
|
|
63
67
|
end
|
|
@@ -26,7 +26,7 @@ module Sequel
|
|
|
26
26
|
:blob => ::Sequel::SQL::Blob.method(:new),
|
|
27
27
|
:time => ::Sequel.method(:string_to_time),
|
|
28
28
|
:date => ::Sequel.method(:string_to_date)
|
|
29
|
-
}
|
|
29
|
+
}#.freeze # SEQUEL5
|
|
30
30
|
|
|
31
31
|
# Wraps an underlying connection to DB2 using IBM_DB.
|
|
32
32
|
class Connection
|
|
@@ -291,14 +291,14 @@ module Sequel
|
|
|
291
291
|
# IBM_DB uses an autocommit setting instead of sending SQL queries.
|
|
292
292
|
# So starting a transaction just turns autocommit off.
|
|
293
293
|
def begin_transaction(conn, opts=OPTS)
|
|
294
|
-
log_connection_yield(
|
|
294
|
+
log_connection_yield('Transaction.begin', conn){conn.autocommit = false}
|
|
295
295
|
set_transaction_isolation(conn, opts)
|
|
296
296
|
end
|
|
297
297
|
|
|
298
298
|
# This commits transaction in progress on the
|
|
299
299
|
# connection and sets autocommit back on.
|
|
300
300
|
def commit_transaction(conn, opts=OPTS)
|
|
301
|
-
log_connection_yield(
|
|
301
|
+
log_connection_yield('Transaction.commit', conn){conn.commit}
|
|
302
302
|
end
|
|
303
303
|
|
|
304
304
|
def database_error_classes
|
|
@@ -309,6 +309,10 @@ module Sequel
|
|
|
309
309
|
exception.sqlstate
|
|
310
310
|
end
|
|
311
311
|
|
|
312
|
+
def dataset_class_default
|
|
313
|
+
Dataset
|
|
314
|
+
end
|
|
315
|
+
|
|
312
316
|
# Don't convert smallint to boolean for the metadata
|
|
313
317
|
# dataset, since the DB2 metadata does not use
|
|
314
318
|
# boolean columns, and some smallint columns are
|
|
@@ -340,7 +344,7 @@ module Sequel
|
|
|
340
344
|
# This rolls back the transaction in progress on the
|
|
341
345
|
# connection and sets autocommit back on.
|
|
342
346
|
def rollback_transaction(conn, opts=OPTS)
|
|
343
|
-
log_connection_yield(
|
|
347
|
+
log_connection_yield('Transaction.rollback', conn){conn.rollback}
|
|
344
348
|
end
|
|
345
349
|
|
|
346
350
|
# Convert smallint type to boolean if convert_smallint_to_bool is true
|
|
@@ -357,6 +361,7 @@ module Sequel
|
|
|
357
361
|
include Sequel::DB2::DatasetMethods
|
|
358
362
|
|
|
359
363
|
Database::DatasetClass = self
|
|
364
|
+
Sequel::Deprecation.deprecate_constant(Database, :DatasetClass)
|
|
360
365
|
|
|
361
366
|
module CallableStatementMethods
|
|
362
367
|
# Extend given dataset with this module so subselects inside subselects in
|
|
@@ -403,7 +408,7 @@ module Sequel
|
|
|
403
408
|
type = :blob if type == :clob && Sequel::DB2.use_clob_as_blob
|
|
404
409
|
columns << [key, cps[type]]
|
|
405
410
|
end
|
|
406
|
-
cols = columns.map{|c| c
|
|
411
|
+
cols = columns.map{|c| c[0]}
|
|
407
412
|
self.columns = cols
|
|
408
413
|
|
|
409
414
|
while res = stmt.fetch_array
|
data/lib/sequel/adapters/jdbc.rb
CHANGED
|
@@ -28,6 +28,7 @@ module Sequel
|
|
|
28
28
|
# The types to check for 0 scale to transform :decimal types
|
|
29
29
|
# to :integer.
|
|
30
30
|
DECIMAL_TYPE_RE = /number|numeric|decimal/io
|
|
31
|
+
Sequel::Deprecation.deprecate_constant(self, :DECIMAL_TYPE_RE)
|
|
31
32
|
|
|
32
33
|
# Contains procs keyed on subadapter type that extend the
|
|
33
34
|
# given database object so it supports the correct database type.
|
|
@@ -402,6 +403,10 @@ module Sequel
|
|
|
402
403
|
true
|
|
403
404
|
end
|
|
404
405
|
|
|
406
|
+
def dataset_class_default
|
|
407
|
+
Dataset
|
|
408
|
+
end
|
|
409
|
+
|
|
405
410
|
# Raise a disconnect error if the SQL state of the cause of the exception indicates so.
|
|
406
411
|
def disconnect_error?(exception, opts)
|
|
407
412
|
cause = exception.respond_to?(:cause) ? exception.cause : exception
|
|
@@ -649,7 +654,7 @@ module Sequel
|
|
|
649
654
|
s[:auto_increment] = h[:is_autoincrement] == "YES"
|
|
650
655
|
end
|
|
651
656
|
s[:max_length] = s[:column_size] if s[:type] == :string
|
|
652
|
-
if s[:db_type] =~
|
|
657
|
+
if s[:db_type] =~ /number|numeric|decimal/i && s[:scale] == 0
|
|
653
658
|
s[:type] = :integer
|
|
654
659
|
end
|
|
655
660
|
schema_column_set_db_type(s)
|
|
@@ -704,6 +709,7 @@ module Sequel
|
|
|
704
709
|
include StoredProcedures
|
|
705
710
|
|
|
706
711
|
Database::DatasetClass = self
|
|
712
|
+
Sequel::Deprecation.deprecate_constant(Database, :DatasetClass)
|
|
707
713
|
|
|
708
714
|
PreparedStatementMethods = prepared_statements_module(
|
|
709
715
|
"sql = self; opts = Hash[opts]; opts[:arguments] = bind_arguments",
|
|
@@ -802,7 +808,7 @@ module Sequel
|
|
|
802
808
|
i += 1
|
|
803
809
|
cols << [output_identifier(meta.getColumnLabel(i)), i, convert ? type_convertor(map, meta, meta.getColumnType(i), i) : basic_type_convertor(map, meta, meta.getColumnType(i), i)]
|
|
804
810
|
end
|
|
805
|
-
self.columns = cols.map{|c| c
|
|
811
|
+
self.columns = cols.map{|c| c[0]}
|
|
806
812
|
|
|
807
813
|
while result.next
|
|
808
814
|
row = {}
|
|
@@ -23,8 +23,11 @@ module Sequel
|
|
|
23
23
|
include Sequel::JDBC::Transactions
|
|
24
24
|
|
|
25
25
|
TRANSACTION_BEGIN = 'Transaction.begin'.freeze
|
|
26
|
+
Sequel::Deprecation.deprecate_constant(self, :TRANSACTION_BEGIN)
|
|
26
27
|
TRANSACTION_COMMIT = 'Transaction.commit'.freeze
|
|
28
|
+
Sequel::Deprecation.deprecate_constant(self, :TRANSACTION_COMMIT)
|
|
27
29
|
TRANSACTION_ROLLBACK = 'Transaction.rollback'.freeze
|
|
30
|
+
Sequel::Deprecation.deprecate_constant(self, :TRANSACTION_ROLLBACK)
|
|
28
31
|
|
|
29
32
|
# AS400 uses the :as400 database type.
|
|
30
33
|
def database_type
|
|
@@ -59,19 +62,23 @@ module Sequel
|
|
|
59
62
|
include EmulateOffsetWithRowNumber
|
|
60
63
|
|
|
61
64
|
WILDCARD = Sequel::LiteralString.new('*').freeze
|
|
65
|
+
Sequel::Deprecation.deprecate_constant(self, :WILDCARD)
|
|
62
66
|
FETCH_FIRST_ROW_ONLY = " FETCH FIRST ROW ONLY".freeze
|
|
67
|
+
Sequel::Deprecation.deprecate_constant(self, :FETCH_FIRST_ROW_ONLY)
|
|
63
68
|
FETCH_FIRST = " FETCH FIRST ".freeze
|
|
69
|
+
Sequel::Deprecation.deprecate_constant(self, :FETCH_FIRST)
|
|
64
70
|
ROWS_ONLY = " ROWS ONLY".freeze
|
|
71
|
+
Sequel::Deprecation.deprecate_constant(self, :ROWS_ONLY)
|
|
65
72
|
|
|
66
73
|
# Modify the sql to limit the number of rows returned
|
|
67
74
|
def select_limit_sql(sql)
|
|
68
75
|
if l = @opts[:limit]
|
|
69
76
|
if l == 1
|
|
70
|
-
sql <<
|
|
77
|
+
sql << " FETCH FIRST ROW ONLY"
|
|
71
78
|
elsif l > 1
|
|
72
|
-
sql <<
|
|
79
|
+
sql << " FETCH FIRST "
|
|
73
80
|
literal_append(sql, l)
|
|
74
|
-
sql <<
|
|
81
|
+
sql << " ROWS ONLY"
|
|
75
82
|
end
|
|
76
83
|
end
|
|
77
84
|
end
|