activerecord-jdbc-adapter 1.3.17 → 1.3.18

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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +24 -5
  3. data/History.md +54 -0
  4. data/lib/arel/visitors/compat.rb +30 -2
  5. data/lib/arel/visitors/db2.rb +118 -29
  6. data/lib/arel/visitors/derby.rb +84 -29
  7. data/lib/arel/visitors/firebird.rb +66 -9
  8. data/lib/arel/visitors/h2.rb +16 -0
  9. data/lib/arel/visitors/hsqldb.rb +6 -3
  10. data/lib/arel/visitors/postgresql_jdbc.rb +6 -0
  11. data/lib/arel/visitors/sql_server.rb +121 -40
  12. data/lib/arel/visitors/sql_server/ng42.rb +293 -0
  13. data/lib/arjdbc.rb +1 -7
  14. data/lib/arjdbc/db2.rb +1 -0
  15. data/lib/arjdbc/db2/adapter.rb +118 -18
  16. data/lib/arjdbc/derby/adapter.rb +29 -8
  17. data/lib/arjdbc/firebird.rb +1 -0
  18. data/lib/arjdbc/firebird/adapter.rb +126 -11
  19. data/lib/arjdbc/hsqldb/adapter.rb +3 -0
  20. data/lib/arjdbc/informix.rb +1 -0
  21. data/lib/arjdbc/jdbc.rb +17 -0
  22. data/lib/arjdbc/jdbc/adapter.rb +28 -3
  23. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  24. data/lib/arjdbc/jdbc/column.rb +7 -3
  25. data/lib/arjdbc/jdbc/type_cast.rb +2 -0
  26. data/lib/arjdbc/jdbc/type_converter.rb +28 -15
  27. data/lib/arjdbc/mimer.rb +1 -0
  28. data/lib/arjdbc/mssql.rb +2 -1
  29. data/lib/arjdbc/mssql/adapter.rb +105 -30
  30. data/lib/arjdbc/mssql/column.rb +30 -7
  31. data/lib/arjdbc/mssql/limit_helpers.rb +22 -9
  32. data/lib/arjdbc/mssql/types.rb +343 -0
  33. data/lib/arjdbc/mssql/utils.rb +25 -2
  34. data/lib/arjdbc/mysql/adapter.rb +22 -21
  35. data/lib/arjdbc/oracle.rb +1 -0
  36. data/lib/arjdbc/oracle/adapter.rb +291 -19
  37. data/lib/arjdbc/oracle/column.rb +9 -5
  38. data/lib/arjdbc/oracle/connection_methods.rb +4 -1
  39. data/lib/arjdbc/postgresql/_bc_time_cast_patch.rb +21 -0
  40. data/lib/arjdbc/postgresql/adapter.rb +7 -1
  41. data/lib/arjdbc/postgresql/oid/bytea.rb +3 -0
  42. data/lib/arjdbc/postgresql/oid_types.rb +2 -1
  43. data/lib/arjdbc/tasks/database_tasks.rb +3 -0
  44. data/lib/arjdbc/util/quoted_cache.rb +2 -2
  45. data/lib/arjdbc/util/serialized_attributes.rb +11 -0
  46. data/lib/arjdbc/version.rb +1 -1
  47. data/rakelib/02-test.rake +1 -1
  48. data/rakelib/db.rake +3 -1
  49. data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +190 -0
  50. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +259 -61
  51. data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +13 -2
  52. data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +192 -15
  53. data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +10 -2
  54. metadata +9 -4
