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.
Files changed (173) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +108 -0
  3. data/doc/release_notes/4.46.0.txt +404 -0
  4. data/doc/security.rdoc +9 -0
  5. data/doc/sql.rdoc +2 -2
  6. data/doc/testing.rdoc +1 -1
  7. data/doc/validations.rdoc +1 -2
  8. data/lib/sequel/adapters/ado.rb +8 -3
  9. data/lib/sequel/adapters/ado/access.rb +8 -4
  10. data/lib/sequel/adapters/ado/mssql.rb +3 -1
  11. data/lib/sequel/adapters/amalgalite.rb +5 -0
  12. data/lib/sequel/adapters/cubrid.rb +16 -7
  13. data/lib/sequel/adapters/do.rb +7 -1
  14. data/lib/sequel/adapters/do/mysql.rb +8 -4
  15. data/lib/sequel/adapters/ibmdb.rb +10 -5
  16. data/lib/sequel/adapters/jdbc.rb +8 -2
  17. data/lib/sequel/adapters/jdbc/as400.rb +10 -3
  18. data/lib/sequel/adapters/jdbc/db2.rb +27 -16
  19. data/lib/sequel/adapters/jdbc/derby.rb +47 -20
  20. data/lib/sequel/adapters/jdbc/h2.rb +13 -7
  21. data/lib/sequel/adapters/jdbc/hsqldb.rb +18 -9
  22. data/lib/sequel/adapters/jdbc/mssql.rb +5 -2
  23. data/lib/sequel/adapters/jdbc/mysql.rb +3 -2
  24. data/lib/sequel/adapters/jdbc/oracle.rb +3 -2
  25. data/lib/sequel/adapters/jdbc/postgresql.rb +4 -3
  26. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +2 -1
  27. data/lib/sequel/adapters/jdbc/sqlite.rb +10 -3
  28. data/lib/sequel/adapters/jdbc/sqlserver.rb +23 -0
  29. data/lib/sequel/adapters/jdbc/transactions.rb +16 -10
  30. data/lib/sequel/adapters/mock.rb +5 -0
  31. data/lib/sequel/adapters/mysql.rb +8 -1
  32. data/lib/sequel/adapters/mysql2.rb +6 -1
  33. data/lib/sequel/adapters/odbc.rb +20 -8
  34. data/lib/sequel/adapters/odbc/mssql.rb +6 -3
  35. data/lib/sequel/adapters/oracle.rb +12 -6
  36. data/lib/sequel/adapters/postgres.rb +20 -8
  37. data/lib/sequel/adapters/shared/access.rb +76 -47
  38. data/lib/sequel/adapters/shared/cubrid.rb +16 -11
  39. data/lib/sequel/adapters/shared/db2.rb +46 -19
  40. data/lib/sequel/adapters/shared/firebird.rb +20 -8
  41. data/lib/sequel/adapters/shared/informix.rb +6 -3
  42. data/lib/sequel/adapters/shared/mssql.rb +132 -72
  43. data/lib/sequel/adapters/shared/mysql.rb +112 -65
  44. data/lib/sequel/adapters/shared/oracle.rb +36 -21
  45. data/lib/sequel/adapters/shared/postgres.rb +91 -56
  46. data/lib/sequel/adapters/shared/sqlanywhere.rb +65 -37
  47. data/lib/sequel/adapters/shared/sqlite.rb +67 -32
  48. data/lib/sequel/adapters/sqlanywhere.rb +9 -1
  49. data/lib/sequel/adapters/sqlite.rb +8 -1
  50. data/lib/sequel/adapters/swift.rb +5 -0
  51. data/lib/sequel/adapters/swift/mysql.rb +4 -2
  52. data/lib/sequel/adapters/swift/sqlite.rb +1 -1
  53. data/lib/sequel/adapters/tinytds.rb +10 -3
  54. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
  55. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  56. data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -0
  57. data/lib/sequel/adapters/utils/pg_types.rb +14 -6
  58. data/lib/sequel/adapters/utils/replace.rb +4 -2
  59. data/lib/sequel/connection_pool/single.rb +2 -2
  60. data/lib/sequel/core.rb +24 -11
  61. data/lib/sequel/database/connecting.rb +9 -3
  62. data/lib/sequel/database/dataset_defaults.rb +7 -1
  63. data/lib/sequel/database/logging.rb +1 -0
  64. data/lib/sequel/database/misc.rb +5 -2
  65. data/lib/sequel/database/query.rb +7 -5
  66. data/lib/sequel/database/schema_generator.rb +1 -0
  67. data/lib/sequel/database/schema_methods.rb +50 -27
  68. data/lib/sequel/database/transactions.rb +19 -9
  69. data/lib/sequel/dataset/actions.rb +15 -6
  70. data/lib/sequel/dataset/graph.rb +15 -5
  71. data/lib/sequel/dataset/misc.rb +12 -4
  72. data/lib/sequel/dataset/mutation.rb +17 -8
  73. data/lib/sequel/dataset/prepared_statements.rb +3 -2
  74. data/lib/sequel/dataset/query.rb +84 -38
  75. data/lib/sequel/dataset/sql.rb +302 -191
  76. data/lib/sequel/deprecated.rb +26 -17
  77. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +2 -2
  78. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  79. data/lib/sequel/extensions/from_block.rb +1 -0
  80. data/lib/sequel/extensions/graph_each.rb +1 -1
  81. data/lib/sequel/extensions/identifier_mangling.rb +2 -2
  82. data/lib/sequel/extensions/migration.rb +28 -4
  83. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -0
  84. data/lib/sequel/extensions/schema_dumper.rb +4 -4
  85. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +5 -3
  86. data/lib/sequel/extensions/set_overrides.rb +2 -0
  87. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  88. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  89. data/lib/sequel/model.rb +11 -7
  90. data/lib/sequel/model/associations.rb +5 -7
  91. data/lib/sequel/model/base.rb +47 -45
  92. data/lib/sequel/model/dataset_module.rb +9 -14
  93. data/lib/sequel/model/plugins.rb +3 -0
  94. data/lib/sequel/no_core_ext.rb +1 -0
  95. data/lib/sequel/plugins/blacklist_security.rb +1 -1
  96. data/lib/sequel/plugins/boolean_subsets.rb +7 -5
  97. data/lib/sequel/plugins/class_table_inheritance.rb +47 -10
  98. data/lib/sequel/plugins/dataset_associations.rb +1 -1
  99. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  100. data/lib/sequel/plugins/finder.rb +240 -0
  101. data/lib/sequel/plugins/inverted_subsets.rb +19 -12
  102. data/lib/sequel/plugins/many_through_many.rb +1 -1
  103. data/lib/sequel/plugins/nested_attributes.rb +1 -1
  104. data/lib/sequel/plugins/schema.rb +1 -1
  105. data/lib/sequel/plugins/single_table_inheritance.rb +7 -1
  106. data/lib/sequel/plugins/subset_conditions.rb +11 -3
  107. data/lib/sequel/plugins/whitelist_security.rb +118 -0
  108. data/lib/sequel/sql.rb +80 -36
  109. data/lib/sequel/timezones.rb +2 -0
  110. data/lib/sequel/version.rb +1 -1
  111. data/spec/adapters/mssql_spec.rb +20 -0
  112. data/spec/adapters/mysql_spec.rb +1 -1
  113. data/spec/adapters/oracle_spec.rb +12 -8
  114. data/spec/adapters/postgres_spec.rb +1 -1
  115. data/spec/adapters/spec_helper.rb +1 -1
  116. data/spec/adapters/sqlite_spec.rb +36 -34
  117. data/spec/core/connection_pool_spec.rb +2 -1
  118. data/spec/core/database_spec.rb +87 -9
  119. data/spec/core/dataset_spec.rb +501 -129
  120. data/spec/core/deprecated_spec.rb +1 -1
  121. data/spec/core/expression_filters_spec.rb +146 -60
  122. data/spec/core/mock_adapter_spec.rb +1 -1
  123. data/spec/core/object_graph_spec.rb +61 -9
  124. data/spec/core/placeholder_literalizer_spec.rb +20 -2
  125. data/spec/core/schema_generator_spec.rb +6 -6
  126. data/spec/core/schema_spec.rb +54 -5
  127. data/spec/core_extensions_spec.rb +122 -18
  128. data/spec/deprecation_helper.rb +27 -2
  129. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +6 -6
  130. data/spec/extensions/association_proxies_spec.rb +2 -2
  131. data/spec/extensions/auto_literal_strings_spec.rb +212 -0
  132. data/spec/extensions/blacklist_security_spec.rb +1 -0
  133. data/spec/extensions/class_table_inheritance_spec.rb +1037 -39
  134. data/spec/extensions/column_select_spec.rb +20 -8
  135. data/spec/extensions/columns_introspection_spec.rb +3 -3
  136. data/spec/extensions/core_refinements_spec.rb +29 -12
  137. data/spec/extensions/dataset_associations_spec.rb +12 -12
  138. data/spec/extensions/def_dataset_method_spec.rb +100 -0
  139. data/spec/extensions/error_sql_spec.rb +1 -1
  140. data/spec/extensions/finder_spec.rb +260 -0
  141. data/spec/extensions/graph_each_spec.rb +2 -2
  142. data/spec/extensions/identifier_mangling_spec.rb +14 -8
  143. data/spec/extensions/inverted_subsets_spec.rb +4 -4
  144. data/spec/extensions/lazy_attributes_spec.rb +7 -0
  145. data/spec/extensions/many_through_many_spec.rb +38 -14
  146. data/spec/extensions/nested_attributes_spec.rb +18 -6
  147. data/spec/extensions/no_auto_literal_strings_spec.rb +1 -1
  148. data/spec/extensions/pg_enum_spec.rb +16 -1
  149. data/spec/extensions/pg_interval_spec.rb +11 -2
  150. data/spec/extensions/pg_loose_count_spec.rb +5 -0
  151. data/spec/extensions/pg_row_spec.rb +25 -0
  152. data/spec/extensions/prepared_statements_spec.rb +10 -1
  153. data/spec/extensions/query_spec.rb +2 -2
  154. data/spec/extensions/schema_dumper_spec.rb +2 -2
  155. data/spec/extensions/schema_spec.rb +2 -2
  156. data/spec/extensions/set_overrides_spec.rb +7 -3
  157. data/spec/extensions/sql_expr_spec.rb +0 -1
  158. data/spec/extensions/subset_conditions_spec.rb +6 -6
  159. data/spec/extensions/table_select_spec.rb +24 -12
  160. data/spec/extensions/to_dot_spec.rb +4 -4
  161. data/spec/extensions/whitelist_security_spec.rb +131 -0
  162. data/spec/integration/dataset_test.rb +9 -5
  163. data/spec/integration/model_test.rb +2 -0
  164. data/spec/integration/plugin_test.rb +2 -2
  165. data/spec/integration/spec_helper.rb +1 -1
  166. data/spec/model/associations_spec.rb +39 -11
  167. data/spec/model/base_spec.rb +44 -24
  168. data/spec/model/class_dataset_methods_spec.rb +18 -16
  169. data/spec/model/dataset_methods_spec.rb +4 -4
  170. data/spec/model/eager_loading_spec.rb +84 -24
  171. data/spec/model/model_spec.rb +97 -63
  172. data/spec/model/record_spec.rb +21 -13
  173. metadata +13 -2
@@ -186,13 +186,14 @@ module Sequel
186
186
  # Dataset subclass used for datasets that connect to PostgreSQL via JDBC.
187
187
  class Dataset < JDBC::Dataset
188
188
  include Sequel::Postgres::DatasetMethods
189
- APOS = Dataset::APOS
189
+ APOS = "'".freeze
190
+ Sequel::Deprecation.deprecate_constant(self, :APOS)
190
191
 
191
192
  private
192
193
 
193
194
  # Literalize strings similar to the native postgres adapter
194
195
  def literal_string_append(sql, v)
195
- sql << APOS << db.synchronize(@opts[:server]){|c| c.escape_string(v)} << APOS
196
+ sql << "'" << db.synchronize(@opts[:server]){|c| c.escape_string(v)} << "'"
196
197
  end
197
198
 
198
199
  # SQL fragment for Sequel::SQLTime, containing just the time part
@@ -202,7 +203,7 @@ module Sequel
202
203
 
203
204
  STRING_TYPE = Java::JavaSQL::Types::VARCHAR
204
205
  ARRAY_TYPE = Java::JavaSQL::Types::ARRAY
205
- PG_SPECIFIC_TYPES = [ARRAY_TYPE, Java::JavaSQL::Types::OTHER, Java::JavaSQL::Types::STRUCT]
206
+ PG_SPECIFIC_TYPES = [ARRAY_TYPE, Java::JavaSQL::Types::OTHER, Java::JavaSQL::Types::STRUCT]#.freeze # SEQUEL5
206
207
  HSTORE_TYPE = 'hstore'.freeze
