sequel 3.34.1 → 3.35.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 (101) hide show
  1. data/CHANGELOG +52 -0
  2. data/README.rdoc +3 -1
  3. data/Rakefile +2 -10
  4. data/doc/active_record.rdoc +1 -0
  5. data/doc/migration.rdoc +18 -7
  6. data/doc/model_hooks.rdoc +6 -0
  7. data/doc/opening_databases.rdoc +3 -0
  8. data/doc/prepared_statements.rdoc +0 -1
  9. data/doc/release_notes/3.35.0.txt +144 -0
  10. data/doc/schema_modification.rdoc +16 -1
  11. data/doc/thread_safety.rdoc +17 -0
  12. data/lib/sequel/adapters/do.rb +2 -2
  13. data/lib/sequel/adapters/do/postgres.rb +1 -52
  14. data/lib/sequel/adapters/do/sqlite.rb +0 -5
  15. data/lib/sequel/adapters/firebird.rb +1 -1
  16. data/lib/sequel/adapters/ibmdb.rb +2 -2
  17. data/lib/sequel/adapters/jdbc.rb +23 -19
  18. data/lib/sequel/adapters/jdbc/db2.rb +0 -5
  19. data/lib/sequel/adapters/jdbc/derby.rb +29 -2
  20. data/lib/sequel/adapters/jdbc/firebird.rb +0 -5
  21. data/lib/sequel/adapters/jdbc/h2.rb +1 -1
  22. data/lib/sequel/adapters/jdbc/hsqldb.rb +7 -0
  23. data/lib/sequel/adapters/jdbc/informix.rb +0 -5
  24. data/lib/sequel/adapters/jdbc/jtds.rb +0 -5
  25. data/lib/sequel/adapters/jdbc/mysql.rb +0 -5
  26. data/lib/sequel/adapters/jdbc/postgresql.rb +4 -35
  27. data/lib/sequel/adapters/jdbc/sqlite.rb +0 -5
  28. data/lib/sequel/adapters/jdbc/sqlserver.rb +0 -5
  29. data/lib/sequel/adapters/jdbc/transactions.rb +4 -4
  30. data/lib/sequel/adapters/mysql2.rb +1 -1
  31. data/lib/sequel/adapters/odbc.rb +3 -3
  32. data/lib/sequel/adapters/odbc/mssql.rb +14 -1
  33. data/lib/sequel/adapters/oracle.rb +6 -18
  34. data/lib/sequel/adapters/postgres.rb +36 -53
  35. data/lib/sequel/adapters/shared/db2.rb +16 -2
  36. data/lib/sequel/adapters/shared/mssql.rb +40 -9
  37. data/lib/sequel/adapters/shared/mysql.rb +16 -4
  38. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +2 -2
  39. data/lib/sequel/adapters/shared/oracle.rb +2 -0
  40. data/lib/sequel/adapters/shared/postgres.rb +135 -211
  41. data/lib/sequel/adapters/sqlite.rb +2 -2
  42. data/lib/sequel/adapters/swift.rb +1 -1
  43. data/lib/sequel/adapters/swift/postgres.rb +1 -71
  44. data/lib/sequel/adapters/tinytds.rb +3 -3
  45. data/lib/sequel/core.rb +27 -4
  46. data/lib/sequel/database/connecting.rb +7 -8
  47. data/lib/sequel/database/logging.rb +6 -1
  48. data/lib/sequel/database/misc.rb +20 -4
  49. data/lib/sequel/database/query.rb +38 -18
  50. data/lib/sequel/database/schema_generator.rb +5 -2
  51. data/lib/sequel/database/schema_methods.rb +34 -8
  52. data/lib/sequel/dataset/prepared_statements.rb +1 -1
  53. data/lib/sequel/dataset/sql.rb +18 -24
  54. data/lib/sequel/extensions/core_extensions.rb +0 -23
  55. data/lib/sequel/extensions/migration.rb +22 -8
  56. data/lib/sequel/extensions/pg_auto_parameterize.rb +4 -0
  57. data/lib/sequel/extensions/schema_dumper.rb +1 -1
  58. data/lib/sequel/model.rb +2 -2
  59. data/lib/sequel/model/associations.rb +95 -70
  60. data/lib/sequel/model/base.rb +16 -18
  61. data/lib/sequel/plugins/dirty.rb +214 -0
  62. data/lib/sequel/plugins/identity_map.rb +1 -1
  63. data/lib/sequel/plugins/json_serializer.rb +16 -1
  64. data/lib/sequel/plugins/many_through_many.rb +22 -32
  65. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +2 -2
  66. data/lib/sequel/plugins/prepared_statements.rb +22 -8
  67. data/lib/sequel/plugins/prepared_statements_associations.rb +2 -3
  68. data/lib/sequel/plugins/prepared_statements_with_pk.rb +1 -1
  69. data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
  70. data/lib/sequel/plugins/subclasses.rb +10 -2
  71. data/lib/sequel/plugins/timestamps.rb +1 -1
  72. data/lib/sequel/plugins/xml_serializer.rb +12 -1
  73. data/lib/sequel/sql.rb +1 -1
  74. data/lib/sequel/version.rb +2 -2
  75. data/spec/adapters/postgres_spec.rb +30 -79
  76. data/spec/core/database_spec.rb +46 -2
  77. data/spec/core/dataset_spec.rb +28 -22
  78. data/spec/core/schema_generator_spec.rb +1 -1
  79. data/spec/core/schema_spec.rb +51 -0
  80. data/spec/extensions/arbitrary_servers_spec.rb +0 -4
  81. data/spec/extensions/association_autoreloading_spec.rb +17 -0
  82. data/spec/extensions/association_proxies_spec.rb +4 -4
  83. data/spec/extensions/core_extensions_spec.rb +1 -24
  84. data/spec/extensions/dirty_spec.rb +155 -0
  85. data/spec/extensions/json_serializer_spec.rb +13 -0
  86. data/spec/extensions/migration_spec.rb +28 -15
  87. data/spec/extensions/named_timezones_spec.rb +6 -8
  88. data/spec/extensions/pg_auto_parameterize_spec.rb +6 -5
  89. data/spec/extensions/schema_dumper_spec.rb +3 -1
  90. data/spec/extensions/xml_serializer_spec.rb +13 -0
  91. data/spec/files/{transactionless_migrations → transaction_specified_migrations}/001_create_alt_basic.rb +1 -1
  92. data/spec/files/{transactionless_migrations → transaction_specified_migrations}/002_create_basic.rb +0 -0
  93. data/spec/files/{transaction_migrations → transaction_unspecified_migrations}/001_create_alt_basic.rb +0 -0
  94. data/spec/files/{transaction_migrations → transaction_unspecified_migrations}/002_create_basic.rb +0 -0
  95. data/spec/integration/associations_test.rb +5 -7
  96. data/spec/integration/dataset_test.rb +25 -7
  97. data/spec/integration/plugin_test.rb +1 -1
  98. data/spec/integration/schema_test.rb +16 -1
  99. data/spec/model/associations_spec.rb +2 -2
  100. metadata +14 -9
  101. data/lib/sequel/adapters/odbc/db2.rb +0 -17
