sequel 3.34.1 → 3.35.0

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