activerecord-jdbc-adapter 5.0.pre1 → 51.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 (68) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -2
  3. data/.travis.yml +15 -416
  4. data/Gemfile +35 -37
  5. data/README.md +23 -118
  6. data/RUNNING_TESTS.md +31 -26
  7. data/Rakefile +2 -3
  8. data/activerecord-jdbc-adapter.gemspec +1 -2
  9. data/lib/arjdbc/abstract/connection_management.rb +21 -0
  10. data/lib/arjdbc/abstract/core.rb +62 -0
  11. data/lib/arjdbc/abstract/database_statements.rb +46 -0
  12. data/lib/arjdbc/abstract/statement_cache.rb +58 -0
  13. data/lib/arjdbc/abstract/transaction_support.rb +86 -0
  14. data/lib/arjdbc/derby/adapter.rb +6 -1
  15. data/lib/arjdbc/discover.rb +0 -7
  16. data/lib/arjdbc/firebird/adapter.rb +2 -2
  17. data/lib/arjdbc/jdbc/adapter.rb +10 -252
  18. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  19. data/lib/arjdbc/jdbc/connection.rb +6 -0
  20. data/lib/arjdbc/jdbc.rb +2 -2
  21. data/lib/arjdbc/mysql/adapter.rb +87 -944
  22. data/lib/arjdbc/mysql/connection_methods.rb +4 -2
  23. data/lib/arjdbc/postgresql/adapter.rb +288 -1023
  24. data/lib/arjdbc/postgresql/base/array_decoder.rb +26 -0
  25. data/lib/arjdbc/postgresql/base/array_encoder.rb +25 -0
  26. data/lib/arjdbc/postgresql/base/pgconn.rb +8 -5
  27. data/lib/arjdbc/postgresql/column.rb +10 -599
  28. data/lib/arjdbc/postgresql/connection_methods.rb +9 -0
  29. data/lib/arjdbc/postgresql/name.rb +24 -0
  30. data/lib/arjdbc/postgresql/oid_types.rb +25 -110
  31. data/lib/arjdbc/sqlite3/adapter.rb +171 -170
  32. data/lib/arjdbc/tasks/database_tasks.rb +1 -3
  33. data/lib/arjdbc/tasks/db2_database_tasks.rb +2 -2
  34. data/lib/arjdbc/version.rb +1 -1
  35. data/pom.xml +3 -3
  36. data/rakelib/02-test.rake +0 -12
  37. data/rakelib/compile.rake +1 -1
  38. data/rakelib/db.rake +7 -5
  39. data/rakelib/rails.rake +63 -64
  40. data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +1 -17
  41. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +518 -1260
  42. data/src/java/arjdbc/mysql/MySQLModule.java +3 -3
  43. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +53 -134
  44. data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +214 -240
  45. data/src/java/arjdbc/sqlite3/SQLite3Module.java +0 -20
  46. data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +85 -10
  47. metadata +20 -34
  48. data/Appraisals +0 -41
  49. data/lib/active_record/connection_adapters/oracle_adapter.rb +0 -1
  50. data/lib/arjdbc/common_jdbc_methods.rb +0 -89
  51. data/lib/arjdbc/mysql/bulk_change_table.rb +0 -150
  52. data/lib/arjdbc/mysql/column.rb +0 -162
  53. data/lib/arjdbc/mysql/explain_support.rb +0 -82
  54. data/lib/arjdbc/mysql/schema_creation.rb +0 -58
  55. data/lib/arjdbc/oracle/adapter.rb +0 -952
  56. data/lib/arjdbc/oracle/column.rb +0 -126
  57. data/lib/arjdbc/oracle/connection_methods.rb +0 -21
  58. data/lib/arjdbc/oracle.rb +0 -4
  59. data/lib/arjdbc/postgresql/_bc_time_cast_patch.rb +0 -21
  60. data/lib/arjdbc/postgresql/base/oid.rb +0 -412
  61. data/lib/arjdbc/postgresql/base/schema_definitions.rb +0 -131
  62. data/lib/arjdbc/postgresql/explain_support.rb +0 -53
  63. data/lib/arjdbc/postgresql/oid/bytea.rb +0 -2
  64. data/lib/arjdbc/postgresql/schema_creation.rb +0 -60
  65. data/lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb +0 -297
  66. data/lib/arjdbc/tasks/oracle_database_tasks.rb +0 -65
  67. data/src/java/arjdbc/oracle/OracleModule.java +0 -75
  68. data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +0 -465