@@ -25,11 +25,6 @@ module Sequel
25
25
  super
26
26
  end
27
27
  end
28
-
29
- # Dataset class for SQLite datasets accessed via DataObjects.
30
- class Dataset < DataObjects::Dataset
31
- include Sequel::SQLite::DatasetMethods
32
- end
33
28
  end
34
29
  end
35
30
  end
@@ -31,7 +31,7 @@ module Sequel
31
31
  def execute(sql, opts={})
32
32
  begin
33
33
  synchronize(opts[:server]) do |conn|
34
- if conn.transaction_started && !@transactions.has_key?(conn)
34
+ if conn.transaction_started && !_trans(conn)
35
35
  conn.rollback
36
36
  raise DatabaseDisconnectError, "transaction accidently left open, rolling back and disconnecting"
37
37
  end
@@ -227,7 +227,7 @@ module Sequel
227
227
  # Execute a prepared statement named by name on the database.
228
228
  def execute_prepared_statement(ps_name, opts)
229
229
  args = opts[:arguments]
230
- ps = prepared_statements[ps_name]
230
+ ps = prepared_statement(ps_name)
231
231
  sql = ps.prepared_sql
232
232
  synchronize(opts[:server]) do |conn|
233
233
  unless conn.prepared_statements.fetch(ps_name, []).first == sql