207
208
 
208
209
  def type_convertor(map, meta, type, i)
@@ -43,13 +43,14 @@ module Sequel
43
43
  include Sequel::JDBC::Transactions
44
44
 
45
45
  LAST_INSERT_ID = 'SELECT @@IDENTITY'.freeze
46
+ Sequel::Deprecation.deprecate_constant(self, :LAST_INSERT_ID)
46
47
 
47
48
  private
48
49
 
49
50
  # Get the last inserted id.
50
51
  def last_insert_id(conn, opts=OPTS)
51
52
  statement(conn) do |stmt|
52
- sql = LAST_INSERT_ID
53
+ sql = 'SELECT @@IDENTITY'
53
54
  rs = log_connection_yield(sql, conn){stmt.executeQuery(sql)}
54
55
  rs.next
55
56
  rs.getLong(1)
@@ -20,14 +20,16 @@ module Sequel
20
20
  module DatabaseMethods
21
21
  include Sequel::SQLite::DatabaseMethods
22
22
  LAST_INSERT_ROWID = 'SELECT last_insert_rowid()'.freeze
23
+ Sequel::Deprecation.deprecate_constant(self, :LAST_INSERT_ROWID)
23
24
  FOREIGN_KEY_ERROR_RE = /query does not return ResultSet/.freeze