@@ -59,13 +59,13 @@ public class MSSQLRubyJdbcConnection extends RubyJdbcConnection {
59
59
 
60
60
  public static RubyClass createMSSQLJdbcConnectionClass(Ruby runtime, RubyClass jdbcConnection) {
61
61
  final RubyClass clazz = getConnectionAdapters(runtime). // ActiveRecord::ConnectionAdapters
62
- defineClassUnder("MSSQLJdbcConnection", jdbcConnection, MSSQL_JDBCCONNECTION_ALLOCATOR);
62
+ defineClassUnder("MSSQLJdbcConnection", jdbcConnection, ALLOCATOR);
63
63
  clazz.defineAnnotatedMethods(MSSQLRubyJdbcConnection.class);
64
64
  getConnectionAdapters(runtime).setConstant("MssqlJdbcConnection", clazz); // backwards-compat
65
65
  return clazz;
66
66
  }
67
67
 
68
- private static ObjectAllocator MSSQL_JDBCCONNECTION_ALLOCATOR = new ObjectAllocator() {
68
+ private static final ObjectAllocator ALLOCATOR = new ObjectAllocator() {
69
69
  public IRubyObject allocate(Ruby runtime, RubyClass klass) {
70
70
  return new MSSQLRubyJdbcConnection(runtime, klass);
71
71
  }
@@ -111,6 +111,17 @@ public class MSSQLRubyJdbcConnection extends RubyJdbcConnection {
111
111
  return tables;
112
112
  }
113
113
 
114
+ @Override
115
+ protected RubyArray mapColumnsResult(final ThreadContext context,
116
+ final DatabaseMetaData metaData, final TableName components, final ResultSet results)
117
+ throws SQLException {
118
+
119
+ final RubyClass Column = getJdbcColumnClass(context);
120
+ final boolean lookupCastType = Column.isMethodBound("cast_type", false);
121
+ // NOTE: MSSQL depends on Column#primary? no matter the AR version - thus always set @primary
122
+ return mapColumnsResult(context, metaData, components, results, Column, lookupCastType, true);
123
+ }
124
+
114
125
  /**
115
126
  * Microsoft SQL 2000+ support schemas
116
127
  */
@@ -23,6 +23,12 @@
23
23
  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24
24
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
25
  ***** END LICENSE BLOCK *****/
26
+ // NOTE: file contains code adapted from **oracle-enhanced** adapter, license follows
27
+ /*
28
+ Copyright (c) 2008-2011 Graham Jenkins, Michael Schoen, Raimonds Simanovskis
29
+
30
+ ... LICENSING TERMS ARE THE VERY SAME AS ACTIVERECORD-JDBC-ADAPTER'S ABOVE ...
31
+ */
26
32
  package arjdbc.oracle;
27
33
 
28
34
  import arjdbc.jdbc.Callable;
@@ -37,11 +43,12 @@ import java.sql.ResultSet;
37
43
  import java.sql.SQLException;
38
44
  import java.sql.DatabaseMetaData;
39
45
  import java.sql.PreparedStatement;
46
+ import java.sql.ResultSetMetaData;
40
47
  import java.sql.Statement;
41
48
  import java.sql.Types;
42
- import java.util.ArrayList;
43
49
  import java.util.Collections;
44
50
  import java.util.List;
51
+ import java.util.regex.Pattern;
45
52
 
46
53
  import org.jruby.Ruby;
47
54
  import org.jruby.RubyArray;
@@ -77,37 +84,35 @@ public class OracleRubyJdbcConnection extends RubyJdbcConnection {
77
84
  };
78
85
 
79
86
  @JRubyMethod(name = "next_sequence_value", required = 1)
80
- public IRubyObject next_sequence_value(final ThreadContext context,
81
- final IRubyObject sequence) throws SQLException {
87
+ public IRubyObject next_sequence_value(final ThreadContext context, final IRubyObject sequence) {
82
88
  return withConnection(context, new Callable<IRubyObject>() {
83
89
  public IRubyObject call(final Connection connection) throws SQLException {
84
- Statement statement = null; ResultSet valSet = null;
90
+ Statement statement = null; ResultSet value = null;
85
91
  try {
86
92
  statement = connection.createStatement();
87
- valSet = statement.executeQuery("SELECT "+ sequence +".NEXTVAL id FROM dual");
88
- if ( ! valSet.next() ) return context.getRuntime().getNil();
89
- return context.getRuntime().newFixnum( valSet.getLong(1) );
93
+ value = statement.executeQuery("SELECT "+ sequence +".NEXTVAL id FROM dual");
94
+ if ( ! value.next() ) return context.getRuntime().getNil();
95
+ return context.getRuntime().newFixnum( value.getLong(1) );
90
96
  }
91
97
  catch (final SQLException e) {
92
98
  debugMessage(context, "failed to get " + sequence + ".NEXTVAL : " + e.getMessage());
93
99
  throw e;
94
100
  }
95
- finally { close(valSet); close(statement); }
101
+ finally { close(value); close(statement); }
96
102
  }
97
103
  });
98
104
  }
99
105
 
100
106
  @JRubyMethod(name = "execute_insert_returning", required = 2)
101
107
  public IRubyObject execute_insert_returning(final ThreadContext context,
102
- final IRubyObject sql, final IRubyObject binds) throws SQLException {
108
+ final IRubyObject sql, final IRubyObject binds) {
103
109
  final String query = sql.convertToString().getUnicodeValue();
104
110
  final int outType = Types.VARCHAR;
105
111
  if ( binds == null || binds.isNil() ) { // no prepared statements
106
112
  return executePreparedCall(context, query, Collections.EMPTY_LIST, outType);
107
113
  }
108
- else { // allow prepared statements with empty binds parameters
109
- return executePreparedCall(context, query, (List) binds, outType);
110
- }
114
+ // allow prepared statements with empty binds parameters
115
+ return executePreparedCall(context, query, (List) binds, outType);
111
116
  }
112
117
 
113
118
  private IRubyObject executePreparedCall(final ThreadContext context, final String query,
@@ -258,15 +263,54 @@ public class OracleRubyJdbcConnection extends RubyJdbcConnection {
258
263
  protected RubyArray mapTables(final Ruby runtime, final DatabaseMetaData metaData,
259
264
  final String catalog, final String schemaPattern, final String tablePattern,
260
265
  final ResultSet tablesSet) throws SQLException {
261
- final List<IRubyObject> tables = new ArrayList<IRubyObject>(32);
266
+ final RubyArray tables = RubyArray.newArray(runtime, 32);
262
267
  while ( tablesSet.next() ) {
263
268
  String name = tablesSet.getString(TABLES_TABLE_NAME);
264
269
  name = caseConvertIdentifierForRails(metaData, name);
265
270
  // Handle stupid Oracle 10g RecycleBin feature
266
271
  if ( name.startsWith("bin$") ) continue;
267
- tables.add(RubyString.newUnicodeString(runtime, name));
272
+ tables.append(RubyString.newUnicodeString(runtime, name));
273
+ }
274
+ return tables;
275
+ }
276
+
277
+ @Override
278
+ protected ColumnData[] extractColumns(final Ruby runtime,
279
+ final Connection connection, final ResultSet resultSet,
280
+ final boolean downCase) throws SQLException {
281
+
282
+ final ResultSetMetaData resultMetaData = resultSet.getMetaData();
283
+
284
+ final int columnCount = resultMetaData.getColumnCount();
285
+ final ColumnData[] columns = new ColumnData[columnCount];
286
+
287
+ for ( int i = 1; i <= columnCount; i++ ) { // metadata is one-based
288
+ String name = resultMetaData.getColumnLabel(i);
289
+ if ( downCase ) {
290
+ name = name.toLowerCase();
291
+ } else {
292
+ name = caseConvertIdentifierForRails(connection, name);
293
+ }
294
+ final RubyString columnName = RubyString.newUnicodeString(runtime, name);
295
+
296
+ int columnType = resultMetaData.getColumnType(i);
297
+ if (columnType == Types.NUMERIC) {
298
+ // avoid extracting all NUMBER columns as BigDecimal :
299
+ if (resultMetaData.getScale(i) == 0) {
300
+ final int prec = resultMetaData.getPrecision(i);
301
+ if ( prec < 10 ) { // fits into int
302
+ columnType = Types.INTEGER;
303
+ }
304
+ else if ( prec < 19 ) { // fits into long
305
+ columnType = Types.BIGINT;
306
+ }
307
+ }
308
+ }
309
+
310
+ columns[i - 1] = new ColumnData(columnName, columnType, i);
268
311
  }
269
- return runtime.newArray(tables);
312
+
313
+ return columns;
270
314
  }
271
315
 
272
316
  // storesMixedCaseIdentifiers() return false;
@@ -285,4 +329,137 @@ public class OracleRubyJdbcConnection extends RubyJdbcConnection {
285
329
  return value == null ? null : value.toUpperCase();
286
330
  }
287
331
 
332
+ // based on OracleEnhanced's Ruby connection.describe
333
+ @JRubyMethod(name = "describe", required = 1)
334
+ public IRubyObject describe(final ThreadContext context, final IRubyObject name) {
335
+ final RubyArray desc = describe(context, name.toString(), null);
336
+ return desc == null ? context.nil : desc; // TODO raise instead of nil
337
+ }
338
+
339
+ @JRubyMethod(name = "describe", required = 2)
340
+ public IRubyObject describe(final ThreadContext context, final IRubyObject name, final IRubyObject owner) {
341
+ final RubyArray desc = describe(context, name.toString(), owner.isNil() ? null : owner.toString());
342
+ return desc == null ? context.nil : desc; // TODO raise instead of nil
343
+ }
344
+
345
+ private RubyArray describe(final ThreadContext context, final String name, final String owner) {
346
+ final String dbLink; String defaultOwner, theName = name; int delim;
347
+ if ( ( delim = theName.indexOf('@') ) > 0 ) {
348
+ dbLink = theName.substring(delim).toUpperCase(); // '@DBLINK'
349
+ theName = theName.substring(0, delim);
350
+ defaultOwner = null; // will SELECT username FROM all_dbLinks ...
351
+ }
352
+ else {
353
+ dbLink = ""; defaultOwner = owner; // config[:username] || meta_data.user_name
354
+ }
355
+
356
+ theName = isValidTableName(theName) ? theName.toUpperCase() : unquoteTableName(theName);
357
+
358
+ final String tableName; final String tableOwner;
359
+ if ( ( delim = theName.indexOf('.') ) > 0 ) {
360
+ tableOwner = theName.substring(0, delim);
361
+ tableName = theName.substring(delim + 1);
362
+ }
363
+ else {
364
+ tableName = theName;
365
+ tableOwner = (defaultOwner == null && dbLink.length() > 0) ? selectOwner(context, dbLink) : defaultOwner;
366
+ }
367
+
368
+ return withConnection(context, new Callable<RubyArray>() {
369
+ public RubyArray call(final Connection connection) throws SQLException {
370
+ String owner = tableOwner == null ? connection.getMetaData().getUserName() : tableOwner;
371
+ final String sql =
372
+ "SELECT owner, table_name, 'TABLE' name_type" +
373
+ " FROM all_tables" + dbLink +
374
+ " WHERE owner = '" + owner + "' AND table_name = '" + tableName + "'" +
375
+ " UNION ALL " +
376
+ "SELECT owner, view_name table_name, 'VIEW' name_type" +
377
+ " FROM all_views" + dbLink +
378
+ " WHERE owner = '" + owner + "' AND view_name = '" + tableName + "'" +
379
+ " UNION ALL " +
380
+ "SELECT table_owner, DECODE(db_link, NULL, table_name, table_name||'@'||db_link), 'SYNONYM' name_type" +
381
+ " FROM all_synonyms" + dbLink +
382
+ " WHERE owner = '" + owner + "' AND synonym_name = '" + tableName + "'" +
383
+ " UNION ALL " +
384
+ "SELECT table_owner, DECODE(db_link, NULL, table_name, table_name||'@'||db_link), 'SYNONYM' name_type" +
385
+ " FROM all_synonyms" + dbLink +
386
+ " WHERE owner = 'PUBLIC' AND synonym_name = '" + tableName + "'" ;
387
+
388
+ Statement statement = null; ResultSet result = null;
389
+ try {
390
+ statement = connection.createStatement();
391
+ result = statement.executeQuery(sql);
392
+
393
+ if ( ! result.next() ) return null; // NOTE: should raise
394
+
395
+ owner = result.getString("owner");
396
+ final String table_name = result.getString("table_name");
397
+ final String name_type = result.getString("name_type");
398
+
399
+ if ( "SYNONYM".equals(name_type) ) {
400
+ final StringBuilder name = new StringBuilder();
401
+ if ( owner != null && owner.length() > 0 ) {
402
+ name.append(owner).append('.');
403
+ }
404
+ name.append(table_name);
405
+ if ( dbLink != null ) name.append(dbLink);
406
+ return describe(context, name.toString(), owner);
407
+ }
408
+
409
+ final RubyArray arr = RubyArray.newArray(context.runtime, 3);
410
+ arr.append( context.runtime.newString(owner) );
411
+ arr.append( context.runtime.newString(table_name) );
412
+ if ( dbLink != null ) arr.append( context.runtime.newString(dbLink) );
413
+ return arr;
414
+ }
415
+ catch (final SQLException e) {
416
+ debugMessage(context, "failed to describe '" + name + "' : " + e.getMessage());
417
+ throw e;
418
+ }
419
+ finally { close(result); close(statement); }
420
+ }
421
+ });
422
+ }
423
+
424
+ private String selectOwner(final ThreadContext context, final String dbLink) {
425
+ return withConnection(context, new Callable<String>() {
426
+ public String call(final Connection connection) throws SQLException {
427
+ Statement statement = null; ResultSet result = null;
428
+ final String sql = "SELECT username FROM all_db_links WHERE db_link = '" + dbLink + "'";
429
+ try {
430
+ statement = connection.createStatement();
431
+ result = statement.executeQuery(sql);
432
+ // if ( ! result.next() ) return null;
433
+ return result.getString(1);
434
+ }
435
+ catch (final SQLException e) {
436
+ debugMessage(context, "\"" + sql + "\" failed : " + e.getMessage());
437
+ throw e;
438
+ }
439
+ finally { close(result); close(statement); }
440
+ }
441
+ });
442
+ }
443
+
444
+ private static final Pattern VALID_TABLE_NAME;
445
+ static {
446
+ final String NONQUOTED_OBJECT_NAME = "[A-Za-z][A-z0-9$#]{0,29}";
447
+ final String NONQUOTED_DATABASE_LINK = "[A-Za-z][A-z0-9$#\\.@]{0,127}";
448
+ VALID_TABLE_NAME = Pattern.compile(
449
+ "\\A(?:" + NONQUOTED_OBJECT_NAME + "\\.)?" + NONQUOTED_OBJECT_NAME + "(?:@" + NONQUOTED_DATABASE_LINK + ")?\\Z");
450
+ }
451
+
452
+ private static boolean isValidTableName(final String name) {
453
+ return VALID_TABLE_NAME.matcher(name).matches();
454
+ }
455
+
456
+ private static String unquoteTableName(String name) {
457
+ name = name.trim();
458
+ final int len = name.length();
459
+ if (len > 0 && name.charAt(0) == '"' && name.charAt(len - 1) == '"') {
460
+ return name.substring(1, len - 1);
461
+ }
462
+ return name;
463
+ }
464
+
288
465
  }
@@ -327,7 +327,9 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
327
327
  if ( rubyValue.isNil() ) {
328
328
  statement.setNull(index, Types.OTHER); return;
329
329
  }
330
- value = column.getMetaClass().callMethod(context, "json_to_string", rubyValue);
330
+ if (!isAr42(column)) { // Value has already been cast for AR42
331
+ value = column.getMetaClass().callMethod(context, "json_to_string", rubyValue);
332
+ }
331
333
  }
332
334
  else if ( value == null ) {
333
335
  statement.setNull(index, Types.OTHER); return;
@@ -369,7 +371,9 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
369
371
  if ( rubyValue.isNil() ) {
370
372
  statement.setNull(index, Types.OTHER); return;
371
373
  }
372
- value = column.getMetaClass().callMethod(context, "cidr_to_string", rubyValue);
374
+ if (!isAr42(column)) { // Value has already been cast for AR42
375
+ value = column.getMetaClass().callMethod(context, "cidr_to_string", rubyValue);
376
+ }
373
377
  }
374
378
  else if ( value == null ) {
375
379
  statement.setNull(index, Types.OTHER); return;
@@ -494,6 +498,10 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
494
498
  if ( rawDateTime != null && rawDateTime.booleanValue() ) return strValue;
495
499
 
496
500
  final IRubyObject adapter = callMethod(context, "adapter"); // self.adapter
501
+ if ( usesType(runtime) ) {
502
+ return typeCastFromDatabase(context, adapter, runtime.newSymbol("timestamp"), strValue);
503
+ }
504
+
497
505
  if ( adapter.isNil() ) return strValue; // NOTE: we warn on init_connection
498
506
  return adapter.callMethod(context, "_string_to_timestamp", strValue);
499
507
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-jdbc-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.17
4
+ version: 1.3.18
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: 2015-06-30 00:00:00.000000000 Z
11
+ date: 2015-09-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -75,7 +75,9 @@ files:
75
75
  - lib/arel/visitors/firebird.rb
76
76
  - lib/arel/visitors/h2.rb
77
77
  - lib/arel/visitors/hsqldb.rb
78
+ - lib/arel/visitors/postgresql_jdbc.rb
78
79
  - lib/arel/visitors/sql_server.rb
80
+ - lib/arel/visitors/sql_server/ng42.rb
79
81
  - lib/arjdbc.rb
80
82
  - lib/arjdbc/db2.rb
81
83
  - lib/arjdbc/db2/adapter.rb
@@ -131,6 +133,7 @@ files:
131
133
  - lib/arjdbc/mssql/explain_support.rb
132
134
  - lib/arjdbc/mssql/limit_helpers.rb
133
135
  - lib/arjdbc/mssql/lock_methods.rb
136
+ - lib/arjdbc/mssql/types.rb
134
137
  - lib/arjdbc/mssql/utils.rb
135
138
  - lib/arjdbc/mysql.rb
136
139
  - lib/arjdbc/mysql/adapter.rb
@@ -144,6 +147,7 @@ files:
144
147
  - lib/arjdbc/oracle/column.rb
145
148
  - lib/arjdbc/oracle/connection_methods.rb
146
149
  - lib/arjdbc/postgresql.rb
150
+ - lib/arjdbc/postgresql/_bc_time_cast_patch.rb
147
151
  - lib/arjdbc/postgresql/adapter.rb
148
152
  - lib/arjdbc/postgresql/base/array_parser.rb
149
153
  - lib/arjdbc/postgresql/base/oid.rb
@@ -152,6 +156,7 @@ files:
152
156
  - lib/arjdbc/postgresql/column.rb
153
157
  - lib/arjdbc/postgresql/connection_methods.rb
154
158
  - lib/arjdbc/postgresql/explain_support.rb
159
+ - lib/arjdbc/postgresql/oid/bytea.rb
155
160
  - lib/arjdbc/postgresql/oid_types.rb
156
161
  - lib/arjdbc/postgresql/schema_creation.rb
157
162
  - lib/arjdbc/railtie.rb
@@ -198,6 +203,7 @@ files:
198
203
  - src/java/arjdbc/db2/DB2RubyJdbcConnection.java
199
204
  - src/java/arjdbc/derby/DerbyModule.java
200
205
  - src/java/arjdbc/derby/DerbyRubyJdbcConnection.java
206
+ - src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java
201
207
  - src/java/arjdbc/h2/H2Module.java
202
208
  - src/java/arjdbc/h2/H2RubyJdbcConnection.java
203
209
  - src/java/arjdbc/hsqldb/HSQLDBModule.java
@@ -246,9 +252,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
246
252
  version: '0'
247
253
  requirements: []
248
254
  rubyforge_project: jruby-extras
249
- rubygems_version: 2.4.5
255
+ rubygems_version: 2.4.8
250
256
  signing_key:
251
257
  specification_version: 4
252
258
  summary: JDBC adapter for ActiveRecord, for use within JRuby on Rails.
253
259
  test_files: []
254
- has_rdoc: