sequel 4.45.0 → 4.46.0

Sign up to get free protection for your applications and to get access to all the features.
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