25
+ Sequel::Deprecation.deprecate_constant(self, :FOREIGN_KEY_ERROR_RE)
24
26
 
25
27
  # Swallow pointless exceptions when the foreign key list pragma
26
28
  # doesn't return any rows.
27
29
  def foreign_key_list(table, opts=OPTS)
28
30
  super
29
31
  rescue Sequel::DatabaseError => e
30
- raise unless e.message =~ FOREIGN_KEY_ERROR_RE
32
+ raise unless foreign_key_error?(e)
31
33
  []
32
34
  end
33
35
 
@@ -36,7 +38,7 @@ module Sequel
36
38
  def indexes(table, opts=OPTS)
37
39
  super
38
40
  rescue Sequel::DatabaseError => e
39
- raise unless e.message =~ FOREIGN_KEY_ERROR_RE
41
+ raise unless foreign_key_error?(e)
40
42
  {}
41
43
  end
42
44
 
@@ -50,7 +52,7 @@ module Sequel
50
52
  # Use last_insert_rowid() to get the last inserted id.
51
53
  def last_insert_id(conn, opts=OPTS)
52
54
  statement(conn) do |stmt|
53
- rs = stmt.executeQuery(LAST_INSERT_ROWID)
55
+ rs = stmt.executeQuery('SELECT last_insert_rowid()')
54
56
  rs.next
55
57
  rs.getLong(1)
56
58
  end
@@ -71,6 +73,11 @@ module Sequel
71
73
  conn
72
74
  end
73
75
 
76
+ # Whether the given exception is due to a foreign key error.
77
+ def foreign_key_error?(exception)
78
+ exception.message =~ /query does not return ResultSet/
79
+ end
80
+
74
81
  # Use getLong instead of getInt for converting integers on SQLite, since SQLite does not enforce a limit of 2**32.
75
82
  # Work around regressions in jdbc-sqlite 3.8.7 for date and blob types.
76
83
  def setup_type_convertor_map
@@ -14,6 +14,16 @@ module Sequel
14
14
  end
15
15
  end
16
16
 
17
+ class TypeConvertor
18
+ def MSSQLRubyTime(r, i)
19
+ # MSSQL-Server TIME should be fetched as string to keep the precision intact, see:
20
+ # https://docs.microsoft.com/en-us/sql/t-sql/data-types/time-transact-sql#a-namebackwardcompatibilityfordownlevelclientsa-backward-compatibility-for-down-level-clients
21
+ if v = r.getString(i)
22
+ Sequel.string_to_time("#{v}")
23
+ end
24
+ end
25
+ end
26
+
17
27
  # Database and Dataset instance methods for SQLServer specific
18
28
  # support via JDBC.
19
29
  module SQLServer
@@ -21,6 +31,19 @@ module Sequel
21
31
  module DatabaseMethods
22
32
  include Sequel::JDBC::MSSQL::DatabaseMethods
23
33
 
34
+ def setup_type_convertor_map
35
+ super
36
+ map = @type_convertor_map
37
+ map[Java::JavaSQL::Types::TIME] = TypeConvertor::INSTANCE.method(:MSSQLRubyTime)
38
+ if defined?(Java::MicrosoftSql::Types::DATETIMEOFFSET)
39
+ map[Java::MicrosoftSql::Types::DATETIMEOFFSET] = lambda do |r, i|
40
+ if v = r.getDateTimeOffset(i)
41
+ to_application_timestamp(v.to_s)
42
+ end
43
+ end
44
+ end
45
+ end
46
+
24
47
  # Work around a bug in SQL Server JDBC Driver 3.0, where the metadata
25
48
  # for the getColumns result set specifies an incorrect type for the
26
49
  # IS_AUTOINCREMENT column. The column is a string, but the type is
@@ -4,11 +4,17 @@ module Sequel
4
4
  module JDBC