@@ -36,6 +36,7 @@ import java.sql.ResultSetMetaData;
36
36
  import java.sql.SQLException;
37
37
  import java.sql.Statement;
38
38
  import java.sql.DatabaseMetaData;
39
+ import java.sql.PreparedStatement;
39
40
  import java.sql.Savepoint;
40
41
  import java.sql.Types;
41
42
  import java.util.ArrayList;
@@ -45,6 +46,7 @@ import org.jruby.Ruby;
45
46
  import org.jruby.RubyArray;
46
47
  import org.jruby.RubyClass;
47
48
  import org.jruby.RubyString;
49
+ import org.jruby.RubyTime;
48
50
  import org.jruby.anno.JRubyMethod;
49
51
  import org.jruby.runtime.ObjectAllocator;
50
52
  import org.jruby.runtime.ThreadContext;
@@ -58,8 +60,12 @@ import org.jruby.util.ByteList;
58
60
  public class SQLite3RubyJdbcConnection extends RubyJdbcConnection {
59
61
  private static final long serialVersionUID = -5783855018818472773L;
60
62
 
63
+ private final RubyString TIMESTAMP_FORMAT;
64
+
61
65
  protected SQLite3RubyJdbcConnection(Ruby runtime, RubyClass metaClass) {
62
66
  super(runtime, metaClass);
67
+
68
+ TIMESTAMP_FORMAT = runtime.newString("%F %T.%6N");
63
69
  }
64
70
 
65
71
  public static RubyClass createSQLite3JdbcConnectionClass(Ruby runtime, RubyClass jdbcConnection) {
@@ -135,7 +141,7 @@ public class SQLite3RubyJdbcConnection extends RubyJdbcConnection {
135
141
  final Ruby runtime = context.runtime;
136
142
  final RubyClass indexDefinition = getIndexDefinition(runtime);
137
143
 
138
- final TableName table = extractTableName(connection, schemaName, tableName);
144
+ final TableName table = extractTableName(connection, null, schemaName, tableName);
139
145
 
140
146
  final List<RubyString> primaryKeys = primaryKeys(context, connection, table);
141
147
 
@@ -282,6 +288,12 @@ public class SQLite3RubyJdbcConnection extends RubyJdbcConnection {
282
288
 
283
289
  }
284
290
 
291
+ @Override
292
+ public IRubyObject begin(ThreadContext context, IRubyObject level) {
293
+ throw context.runtime.newRaiseException(ActiveRecord(context).getClass("TransactionIsolationError"),
294
+ "SQLite3 does not support isolation levels");
295
+ }
296
+
285
297
  @Override
286
298
  @JRubyMethod(name = "create_savepoint", optional = 1)
287
299
  public IRubyObject create_savepoint(final ThreadContext context, final IRubyObject[] args) {
@@ -289,7 +301,7 @@ public class SQLite3RubyJdbcConnection extends RubyJdbcConnection {
289
301
  if ( name == null || name.isNil() ) {
290
302
  throw new IllegalArgumentException("create_savepoint (without name) not implemented!");
291
303
  }
292
- final Connection connection = getConnection(true);
304
+ final Connection connection = getConnection(context, true);
293
305
  try {
294
306
  connection.setAutoCommit(false);
295
307
  // NOTE: JDBC driver does not support setSavepoint(String) :
@@ -307,7 +319,7 @@ public class SQLite3RubyJdbcConnection extends RubyJdbcConnection {
307
319
  @Override
308
320
  @JRubyMethod(name = "rollback_savepoint", required = 1)
309
321
  public IRubyObject rollback_savepoint(final ThreadContext context, final IRubyObject name) {
310
- final Connection connection = getConnection(true);
322
+ final Connection connection = getConnection(context, true);
311
323
  try {
312
324
  if ( getSavepoints(context).get(name) == null ) {
313
325
  throw context.getRuntime().newRuntimeError("could not rollback savepoint: '" + name + "' (not set)");
@@ -322,22 +334,85 @@ public class SQLite3RubyJdbcConnection extends RubyJdbcConnection {
322
334
  }
323
335
  }
324
336
 
337
+ // FIXME: Update our JDBC adapter to later version which basically performs this SQL in
338
+ // this method. Then we can use base RubyJdbcConnection version.
325
339
  @Override
326
340
  @JRubyMethod(name = "release_savepoint", required = 1)
327
341
  public IRubyObject release_savepoint(final ThreadContext context, final IRubyObject name) {
328
- final Connection connection = getConnection(true);
342
+ Ruby runtime = context.runtime;
343
+
329
344
  try {
330
- if ( getSavepoints(context).remove(name) == null ) {
331
- throw context.getRuntime().newRuntimeError("could not release savepoint: '" + name + "' (not set)");
345
+ if (getSavepoints(context).remove(name) == null) {
346
+ RubyClass invalidStatement = ActiveRecord(context).getClass("StatementInvalid");
347
+ throw runtime.newRaiseException(invalidStatement, "could not release savepoint: '" + name + "' (not set)");
332
348
  }
333
349
  // NOTE: JDBC driver does not implement release(Savepoint) :
334
- connection.createStatement().execute("RELEASE SAVEPOINT " + name.toString());
350
+ getConnection(context, true).createStatement().execute("RELEASE SAVEPOINT " + name.toString());
335
351
 
336
- return context.getRuntime().getNil();
337
- }
338
- catch (SQLException e) {
352
+ return runtime.getNil();
353
+ } catch (SQLException e) {
339
354
  return handleException(context, e);
340
355
  }
341
356
  }
342
357
 
358
+ // Note: transaction_support.rb overrides sqlite3 adapters version which just returns true.
359
+ // Rather than re-define it in SQLite3Adapter I will just define it here so we appear to have
360
+ // a consistent JDBC layer.
361
+ @JRubyMethod(name = "supports_savepoints?")
362
+ public IRubyObject supports_savepoints_p(final ThreadContext context) throws SQLException {
363
+ return context.getRuntime().getTrue();
364
+ }
365
+
366
+ @Override
367
+ protected void setBooleanParameter(final ThreadContext context,
368
+ final Connection connection, final PreparedStatement statement,
369
+ final int index, final IRubyObject value,
370
+ final IRubyObject attribute, final int type) throws SQLException {
371
+ // Apparently active record stores booleans in sqlite as 't' and 'f' instead of the built in 1/0
372
+ statement.setString(index, value.isTrue() ? "t" : "f");
373
+ }
374
+
375
+ // Treat dates as strings, this can potentially be removed if we update
376
+ // the driver to the latest and tell it to store dates/times as text
377
+ @Override
378
+ protected void setDateParameter(final ThreadContext context,
379
+ final Connection connection, final PreparedStatement statement,
380
+ final int index, IRubyObject value,
381
+ final IRubyObject attribute, final int type) throws SQLException {
382
+
383
+ setStringParameter(context, connection, statement, index, value, attribute, type);
384
+ }
385
+
386
+ // The current driver doesn't support dealing with BigDecimal values, so force everything to doubles
387
+ @Override
388
+ protected void setDecimalParameter(final ThreadContext context,
389
+ final Connection connection, final PreparedStatement statement,
390
+ final int index, final IRubyObject value,
391
+ final IRubyObject attribute, final int type) throws SQLException {
392
+
393
+ setDoubleParameter(context, connection, statement, index, value, attribute, type);
394
+ }
395
+
396
+ // Treat times as strings
397
+ @Override
398
+ protected void setTimeParameter(final ThreadContext context,
399
+ final Connection connection, final PreparedStatement statement,
400
+ final int index, IRubyObject value,
401
+ final IRubyObject attribute, final int type) throws SQLException {
402
+
403
+ setTimestampParameter(context, connection, statement, index,
404
+ callMethod(context, "time_in_default_timezone", value), attribute, type);
405
+ }
406
+
407
+ // Treat timestamps as strings
408
+ @Override
409
+ protected void setTimestampParameter(final ThreadContext context,
410
+ final Connection connection, final PreparedStatement statement,
411
+ final int index, IRubyObject value,
412
+ final IRubyObject attribute, final int type) throws SQLException {
413
+
414
+ if (value instanceof RubyTime) value = ((RubyTime) value).strftime(TIMESTAMP_FORMAT);
415
+
416
+ setStringParameter(context, connection, statement, index, value, attribute, type);
417
+ }
343
418
  }
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-jdbc-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.pre1
4
+ version: '51.0'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sieger, Ola Bini, Karol Bucek and JRuby contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-10 00:00:00.000000000 Z
11
+ date: 2017-11-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: activerecord
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - ">="
16
+ - - "~>"
18
17
  - !ruby/object:Gem::Version
19
- version: '2.2'
18
+ version: 5.1.0
19
+ name: activerecord
20
+ prerelease: false
21
+ type: :runtime
20
22
  version_requirements: !ruby/object:Gem::Requirement
21
23
  requirements:
22
- - - ">="
24
+ - - "~>"
23
25
  - !ruby/object:Gem::Version
24
- version: '2.2'
25
- prerelease: false
26
- type: :runtime
26
+ version: 5.1.0
27
27
  description: 'AR-JDBC is a database adapter for Rails'' ActiveRecord component designed
28
28
  to be used with JRuby built upon Java''s JDBC API for database access. Provides
29
29
  (ActiveRecord) built-in adapters: MySQL, PostgreSQL and SQLite3 as well as adapters
@@ -41,7 +41,6 @@ files:
41
41
  - ".gitignore"
42
42
  - ".travis.yml"
43
43
  - ".yardopts"
44
- - Appraisals
45
44
  - CONTRIBUTING.md
46
45
  - Gemfile
47
46
  - History.md
@@ -64,7 +63,6 @@ files:
64
63
  - lib/active_record/connection_adapters/mssql_adapter.rb
65
64
  - lib/active_record/connection_adapters/mysql2_adapter.rb
66
65
  - lib/active_record/connection_adapters/mysql_adapter.rb
67
- - lib/active_record/connection_adapters/oracle_adapter.rb
68
66
  - lib/active_record/connection_adapters/postgresql_adapter.rb
69
67
  - lib/active_record/connection_adapters/sqlite3_adapter.rb
70
68
  - lib/active_record/connection_adapters/sqlserver_adapter.rb
@@ -79,7 +77,11 @@ files:
79
77
  - lib/arel/visitors/sql_server.rb
80
78
  - lib/arel/visitors/sql_server/ng42.rb
81
79
  - lib/arjdbc.rb
82
- - lib/arjdbc/common_jdbc_methods.rb
80
+ - lib/arjdbc/abstract/connection_management.rb
81
+ - lib/arjdbc/abstract/core.rb
82
+ - lib/arjdbc/abstract/database_statements.rb
83
+ - lib/arjdbc/abstract/statement_cache.rb
84
+ - lib/arjdbc/abstract/transaction_support.rb
83
85
  - lib/arjdbc/db2.rb
84
86
  - lib/arjdbc/db2/adapter.rb
85
87
  - lib/arjdbc/db2/as400.rb
@@ -137,28 +139,17 @@ files:
137
139
  - lib/arjdbc/mssql/utils.rb
138
140
  - lib/arjdbc/mysql.rb
139
141
  - lib/arjdbc/mysql/adapter.rb
140
- - lib/arjdbc/mysql/bulk_change_table.rb
141
- - lib/arjdbc/mysql/column.rb
142
142
  - lib/arjdbc/mysql/connection_methods.rb
143
- - lib/arjdbc/mysql/explain_support.rb
144
- - lib/arjdbc/mysql/schema_creation.rb
145
- - lib/arjdbc/oracle.rb
146
- - lib/arjdbc/oracle/adapter.rb
147
- - lib/arjdbc/oracle/column.rb
148
- - lib/arjdbc/oracle/connection_methods.rb
149
143
  - lib/arjdbc/postgresql.rb
150
- - lib/arjdbc/postgresql/_bc_time_cast_patch.rb
151
144
  - lib/arjdbc/postgresql/adapter.rb
145
+ - lib/arjdbc/postgresql/base/array_decoder.rb
146
+ - lib/arjdbc/postgresql/base/array_encoder.rb
152
147
  - lib/arjdbc/postgresql/base/array_parser.rb
153
- - lib/arjdbc/postgresql/base/oid.rb
154
148
  - lib/arjdbc/postgresql/base/pgconn.rb
155
- - lib/arjdbc/postgresql/base/schema_definitions.rb
156
149
  - lib/arjdbc/postgresql/column.rb
157
150
  - lib/arjdbc/postgresql/connection_methods.rb
158
- - lib/arjdbc/postgresql/explain_support.rb
159
- - lib/arjdbc/postgresql/oid/bytea.rb
151
+ - lib/arjdbc/postgresql/name.rb
160
152
  - lib/arjdbc/postgresql/oid_types.rb
161
- - lib/arjdbc/postgresql/schema_creation.rb
162
153
  - lib/arjdbc/railtie.rb
163
154
  - lib/arjdbc/sqlite3.rb
164
155
  - lib/arjdbc/sqlite3/adapter.rb
@@ -176,8 +167,6 @@ files:
176
167
  - lib/arjdbc/tasks/hsqldb_database_tasks.rb
177
168
  - lib/arjdbc/tasks/jdbc_database_tasks.rb
178
169
  - lib/arjdbc/tasks/mssql_database_tasks.rb
179
- - lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb
180
- - lib/arjdbc/tasks/oracle_database_tasks.rb
181
170
  - lib/arjdbc/util/quoted_cache.rb
182
171
  - lib/arjdbc/util/serialized_attributes.rb
183
172
  - lib/arjdbc/util/table_copier.rb
@@ -216,8 +205,6 @@ files:
216
205
  - src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java
217
206
  - src/java/arjdbc/mysql/MySQLModule.java
218
207
  - src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java
219
- - src/java/arjdbc/oracle/OracleModule.java
220
- - src/java/arjdbc/oracle/OracleRubyJdbcConnection.java
221
208
  - src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java
222
209
  - src/java/arjdbc/sqlite3/SQLite3Module.java
223
210
  - src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java
@@ -243,14 +230,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
243
230
  version: '0'
244
231
  required_rubygems_version: !ruby/object:Gem::Requirement
245
232
  requirements:
246
- - - ">"
233
+ - - ">="
247
234
  - !ruby/object:Gem::Version
248
- version: 1.3.1
235
+ version: '0'
249
236
  requirements: []
250
237
  rubyforge_project: jruby-extras
251
- rubygems_version: 2.6.8
238
+ rubygems_version: 2.6.13
252
239
  signing_key:
253
240
  specification_version: 4
254
241
  summary: JDBC adapter for ActiveRecord, for use within JRuby on Rails.
255
242
  test_files: []
256
- has_rdoc:
data/Appraisals DELETED
@@ -1,41 +0,0 @@
1
- appraise "rails23" do
2
- gem "activerecord", "~> 2.3.18", :require => false
3
- gem "rails", "~> 2.3.18"
4
- end
5
-
6
- appraise "rails30" do
7
- gem "activerecord", "~> 3.0.20", :require => false
8
- end
9
-
10
- appraise "rails31" do
11
- gem "activerecord", "~> 3.1.12", :require => false
12
- end
13
-
14
- appraise "rails32" do
15
- gem 'i18n', '< 0.7'
16
- gem "activerecord", "~> 3.2.19", :require => false
17
- end
18
-
19
- appraise "rails40" do
20
- gem "activerecord", "~> 4.0.12", :require => false
21
- end
22
-
23
- appraise "rails41" do
24
- gem "activerecord", "~> 4.1.8", :require => false
25
- end
26
-
27
- appraise "rails42" do
28
- gem "activerecord", "~> 4.2.0", :require => false
29
- end
30
-
31
- appraise "rails50" do
32
- gem "activerecord", "~> 5.0.0.beta4", :require => false
33
- end
34
-
35
-
36
- appraise "railsNG" do
37
- branch = ( ENV['rails_branch'] || 'master' )
38
- gem "activerecord", :github => 'rails/rails', :branch => branch, :require => false
39
- gem 'rails', :github => 'rails/rails', :branch => branch
40
- gem 'arel', :github => 'rails/arel', :branch => 'master'
41
- end
@@ -1 +0,0 @@
1
- require 'arjdbc/oracle'
@@ -1,89 +0,0 @@
1
- module ArJdbc
2
- # This is minimum amount of code neede from base JDBC Adapter class to make common adapters
3
- # work. This replaces using jdbc/adapter as a base class for all adapters.
4
- module CommonJdbcMethods
5
- def initialize(connection, logger = nil, config = {})
6
- config[:adapter_spec] = adapter_spec(config) unless config.key?(:adapter_spec)
7
-
8
- connection ||= jdbc_connection_class(config[:adapter_spec]).new(config, self)
9
-
10
- super(connection, logger, config)
11
- end
12
-
13
- # Starts a database transaction.
14
- # @override
15
- def begin_db_transaction
16
- @connection.begin
17
- end
18
-
19
- # Starts a database transaction.
20
- # @param isolation the transaction isolation to use
21
- def begin_isolated_db_transaction(isolation)
22
- @connection.begin(isolation)
23
- end
24
-
25
- # Commits the current database transaction.
26
- # @override
27
- def commit_db_transaction
28
- @connection.commit
29
- end
30
-
31
- # Rolls back the current database transaction.
32
- # @override
33
- def exec_rollback_db_transaction
34
- @connection.rollback
35
- end
36
-
37
-
38
- def execute(sql, name = nil)
39
- # FIXME: Can we kill :skip_logging?
40
- if name == :skip_logging
41
- @connection.execute(sql)
42
- else
43
- log(sql, name) { @connection.execute(sql) }
44
- end
45
- end
46
-
47
- # Take an id from the result of an INSERT query.
48
- # @return [Integer, NilClass]
49
- def last_inserted_id(result)
50
- if result.is_a?(Hash) || result.is_a?(ActiveRecord::Result)
51
- result.first.first[1] # .first = { "id"=>1 } .first = [ "id", 1 ]
52
- else
53
- result
54
- end
55
- end
56
-
57
- # Creates a (transactional) save-point one can rollback to.
58
- # Unlike 'plain' `ActiveRecord` it is allowed to pass a save-point name.
59
- # @param name the save-point name
60
- # @return save-point name (even if nil passed will be generated)
61
- # @since 1.3.0
62
- # @extension added optional name parameter
63
- def create_savepoint(name = current_savepoint_name(true))
64
- @connection.create_savepoint(name)
65
- end
66
-
67
- # Transaction rollback to a given (previously created) save-point.
68
- # If no save-point name given rollback to the last created one.
69
- # @param name the save-point name
70
- # @extension added optional name parameter
71
- def rollback_to_savepoint(name = current_savepoint_name(true))
72
- @connection.rollback_savepoint(name)
73
- end
74
-
75
- # Release a previously created save-point.
76
- # @note Save-points are auto-released with the transaction they're created
77
- # in (on transaction commit or roll-back).
78
- # @param name the save-point name
79
- # @extension added optional name parameter
80
- def release_savepoint(name = current_savepoint_name(false))
81
- @connection.release_savepoint(name)
82
- end
83
-
84
- # @private
85
- def current_savepoint_name(compat = nil)
86
- current_transaction.savepoint_name # unlike AR 3.2-4.1 might be nil
87
- end
88
- end
89
- end
@@ -1,150 +0,0 @@
1
- module ArJdbc
2
- module MySQL
3
- module BulkChangeTable
4
-
5
- # @private
6
- AR41 = ::ActiveRecord::VERSION::STRING >= '4.1'
7
-
8
- # @private
9
- #ActiveRecordError = ActiveRecord::ActiveRecordError
10
-
11
- # @private
12
- ChangeColumnDefinition = ::ActiveRecord::ConnectionAdapters::ChangeColumnDefinition if AR41
13
-
14
- # @override
15
- def supports_bulk_alter?; true end
16
-
17
- def bulk_change_table(table_name, operations)
18
- sqls = operations.map do |command, args|
19
- table, arguments = args.shift, args
20
- method = :"#{command}_sql"
21
-
22
- if respond_to?(method, true)
23
- send(method, table, *arguments)
24
- else
25
- raise "Unknown method called : #{method}(#{arguments.inspect})"
26
- end
27
- end
28
- sqls.flatten!
29
-
30
- execute("ALTER TABLE #{quote_table_name(table_name)} #{sqls.join(", ")}")
31
- end
32
-
33
- protected
34
-
35
- def add_column_sql(table_name, column_name, type, options = {})
36
- add_column_sql = "ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
37
- add_column_options!(add_column_sql, options)
38
- add_column_position!(add_column_sql, options)
39
- add_column_sql
40
- end unless AR41
41
-
42
- def add_column_sql(table_name, column_name, type, options = {})
43
- td = create_table_definition table_name, options[:temporary], options[:options]
44
- cd = td.new_column_definition(column_name, type, options)
45
- schema_creation.visit_AddColumn cd
46
- end if AR41
47
-
48
- def change_column_sql(table_name, column_name, type, options = {})
49
- column = column_for(table_name, column_name)
50
-
51
- unless options_include_default?(options)
52
- options[:default] = column.default
53
- end
54
-
55
- unless options.has_key?(:null)
56
- options[:null] = column.null
57
- end
58
-
59
- change_column_sql = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
60
- add_column_options!(change_column_sql, options)
61
- add_column_position!(change_column_sql, options)
62
- change_column_sql
63
- end unless AR41
64
-
65
- def change_column_sql(table_name, column_name, type, options = {})
66
- column = column_for(table_name, column_name)
67
-
68
- unless options_include_default?(options)
69
- options[:default] = column.default
70
- end
71
-
72
- unless options.has_key?(:null)
73
- options[:null] = column.null
74
- end
75
-
76
- options[:name] = column.name
77
- schema_creation.accept ChangeColumnDefinition.new column, type, options
78
- end if AR41
79
-
80
- def rename_column_sql(table_name, column_name, new_column_name)
81
- options = {}
82
-
83
- if column = columns(table_name).find { |c| c.name == column_name.to_s }
84
- options[:default] = column.default
85
- options[:null] = column.null
86
- options[:auto_increment] = (column.extra == "auto_increment")
87
- else
88
- raise ActiveRecordError, "No such column: #{table_name}.#{column_name}"
89
- end
90
-
91
- current_type = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'", 'SCHEMA')["Type"]
92
- rename_column_sql = "CHANGE #{quote_column_name(column_name)} #{quote_column_name(new_column_name)} #{current_type}"
93
- add_column_options!(rename_column_sql, options)
94
- rename_column_sql
95
- end unless AR41
96
-
97
- def rename_column_sql(table_name, column_name, new_column_name)
98
- options = { :name => new_column_name }
99
-
100
- if column = columns(table_name).find { |c| c.name == column_name.to_s }
101
- options[:default] = column.default
102
- options[:null] = column.null
103
- options[:auto_increment] = (column.extra == "auto_increment")
104
- else
105
- raise ActiveRecordError, "No such column: #{table_name}.#{column_name}"
106
- end
107
-
108
- current_type = select_one("SHOW COLUMNS FROM #{quote_table_name(table_name)} LIKE '#{column_name}'", 'SCHEMA')["Type"]
109
- schema_creation.accept ChangeColumnDefinition.new column, current_type, options
110
- end if AR41
111
-
112
- def remove_column_sql(table_name, column_name, type = nil, options = nil)
113
- "DROP #{quote_column_name(column_name)}"
114
- end
115
-
116
- def remove_columns_sql(table_name, *column_names)
117
- column_names.map { |column_name| remove_column_sql(table_name, column_name) }
118
- end
119
-
120
- def add_index_sql(table_name, column_name, options = {})
121
- index_name, index_type, index_columns = add_index_options(table_name, column_name, options)
122
- "ADD #{index_type} INDEX #{index_name} (#{index_columns})"
123
- end
124
-
125
- def remove_index_sql(table_name, options = {})
126
- index_name = index_name_for_remove(table_name, options)
127
- "DROP INDEX #{index_name}"
128
- end
129
-
130
- def add_timestamps_sql(table_name, options = {})
131
- [add_column_sql(table_name, :created_at, :datetime, options), add_column_sql(table_name, :updated_at, :datetime, options)]
132
- end
133
-
134
- def remove_timestamps_sql(table_name, options = nil)
135
- [remove_column_sql(table_name, :updated_at), remove_column_sql(table_name, :created_at)]
136
- end
137
-
138
- private
139
-
140
- def add_column_position!(sql, options)
141
- if options[:first]
142
- sql << " FIRST"
143
- elsif options[:after]
144
- sql << " AFTER #{quote_column_name(options[:after])}"
145
- end
146
- end
147
-
148
- end
149
- end
150
- end