@@ -444,7 +444,7 @@ module Sequel
444
444
  ps.extend(PreparedStatementMethods)
445
445
  if name
446
446
  ps.prepared_statement_name = name
447
- db.prepared_statements[name] = ps
447
+ db.set_prepared_statement(name, ps)
448
448
  end
449
449
  ps
450
450
  end
@@ -39,14 +39,14 @@ module Sequel
39
39
  :mysql=>proc do |db|
40
40
  Sequel.ts_require 'adapters/jdbc/mysql'
41
41
  db.extend(Sequel::JDBC::MySQL::DatabaseMethods)
42
- db.dataset_class = Sequel::JDBC::MySQL::Dataset
42
+ db.extend_datasets Sequel::MySQL::DatasetMethods
43
43
  JDBC.load_gem('mysql')
44
44
  com.mysql.jdbc.Driver
45
45
  end,
46
46
  :sqlite=>proc do |db|
47
47
  Sequel.ts_require 'adapters/jdbc/sqlite'
48
48
  db.extend(Sequel::JDBC::SQLite::DatabaseMethods)
49
- db.dataset_class = Sequel::JDBC::SQLite::Dataset
49
+ db.extend_datasets Sequel::SQLite::DatasetMethods
50
50
  db.set_integer_booleans
51
51
  JDBC.load_gem('sqlite3')
52
52
  org.sqlite.JDBC
@@ -60,13 +60,13 @@ module Sequel
60
60
  :sqlserver=>proc do |db|
61
61
  Sequel.ts_require 'adapters/jdbc/sqlserver'
62
62
  db.extend(Sequel::JDBC::SQLServer::DatabaseMethods)
63
- db.dataset_class = Sequel::JDBC::SQLServer::Dataset
63
+ db.extend_datasets Sequel::MSSQL::DatasetMethods
64
64
  db.send(:set_mssql_unicode_strings)
65
65
  com.microsoft.sqlserver.jdbc.SQLServerDriver
66
66
  end,
67
67
  :jtds=>proc do |db|
68
68
  Sequel.ts_require 'adapters/jdbc/jtds'
69
- db.extend(Sequel::JDBC::JTDS::DatabaseMethods)
69
+ db.extend(Sequel::JDBC::MSSQL::DatabaseMethods)
70
70
  db.dataset_class = Sequel::JDBC::JTDS::Dataset
71
71
  db.send(:set_mssql_unicode_strings)
72
72
  JDBC.load_gem('jtds')
@@ -102,19 +102,19 @@ module Sequel
102
102
  :"informix-sqli"=>proc do |db|
103
103
  Sequel.ts_require 'adapters/jdbc/informix'
104
104
  db.extend(Sequel::JDBC::Informix::DatabaseMethods)
105
- db.dataset_class = Sequel::JDBC::Informix::Dataset
105
+ db.extend_datasets Sequel::Informix::DatasetMethods
106
106
  com.informix.jdbc.IfxDriver
107
107
  end,
108
108
  :db2=>proc do |db|
109
109
  Sequel.ts_require 'adapters/jdbc/db2'
110
110
  db.extend(Sequel::JDBC::DB2::DatabaseMethods)
111
- db.dataset_class = Sequel::JDBC::DB2::Dataset
111
+ db.extend_datasets Sequel::DB2::DatasetMethods
112
112
  com.ibm.db2.jcc.DB2Driver
113
113
  end,
114
114
  :firebirdsql=>proc do |db|
115
115
  Sequel.ts_require 'adapters/jdbc/firebird'
116
116
  db.extend(Sequel::JDBC::Firebird::DatabaseMethods)
117
- db.dataset_class = Sequel::JDBC::Firebird::Dataset
117
+ db.extend_datasets Sequel::Firebird::DatasetMethods
118
118
  org.firebirdsql.jdbc.FBDriver
119
119
  end
120
120
  }
@@ -151,6 +151,8 @@ module Sequel
151
151
  # uri, since JDBC requires one.
152
152
  def initialize(opts)
153
153
  super
154
+ @connection_prepared_statements = {}
155
+ @connection_prepared_statements_mutex = Mutex.new
154
156
  @convert_types = typecast_value_boolean(@opts.fetch(:convert_types, true))
155
157
  raise(Error, "No connection string specified") unless uri
156
158
 
@@ -312,8 +314,15 @@ module Sequel
312
314
 
313
315
  private
314
316
 
315
- # Close given adapter connections
317
+ # Yield the native prepared statements hash for the given connection
318
+ # to the block in a thread-safe manner.
319
+ def cps_sync(conn, &block)
320
+ @connection_prepared_statements_mutex.synchronize{yield(@connection_prepared_statements[conn] ||= {})}
321
+ end
322
+
323
+ # Close given adapter connections, and delete any related prepared statements.
316
324
  def disconnect_connection(c)
325
+ @connection_prepared_statements_mutex.synchronize{@connection_prepared_statements.delete(c)}
317
326
  c.close
318
327
  end
319
328
 
@@ -336,16 +345,16 @@ module Sequel
336
345
  ps = name
337
346
  name = ps.prepared_statement_name
338
347
  else
339
- ps = prepared_statements[name]
348
+ ps = prepared_statement(name)
340
349
  end
341
350
  sql = ps.prepared_sql
342
351
  synchronize(opts[:server]) do |conn|
343
- if name and cps = conn.prepared_statements[name] and cps[0] == sql
352
+ if name and cps = cps_sync(conn){|cpsh| cpsh[name]} and cps[0] == sql
344
353
  cps = cps[1]
345
354
  else
346
355
  log_yield("CLOSE #{name}"){cps[1].close} if cps