5
5
  module Transactions
6
6
  TRANSACTION_BEGIN = 'Transaction.begin'.freeze
7
+ Sequel::Deprecation.deprecate_constant(self, :TRANSACTION_BEGIN)
7
8
  TRANSACTION_COMMIT = 'Transaction.commit'.freeze
9
+ Sequel::Deprecation.deprecate_constant(self, :TRANSACTION_COMMIT)
8
10
  TRANSACTION_RELEASE_SP = 'Transaction.release_savepoint'.freeze
11
+ Sequel::Deprecation.deprecate_constant(self, :TRANSACTION_RELEASE_SP)
9
12
  TRANSACTION_ROLLBACK = 'Transaction.rollback'.freeze
13
+ Sequel::Deprecation.deprecate_constant(self, :TRANSACTION_ROLLBACK)
10
14
  TRANSACTION_ROLLBACK_SP = 'Transaction.rollback_savepoint'.freeze
15
+ Sequel::Deprecation.deprecate_constant(self, :TRANSACTION_ROLLBACK_SP)
11
16
  TRANSACTION_SAVEPOINT= 'Transaction.savepoint'.freeze
17
+ Sequel::Deprecation.deprecate_constant(self, :TRANSACTION_SAVEPOINT)
12
18
 
13
19
  def freeze
14
20
  supports_savepoints?
@@ -32,7 +38,7 @@ module Sequel
32
38
  JDBC_TRANSACTION_ISOLATION_LEVELS = {:uncommitted=>JavaSQL::Connection::TRANSACTION_READ_UNCOMMITTED,
33
39
  :committed=>JavaSQL::Connection::TRANSACTION_READ_COMMITTED,
34
40
  :repeatable=>JavaSQL::Connection::TRANSACTION_REPEATABLE_READ,
35
- :serializable=>JavaSQL::Connection::TRANSACTION_SERIALIZABLE}
41
+ :serializable=>JavaSQL::Connection::TRANSACTION_SERIALIZABLE}#.freeze # SEQUEL5
36
42
 
37
43
  # Set the transaction isolation level on the given connection using
38
44
  # the JDBC API.
@@ -55,14 +61,14 @@ module Sequel
55
61
  if supports_savepoints?
56
62
  th = _trans(conn)
57
63
  if sps = th[:savepoint_objs]
58
- sps << log_connection_yield(TRANSACTION_SAVEPOINT, conn){conn.set_savepoint}
64
+ sps << log_connection_yield('Transaction.savepoint', conn){conn.set_savepoint}
59
65
  else
60
- log_connection_yield(TRANSACTION_BEGIN, conn){conn.setAutoCommit(false)}
66
+ log_connection_yield('Transaction.begin', conn){conn.setAutoCommit(false)}
61
67
  th[:savepoint_objs] = []
62
68
  set_transaction_isolation(conn, opts)
63
69
  end
64
70
  else
65
- log_connection_yield(TRANSACTION_BEGIN, conn){conn.setAutoCommit(false)}
71
+ log_connection_yield('Transaction.begin', conn){conn.setAutoCommit(false)}
66
72
  set_transaction_isolation(conn, opts)
67
73
  end
68
74
  end
@@ -72,12 +78,12 @@ module Sequel
72
78
  if supports_savepoints?
73
79
  sps = _trans(conn)[:savepoint_objs]
74
80
  if sps.empty?
75
- log_connection_yield(TRANSACTION_COMMIT, conn){conn.commit}
81
+ log_connection_yield('Transaction.commit', conn){conn.commit}
76
82
  elsif supports_releasing_savepoints?
77
- log_connection_yield(TRANSACTION_RELEASE_SP, conn){supports_releasing_savepoints? ? conn.release_savepoint(sps.last) : sps.last}
83
+ log_connection_yield('Transaction.release_savepoint', conn){supports_releasing_savepoints? ? conn.release_savepoint(sps.last) : sps.last}
78
84
  end
79
85
  else
80
- log_connection_yield(TRANSACTION_COMMIT, conn){conn.commit}
86
+ log_connection_yield('Transaction.commit', conn){conn.commit}
81
87
  end
82
88
  end
83
89
 
@@ -102,12 +108,12 @@ module Sequel
102
108
  if supports_savepoints?
103
109
  sps = _trans(conn)[:savepoint_objs]
104
110
  if sps.empty?
105
- log_connection_yield(TRANSACTION_ROLLBACK, conn){conn.rollback}
111
+ log_connection_yield('Transaction.rollback', conn){conn.rollback}
106
112
  else
107
- log_connection_yield(TRANSACTION_ROLLBACK_SP, conn){conn.rollback(sps.last)}
113
+ log_connection_yield('Transaction.rollback_savepoint', conn){conn.rollback(sps.last)}
108
114
  end
109
115
  else
110
- log_connection_yield(TRANSACTION_ROLLBACK, conn){conn.rollback}
116
+ log_connection_yield('Transaction.rollback', conn){conn.rollback}
111
117
  end
112
118
  end
113
119
  end
@@ -296,6 +296,10 @@ module Sequel
296
296
  end
297
297
  end
298
298
 
299
+ def dataset_class_default
300
+ Dataset
301
+ end
302
+
299
303
  def quote_identifiers_default
300
304
  shared_adapter? ? super : false
301
305
  end
@@ -307,6 +311,7 @@ module Sequel
307
311
 
308
312
  class Dataset < Sequel::Dataset
309
313
  Database::DatasetClass = self
314
+ Sequel::Deprecation.deprecate_constant(Database, :DatasetClass)
310
315
 
311
316
  # The autoid setting for this dataset, if it has been overridden
312
317
  def autoid
@@ -28,6 +28,7 @@ module Sequel
28
28
  }.each do |k,v|
29
29
  k.each{|n| MYSQL_TYPES[n] = v}
30
30
  end
31
+ # MYSQL_TYPES.freeze # SEQUEL5
31
32
 
32
33
  class << self
33
34
  # Whether to convert invalid date time values by default.
@@ -47,6 +48,7 @@ module Sequel
47
48
  # Regular expression used for getting accurate number of rows
48
49
  # matched by an update statement.
49
50
  AFFECTED_ROWS_RE = /Rows matched:\s+(\d+)\s+Changed:\s+\d+\s+Warnings:\s+\d+/.freeze
51
+ Sequel::Deprecation.deprecate_constant(self, :AFFECTED_ROWS_RE)
50
52
 
51
53
  set_adapter_scheme :mysql
52
54
 
@@ -234,7 +236,7 @@ module Sequel
234
236
  # that may be inaccurate.
235
237
  def affected_rows(conn)
236
238
  s = conn.info
237
- if s && s =~ AFFECTED_ROWS_RE
239
+ if s && s =~ /Rows matched:\s+(\d+)\s+Changed:\s+\d+\s+Warnings:\s+\d+/
238
240
  $1.to_i
239
241
  else
240
242
  conn.affected_rows
@@ -273,6 +275,10 @@ module Sequel
273
275
  exception.sqlstate
274
276
  end
275
277
 
278
+ def dataset_class_default
279
+ Dataset
280
+ end
281
+
276
282
  # Raise a disconnect error if the exception message matches the list
277
283
  # of recognized exceptions.
278
284
  def disconnect_error?(e, opts)
@@ -299,6 +305,7 @@ module Sequel
299
305
  include Sequel::MySQL::PreparedStatements::DatasetMethods
300
306
 
301
307
  Database::DatasetClass = self
308
+ Sequel::Deprecation.deprecate_constant(Database, :DatasetClass)
302
309
 
303
310
  # Yield all rows matching this dataset. If the dataset is set to
304
311
  # split multiple statements, yield arrays of hashes one per statement
@@ -204,6 +204,10 @@ module Sequel
204
204
  exception.sql_state
205
205
  end
206
206
 
207
+ def dataset_class_default
208
+ Dataset
209
+ end
210
+
207
211
  # If a connection object is available, try pinging it. Otherwise, if the
208
212
  # error is a Mysql2::Error, check the SQL state and exception message for
209
213
  # disconnects.
@@ -236,6 +240,7 @@ module Sequel
236
240
  STREAMING_SUPPORTED = ::Mysql2::VERSION >= '0.3.12'
237
241
 
238
242
  Database::DatasetClass = self
243
+ Sequel::Deprecation.deprecate_constant(Database, :DatasetClass)
239
244
 
240
245
  if NativePreparedStatements