347
356
  cps = log_yield("PREPARE#{" #{name}:" if name} #{sql}"){conn.prepareStatement(sql)}
348
- conn.prepared_statements[name] = [sql, cps] if name
357
+ cps_sync(conn){|cpsh| cpsh[name] = [sql, cps]} if name
349
358
  end
350
359
  i = 0
351
360
  args.each{|arg| set_ps_arg(cps, arg, i+=1)}
@@ -476,14 +485,9 @@ module Sequel
476
485
  end
477
486
  end
478
487
 
479
- # Add a prepared_statements accessor to the connection,
480
- # and set it to an empty hash. This is used to store
481
- # adapter specific prepared statements.
488
+ # Return the connection. Used to do configuration on the
489
+ # connection object before adding it to the connection pool.
482
490
  def setup_connection(conn)
483
- class << conn
484
- attr_accessor :prepared_statements
485
- end
486
- conn.prepared_statements = {}
487
491
  conn
488
492
  end
489
493
 
@@ -608,7 +612,7 @@ module Sequel
608
612
  ps.extend(PreparedStatementMethods)
609
613
  if name
610
614
  ps.prepared_statement_name = name
611
- db.prepared_statements[name] = ps
615
+ db.set_prepared_statement(name, ps)
612
616
  end
613
617
  ps
614
618
  end
@@ -42,11 +42,6 @@ module Sequel
42
42
  PRIMARY_KEY_INDEX_RE
43
43
  end
44
44
  end
45
-
46
- # Dataset class for DB2 datasets accessed via JDBC.
47
- class Dataset < JDBC::Dataset
48
- include Sequel::DB2::DatasetMethods
49
- end
50
45
  end
51
46
  end
52
47
  end
@@ -37,6 +37,11 @@ module Sequel
37
37
  end
38
38
  end
39
39
 
40
+ # Derby supports transaction DDL statements.
41
+ def supports_transactional_ddl?
42
+ true
43
+ end
44
+
40
45
  private
41
46
 
42
47
  # Derby optimizes away Sequel's default check of SELECT NULL FROM table,
@@ -70,10 +75,30 @@ module Sequel
70
75
  sql << " NOT NULL" if column.fetch(:null, column[:allow_null]) == false
71
76
  end
72
77
 
73
- # Temporary table creation on Derby use DECLARE instead of CREATE.
78
+ # Add NOT LOGGED for temporary tables to improve performance.
74
79
  def create_table_sql(name, generator, options)
80
+ s = super
81
+ s << ' NOT LOGGED' if options[:temp]
82
+ s
83
+ end
84
+
85
+ # Insert data from the current table into the new table after
86
+ # creating the table, since it is not possible to do it in one step.
87
+ def create_table_as(name, sql, options)
88
+ super
89
+ from(name).insert(sql.is_a?(Dataset) ? sql : dataset.with_sql(sql))
90
+ end
91
+
92
+ # Derby currently only requires WITH NO DATA, with a separate insert
93
+ # to import data.
94
+ def create_table_as_sql(name, sql, options)
95
+ "#{create_table_prefix_sql(name, options)} AS #{sql} WITH NO DATA"
96
+ end
97
+
98
+ # Temporary table creation on Derby uses DECLARE instead of CREATE.
99
+ def create_table_prefix_sql(name, options)
75
100
  if options[:temp]
76
- "DECLARE GLOBAL TEMPORARY TABLE #{quote_identifier(name)} (#{column_list_sql(generator)}) NOT LOGGED"
101
+ "DECLARE GLOBAL TEMPORARY TABLE #{quote_identifier(name)}"
77
102
  else
78
103
  super
79
104
  end
@@ -167,6 +192,8 @@ module Sequel
167
192
  super(sql, :LIKE, [SQL::Function.new(:upper, args.at(0)), SQL::Function.new(:upper, args.at(1))])
168
193
  when :"NOT ILIKE"
169
194
  super(sql, :"NOT LIKE", [SQL::Function.new(:upper, args.at(0)), SQL::Function.new(:upper, args.at(1))])
195
+ when :%
196
+ sql << complex_expression_arg_pairs(args){|a, b| "MOD(#{literal(a)}, #{literal(b)})"}
170
197
  when :&, :|, :^, :<<, :>>
171
198
  raise Error, "Derby doesn't support the #{op} operator"
172
199
  when :'B~'
@@ -19,11 +19,6 @@ module Sequel
19
19
  end
20
20
  end
21
21
  end
22
-
23
- # Dataset class for Firebird datasets accessed via JDBC.
24
- class Dataset < JDBC::Dataset
25
- include Sequel::Firebird::DatasetMethods
26
- end
27
22
  end
28
23
  end
29
24
  end
@@ -48,7 +48,7 @@ module Sequel
48
48
  # If the :prepare option is given and we aren't in a savepoint,
49
49
  # prepare the transaction for a two-phase commit.
50
50
  def commit_transaction(conn, opts={})
51
- if (s = opts[:prepare]) && @transactions[conn][:savepoint_level] <= 1
51
+ if (s = opts[:prepare]) && _trans(conn)[:savepoint_level] <= 1
52
52
  log_connection_execute(conn, "PREPARE COMMIT #{s}")
53
53
  else
54
54
  super
@@ -47,6 +47,11 @@ module Sequel
47
47
  end
48
48
  end
49
49
 
50
+ # HSQLDB requires parens around the SELECT, and the WITH DATA syntax.
51
+ def create_table_as_sql(name, sql, options)
52
+ "#{create_table_prefix_sql(name, options)} AS (#{sql}) WITH DATA"
53
+ end
54
+
50
55
  # Use IDENTITY() to get the last inserted id.
51
56
  def last_insert_id(conn, opts={})
52
57
  statement(conn) do |stmt|
@@ -112,6 +117,8 @@ module Sequel
112
117
  sql << complex_expression_arg_pairs(args){|a, b| "(#{literal(a)} * POWER(2, #{literal(b)}))"}
113
118
  when :>>
114
119
  sql << complex_expression_arg_pairs(args){|a, b| "(#{literal(a)} / POWER(2, #{literal(b)}))"}
120
+ when :%
121
+ sql << complex_expression_arg_pairs(args){|a, b| "MOD(#{literal(a)}, #{literal(b)})"}
115
122
  when :'B~'
116
123
  sql << BITCOMP_OPEN
117
124
  literal_append(sql, args.at(0))
@@ -16,11 +16,6 @@ module Sequel
16
16
  nil
17
17
  end
18
18
  end
19
-
20
- # Dataset class for Informix datasets accessed via JDBC.
21
- class Dataset < JDBC::Dataset
22
- include Sequel::Informix::DatasetMethods
23
- end
24
19
  end
25
20
  end
26
21
  end
@@ -5,11 +5,6 @@ module Sequel
5
5
  # Database and Dataset instance methods for JTDS specific
6
6
  # support via JDBC.
7
7
  module JTDS
8
- # Database instance methods for JTDS databases accessed via JDBC.
9
- module DatabaseMethods
10
- include Sequel::JDBC::MSSQL::DatabaseMethods
11
- end
12
-
13
8
  # Dataset class for JTDS datasets accessed via JDBC.
14
9
  class Dataset < JDBC::Dataset
15
10
  include Sequel::MSSQL::DatasetMethods
@@ -62,11 +62,6 @@ module Sequel
62
62
  conn
63
63
  end
64
64
  end
65
-
66
- # Dataset class for MySQL datasets accessed via JDBC.
67
- class Dataset < JDBC::Dataset
68
- include Sequel::MySQL::DatasetMethods
69
- end
70
65
  end
71
66
  end
72
67
  end
@@ -7,32 +7,6 @@ module Sequel
7
7
  # Adapter, Database, and Dataset support for accessing a PostgreSQL
8
8
  # database via JDBC.
9
9
  module Postgres
10
- # Methods to add to the JDBC adapter/connection to allow it to work
11
- # with the shared PostgreSQL code.
12
- module AdapterMethods
13
- include Sequel::Postgres::AdapterMethods
14
-
15
- # Give the JDBC adapter a direct execute method, which creates
16
- # a statement with the given sql and executes it.
17
- def execute(sql, args=nil)
18
- method = block_given? ? :executeQuery : :execute
19
- @db.send(:statement, self) do |stmt|
20
- rows = @db.log_yield(sql){stmt.send(method, sql)}
21
- yield(rows) if block_given?
22
- end
23
- end
24
-
25
- private
26
-
27
- # JDBC specific method of getting specific values from a result set.
28
- def single_value(r)
29
- unless r.nil?
30
- r.next
31
- r.getString(1) unless r.getRow == 0
32
- end
33
- end
34
- end
35
-
36
10
  # Methods to add to Database instances that access PostgreSQL via
37
11
  # JDBC.
38
12
  module DatabaseMethods
@@ -55,19 +29,14 @@ module Sequel
55
29
  arg.nil? ? cps.setNull(i, JavaSQL::Types::NULL) : super
56
30
  end
57
31
 
58
- # Extend the adapter with the JDBC PostgreSQL AdapterMethods
32
+ # Execute the connection configuration SQL queries on the connection.
59
33
  def setup_connection(conn)
60
34
  conn = super(conn)
61
- conn.extend(Sequel::JDBC::Postgres::AdapterMethods)
62
- conn.db = self
63
- conn.apply_connection_settings
35
+ statement(conn) do |stmt|
36
+ connection_configuration_sqls.each{|sql| log_yield(sql){stmt.execute(sql)}}
37
+ end
64
38
  conn
65
39
  end
66
-
67
- # Call insert_result with the table and values specified in the opts.
68
- def last_insert_id(conn, opts)
69
- insert_result(conn, opts[:table], opts[:values])
70
- end
71
40
  end
72
41
 
73
42
  # Dataset subclass used for datasets that connect to PostgreSQL via JDBC.
@@ -54,11 +54,6 @@ module Sequel
54
54
  conn
55
55
  end
56
56
  end
57
-
58
- # Dataset class for SQLite datasets accessed via JDBC.
59
- class Dataset < JDBC::Dataset
60
- include Sequel::SQLite::DatasetMethods
61
- end
62
57
  end
63
58
  end
64
59
  end
@@ -61,11 +61,6 @@ module Sequel
61
61
  super.extend(MetadataDatasetMethods)
62
62
  end
63
63
  end
64
-
65
- # Dataset class for SQLServer datasets accessed via JDBC.
66
- class Dataset < JDBC::Dataset
67
- include Sequel::MSSQL::DatasetMethods
68
- end
69
64
  end
70
65
  end
71
66
  end
@@ -24,7 +24,7 @@ module Sequel
24
24
  # Use JDBC connection's setAutoCommit to false to start transactions
25
25
  def begin_transaction(conn, opts={})
26
26
  if supports_savepoints?
27
- th = @transactions[conn]
27
+ th = _trans(conn)
28
28
  if sps = th[:savepoints]
29
29
  sps << log_yield(TRANSACTION_SAVEPOINT){conn.set_savepoint}
30
30
  else
@@ -40,7 +40,7 @@ module Sequel
40
40
  # Use JDBC connection's commit method to commit transactions
41
41
  def commit_transaction(conn, opts={})
42
42
  if supports_savepoints?
43
- sps = @transactions[conn][:savepoints]
43
+ sps = _trans(conn)[:savepoints]
44
44
  if sps.empty?
45
45
  log_yield(TRANSACTION_COMMIT){conn.commit}
46
46
  elsif supports_releasing_savepoints?
@@ -54,7 +54,7 @@ module Sequel
54
54
  # Use JDBC connection's setAutoCommit to true to enable non-transactional behavior
55
55
  def remove_transaction(conn, committed)
56
56
  if supports_savepoints?
57
- sps = @transactions[conn][:savepoints]
57
+ sps = _trans(conn)[:savepoints]
58
58
  conn.setAutoCommit(true) if sps.empty?
59
59
  sps.pop
60
60
  else
@@ -67,7 +67,7 @@ module Sequel
67
67
  # Use JDBC connection's rollback method to rollback transactions
68
68
  def rollback_transaction(conn, opts={})
69
69
  if supports_savepoints?
70
- sps = @transactions[conn][:savepoints]
70
+ sps = _trans(conn)[:savepoints]
71
71
  if sps.empty?
72
72
  log_yield(TRANSACTION_ROLLBACK){conn.rollback}
73
73
  else
@@ -1,4 +1,4 @@
1
- require 'mysql2' unless defined? Mysql2
1
+ require 'mysql2'
2
2
  Sequel.require %w'shared/mysql_prepared_statements', 'adapters'
3
3
 
4
4
  module Sequel
@@ -22,9 +22,9 @@ module Sequel
22
22
  extend Sequel::Progress::DatabaseMethods
23
23
  extend_datasets(Sequel::Progress::DatasetMethods)
24
24
  when 'db2'
25
- Sequel.ts_require 'adapters/odbc/db2'
26
- extend Sequel::ODBC::DB2::DatabaseMethods
27
- @dataset_class = Sequel::ODBC::DB2::Dataset
25
+ Sequel.ts_require 'adapters/shared/db2'
26
+ extend ::Sequel::DB2::DatabaseMethods
27
+ extend_datasets ::Sequel::DB2::DatasetMethods
28
28
  end
29
29
  end
30
30