241
246
  PreparedStatementMethods = prepared_statements_module(
@@ -299,7 +304,7 @@ module Sequel
299
304
  # Handle correct quoting of strings using ::Mysql2::Client#escape.
300
305
  def literal_string_append(sql, v)
301
306
  s = db.synchronize(@opts[:server]){|c| c.escape(v)}
302
- sql << APOS << s << APOS
307
+ sql << "'" << s << "'"
303
308
  end
304
309
  end
305
310
  end
@@ -12,8 +12,11 @@ module Sequel
12
12
  set_adapter_scheme :odbc
13
13
 
14
14
  GUARDED_DRV_NAME = /^\{.+\}$/.freeze
15
+ Sequel::Deprecation.deprecate_constant(self, :GUARDED_DRV_NAME)
15
16
  DRV_NAME_GUARDS = '{%s}'.freeze
17
+ Sequel::Deprecation.deprecate_constant(self, :DRV_NAME_GUARDS)
16
18
  DISCONNECT_ERRORS = /\A08S01/.freeze
19
+ Sequel::Deprecation.deprecate_constant(self, :DISCONNECT_ERRORS)
17
20
 
18
21
  def connect(server)
19
22
  opts = server_opts(server)
@@ -23,8 +26,8 @@ module Sequel
23
26
  drv = ::ODBC::Driver.new
24
27
  drv.name = 'Sequel ODBC Driver130'
25
28
  opts.each do |param, value|
26
- if :driver == param and not (value =~ GUARDED_DRV_NAME)
27
- value = DRV_NAME_GUARDS % value
29
+ if :driver == param && value !~ /\A\{.+\}\z/
30
+ value = "{#{value}}"
28
31
  end
29
32
  drv.attrs[param.to_s.upcase] = value.to_s
30
33
  end
@@ -80,24 +83,33 @@ module Sequel
80
83
  [::ODBC::Error]
81
84
  end
82
85
 
86
+ def dataset_class_default
87
+ Dataset
88
+ end
89
+
83
90
  def disconnect_error?(e, opts)
84
- super || (e.is_a?(::ODBC::Error) && DISCONNECT_ERRORS.match(e.message))
91
+ super || (e.is_a?(::ODBC::Error) && /\A08S01/.match(e.message))
85
92
  end
86
93
  end
87
94
 
88
95
  class Dataset < Sequel::Dataset
89
96
  BOOL_TRUE = '1'.freeze
97
+ Sequel::Deprecation.deprecate_constant(self, :BOOL_TRUE)
90
98
  BOOL_FALSE = '0'.freeze
99
+ Sequel::Deprecation.deprecate_constant(self, :BOOL_FALSE)
91
100
  ODBC_DATE_FORMAT = "{d '%Y-%m-%d'}".freeze
101
+ Sequel::Deprecation.deprecate_constant(self, :ODBC_DATE_FORMAT)
92
102
  TIMESTAMP_FORMAT="{ts '%Y-%m-%d %H:%M:%S'}".freeze
103
+ Sequel::Deprecation.deprecate_constant(self, :TIMESTAMP_FORMAT)
93
104
 
94
105
  Database::DatasetClass = self
106
+ Sequel::Deprecation.deprecate_constant(Database, :DatasetClass)
95
107
 
96
108
  def fetch_rows(sql)
97
109
  execute(sql) do |s|
98
110
  i = -1
99
111
  cols = s.columns(true).map{|c| [output_identifier(c.name), c.type, i+=1]}
100
- columns = cols.map{|c| c.at(0)}
112
+ columns = cols.map{|c| c[0]}
101
113
  self.columns = columns
102
114
  if rows = s.fetch_all
103
115
  rows.each do |row|
@@ -136,19 +148,19 @@ module Sequel
136
148
  end
137
149
 
138
150
  def default_timestamp_format
139
- TIMESTAMP_FORMAT
151
+ "{ts '%Y-%m-%d %H:%M:%S'}"
140
152
  end
141
153
 
142
154
  def literal_date(v)
143
- v.strftime(ODBC_DATE_FORMAT)
155
+ v.strftime("{d '%Y-%m-%d'}")
144
156
  end
145
157
 
146
158
  def literal_false
147
- BOOL_FALSE
159
+ '0'
148
160
  end
149
161
 
150
162
  def literal_true
151
- BOOL_TRUE
163
+ '1'
152
164
  end
153
165
  end
154
166
  end
@@ -18,6 +18,7 @@ module Sequel
18
18
  module DatabaseMethods
19
19
  include Sequel::MSSQL::DatabaseMethods
20
20
  LAST_INSERT_ID_SQL='SELECT SCOPE_IDENTITY()'.freeze
21
+ Sequel::Deprecation.deprecate_constant(self, :LAST_INSERT_ID_SQL)
21
22
 
22
23
  # Return the last inserted identity value.
23
24
  def execute_insert(sql, opts=OPTS)
@@ -25,7 +26,8 @@ module Sequel
25
26
  begin
26
27
  log_connection_yield(sql, conn){conn.do(sql)}
27
28
  begin
28
- s = log_connection_yield(LAST_INSERT_ID_SQL, conn){conn.run(LAST_INSERT_ID_SQL)}
29
+ last_insert_id_sql = 'SELECT SCOPE_IDENTITY()'
30
+ s = log_connection_yield(last_insert_id_sql, conn){conn.run(last_insert_id_sql)}
29
31
  if (rows = s.fetch_all) and (row = rows.first) and (v = row.first)
30
32
  Integer(v)
31
33
  end
@@ -44,17 +46,18 @@ module Sequel
44
46
  # Use ODBC format, not Microsoft format, as the ODBC layer does
45
47
  # some translation. MSSQL version is over-ridden to allow 3 millisecond decimal places
46
48
  TIMESTAMP_FORMAT="{ts '%Y-%m-%d %H:%M:%S%N'}".freeze
49
+ Sequel::Deprecation.deprecate_constant(self, :TIMESTAMP_FORMAT)
47
50
 
48
51
  private
49
52
 
50
53
  def default_timestamp_format
51
- TIMESTAMP_FORMAT
54
+ "{ts '%Y-%m-%d %H:%M:%S%N'}"
52
55
  end
53
56
 
54
57
  # Use ODBC format, not Microsoft format, as the ODBC layer does
55
58
  # some translation.
56
59
  def literal_date(v)
57
- v.strftime(ODBC_DATE_FORMAT)
60
+ v.strftime("{d '%Y-%m-%d'}")
58
61
  end
59
62
  end
60
63
  end
@@ -13,12 +13,12 @@ module Sequel
13
13
  # ORA-01012: not logged on
14
14
  # ORA-03113: end-of-file on communication channel
15
15
  # ORA-03114: not connected to ORACLE
16
- CONNECTION_ERROR_CODES = [ 28, 1012, 3113, 3114 ]
16
+ CONNECTION_ERROR_CODES = [ 28, 1012, 3113, 3114 ]#.freeze # SEQUEL5
17
17
 
18
18
  ORACLE_TYPES = {
19
19
  :blob=>lambda{|b| Sequel::SQL::Blob.new(b.read)},
20
20
  :clob=>lambda(&:read)
21
- }
21
+ }#.freeze # SEQUEL5
22
22
 
23
23
  # Hash of conversion procs for this database.
24
24
  attr_reader :conversion_procs
@@ -164,6 +164,10 @@ module Sequel
164
164
  end
165
165
  end
166
166
 
167
+ def dataset_class_default
168
+ Dataset
169
+ end
170
+
167
171
  def execute_prepared_statement(conn, type, name, opts)
168
172
  ps = prepared_statement(name)
169
173
  sql = ps.prepared_sql
@@ -216,12 +220,12 @@ module Sequel
216
220
  end
217
221
 
218
222
  def begin_transaction(conn, opts=OPTS)
219
- log_connection_yield(TRANSACTION_BEGIN, conn){conn.autocommit = false}
223
+ log_connection_yield('Transaction.begin', conn){conn.autocommit = false}
220
224
  set_transaction_isolation(conn, opts)
221
225
  end
222
226
 
223
227
  def commit_transaction(conn, opts=OPTS)
224
- log_connection_yield(TRANSACTION_COMMIT, conn){conn.commit}
228
+ log_connection_yield('Transaction.commit', conn){conn.commit}
225
229
  end
226
230
 
227
231
  def disconnect_error?(e, opts)
@@ -253,7 +257,7 @@ module Sequel
253
257
  end
254
258
 
255
259
  def rollback_transaction(conn, opts=OPTS)
256
- log_connection_yield(TRANSACTION_ROLLBACK, conn){conn.rollback}
260
+ log_connection_yield('Transaction.rollback', conn){conn.rollback}
257
261
  end
258
262
 
259
263
  def schema_parse_table(table, opts=OPTS)
@@ -325,8 +329,10 @@ module Sequel
325
329
  include DatasetMethods
326
330
 
327
331
  Database::DatasetClass = self
332
+ Sequel::Deprecation.deprecate_constant(Database, :DatasetClass)
328
333
 
329
334
  PREPARED_ARG_PLACEHOLDER = ':'.freeze
335
+ Sequel::Deprecation.deprecate_constant(self, :PREPARED_ARG_PLACEHOLDER)
330
336
 
331
337
  # Oracle already supports named bind arguments, so use directly.
332
338
  module ArgumentMapper
@@ -398,7 +404,7 @@ module Sequel
398
404
  end
399
405
 
400
406
  def prepared_arg_placeholder
401
- PREPARED_ARG_PLACEHOLDER
407
+ ':'
402
408
  end
403
409
 
404
410
  def bound_variable_modules