activerecord-jdbc-adapter 50.2-java → 50.3-java

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 0222c94a160b13665c886d04020a3e549a1cd040
4
- data.tar.gz: ef8cf19be8e3e6febef802e235a940069b445168
2
+ SHA256:
3
+ metadata.gz: fde4f57b66b6cae2acbbac6eba863c7423ed320b2e420b7a752ec8a9eb984846
4
+ data.tar.gz: e3a689f005016305b9e3e2b6c637fcd948135d821381d216007ba8a5a3a0eb50
5
5
  SHA512:
6
- metadata.gz: d105602d32ac438487c69d77120006847ac2f995e3434820a594db4d4a04a40a2880d8a8c4101ff3581ce7391aff085864df9f6b9ae195858a41159172138cb8
7
- data.tar.gz: 639a1928003e48251aa9c143298643bb282f93086df821c1bf31dac8f5c425c5b55b4654f7bdbf472e78af653dd0481ad3764576ed71211b3747b675371d9e32
6
+ metadata.gz: f55d6fbeecc3cc27ea2d5c8af4e31cb84c3ef82f8ea22d536772e61524798a89c2f88bf88dd09d97bd5c5fa3aeca45dc8fa21a4883fb5a4e8e80b6d98cac3d14
7
+ data.tar.gz: 8fb21f6c9c0f0919ed8215781329b3a8ecc012399593332c9a56432542d88036dbb36e05d6b6ddc5aa7c2b06d4df45035693c694a40ec71ce37834ca2bf68a57
data/.travis.yml CHANGED
@@ -1,9 +1,18 @@
1
1
  language: ruby
2
2
  sudo: false
3
+ branches:
4
+ only:
5
+ - master
6
+ - /.*-stable$/
7
+ - /^test-.*/
8
+ - /maintenance|support/
9
+ - /.*dev$/
3
10
  bundler_args: --without development
4
11
  script: bundle exec rake ${TEST_PREFIX}test_$DB
5
12
  before_install:
6
13
  - unset _JAVA_OPTIONS
14
+ - rvm @default,@global do gem uninstall bundler -a -x -I || true
15
+ - gem install bundler -v "~>1.17.3"
7
16
  before_script:
8
17
  - echo "JAVA_OPTS=$JAVA_OPTS"
9
18
  - export JRUBY_OPTS="-J-Xms64M -J-Xmx1024M"
@@ -33,6 +42,8 @@ rvm:
33
42
  - jruby-9.1.16.0
34
43
  jdk:
35
44
  - openjdk8
45
+ addons:
46
+ postgresql: "9.4"
36
47
  env:
37
48
  - DB=mysql2 PREPARED_STATEMENTS=false
38
49
  - DB=mysql2 PREPARED_STATEMENTS=true
@@ -43,19 +54,29 @@ env:
43
54
  - DB=postgresql PREPARED_STATEMENTS=true INSERT_RETURNING=true
44
55
  - DB=sqlite3 PREPARED_STATEMENTS=false
45
56
  - DB=sqlite3 PREPARED_STATEMENTS=true
46
- #- DB=jndi PREPARED_STATEMENTS=false
47
- #- DB=jndi PREPARED_STATEMENTS=true
48
- branches:
49
- only:
50
- - master
51
- - /.*-stable$/
52
- - /^test-.*/
53
- - /maintenance|support/
54
- - /.*dev$/
57
+ - DB=jndi PREPARED_STATEMENTS=false
58
+ - DB=jndi PREPARED_STATEMENTS=true
55
59
  matrix:
56
60
  allow_failures:
57
61
  - rvm: jruby-head
58
62
  include:
63
+ # jruby-9.2
64
+ - rvm: jruby-9.2.6.0
65
+ env: DB=mysql2
66
+ - rvm: jruby-9.2.6.0
67
+ env: DB=postgresql
68
+ - rvm: jruby-9.2.6.0
69
+ env: DB=sqlite3
70
+ # jruby-9.2 + Java 11
71
+ - rvm: jruby-9.2.6.0
72
+ env: DB=mysql2
73
+ jdk: openjdk11
74
+ - rvm: jruby-9.2.6.0
75
+ env: DB=postgresql
76
+ jdk: openjdk11
77
+ - rvm: jruby-9.2.6.0
78
+ env: DB=sqlite3
79
+ jdk: openjdk11
59
80
  # jruby-head
60
81
  - rvm: jruby-head
61
82
  env: DB=mysql2
@@ -71,9 +92,9 @@ matrix:
71
92
  mariadb: '10.1'
72
93
  env: DB=mariadb PREPARED_STATEMENTS=true
73
94
  # Rails test-suite :
74
- - env: DB=mysql2 TEST_PREFIX="rails:" AR_VERSION="v5.0.7" # PS off by default
75
- - env: DB=mysql2 TEST_PREFIX="rails:" AR_VERSION="v5.0.7" PREPARED_STATEMENTS=true
76
- - env: DB=mysql2 TEST_PREFIX="rails:" AR_VERSION="v5.0.7" DRIVER=MariaDB
77
- - env: DB=postgresql TEST_PREFIX="rails:" AR_VERSION="v5.0.7" # PS on by default
78
- - env: DB=postgresql TEST_PREFIX="rails:" AR_VERSION="v5.0.7" PREPARED_STATEMENTS=false
79
- - env: DB=sqlite3 TEST_PREFIX="rails:" AR_VERSION="v5.0.7"
95
+ - env: DB=mysql2 TEST_PREFIX="rails:" AR_VERSION="v5.0.7.1" # PS off by default
96
+ - env: DB=mysql2 TEST_PREFIX="rails:" AR_VERSION="v5.0.7.1" PREPARED_STATEMENTS=true
97
+ - env: DB=mysql2 TEST_PREFIX="rails:" AR_VERSION="v5.0.7.1" DRIVER=MariaDB
98
+ - env: DB=postgresql TEST_PREFIX="rails:" AR_VERSION="v5.0.7.1" # PS on by default
99
+ - env: DB=postgresql TEST_PREFIX="rails:" AR_VERSION="v5.0.7.1" PREPARED_STATEMENTS=false
100
+ - env: DB=sqlite3 TEST_PREFIX="rails:" AR_VERSION="v5.0.7.1"
@@ -26,8 +26,8 @@ module ArJdbc
26
26
  log(sql, name) { @connection.execute_query(sql) }
27
27
  else
28
28
  log(sql, name, binds) do
29
- # It seems that #supports_statement_cache? is defined but isn't checked before setting "prepare" (AR 5.0)
30
- cached_statement = fetch_cached_statement(sql) if prepare && supports_statement_cache?
29
+ # this is different from normal AR that always caches
30
+ cached_statement = fetch_cached_statement(sql) if prepare && @jdbc_statement_cache_enabled
31
31
  @connection.execute_prepared_query(sql, binds, cached_statement)
32
32
  end
33
33
  end
@@ -23,7 +23,7 @@ module ArJdbc
23
23
  # Only say we support the statement cache if we are using prepared statements
24
24
  # and have a max number of statements defined
25
25
  statement_limit = self.class.type_cast_config_to_integer(config[:statement_limit])
26
- @jdbc_statement_cache_enabled = config[:prepared_statements] && (statement_limit.nil? || statement_limit > 0)
26
+ @jdbc_statement_cache_enabled = prepared_statements && (statement_limit.nil? || statement_limit > 0)
27
27
 
28
28
  @statements = StatementPool.new(statement_limit) # AR (5.0) expects this to be stored as @statements
29
29
  end
@@ -34,11 +34,11 @@ module ArJdbc
34
34
  end
35
35
 
36
36
  def delete_cached_statement(sql)
37
- @statements.delete(cached_statement_key(sql))
37
+ @statements.delete(sql_key(sql))
38
38
  end
39
39
 
40
40
  def fetch_cached_statement(sql)
41
- @statements[cached_statement_key(sql)] ||= @connection.connection.prepare_statement(sql)
41
+ @statements[sql_key(sql)] ||= @connection.prepare_statement(sql)
42
42
  end
43
43
 
44
44
  def supports_statement_cache?
@@ -49,7 +49,7 @@ module ArJdbc
49
49
 
50
50
  # This should be overridden by the adapter if the sql itself
51
51
  # is not enough to make the key unique
52
- def cached_statement_key(sql)
52
+ def sql_key(sql)
53
53
  sql
54
54
  end
55
55
 
@@ -32,7 +32,15 @@ module ActiveRecord
32
32
  include ArJdbc::MySQL
33
33
 
34
34
  def initialize(connection, logger, connection_parameters, config)
35
+ # workaround to skip version check on JNDI to be lazy, dummy version is high enough for Rails 5.0 - 6.0
36
+ is_jndi = ::ActiveRecord::ConnectionAdapters::JdbcConnection.jndi_config?(config)
37
+ @version = '8.1.5' if is_jndi
38
+
35
39
  super
40
+
41
+ # set to nil to have it lazy-load the real value when required
42
+ @version = nil if is_jndi
43
+
36
44
  @prepared_statements = false unless config.key?(:prepared_statements)
37
45
  # configure_connection taken care of at ArJdbc::Abstract::Core
38
46
  end
@@ -522,61 +522,6 @@ module ArJdbc
522
522
  execute "TRUNCATE TABLE #{quote_table_name(table_name)}", name
523
523
  end
524
524
 
525
- # Returns an array of indexes for the given table.
526
- def indexes(table_name, name = nil)
527
- # FIXME: AR version => table = Utils.extract_schema_qualified_name(table_name.to_s)
528
- schema, table = extract_schema_and_table(table_name.to_s)
529
-
530
- result = query(<<-SQL, 'SCHEMA')
531
- SELECT distinct i.relname, d.indisunique, d.indkey, pg_get_indexdef(d.indexrelid), t.oid,
532
- pg_catalog.obj_description(i.oid, 'pg_class') AS comment,
533
- (SELECT COUNT(*) FROM pg_opclass o
534
- JOIN (SELECT unnest(string_to_array(d.indclass::text, ' '))::int oid) c
535
- ON o.oid = c.oid WHERE o.opcdefault = 'f')
536
- FROM pg_class t
537
- INNER JOIN pg_index d ON t.oid = d.indrelid
538
- INNER JOIN pg_class i ON d.indexrelid = i.oid
539
- LEFT JOIN pg_namespace n ON n.oid = i.relnamespace
540
- WHERE i.relkind = 'i'
541
- AND d.indisprimary = 'f'
542
- AND t.relname = '#{table}'
543
- AND n.nspname = #{schema ? "'#{schema}'" : 'ANY (current_schemas(false))'}
544
- ORDER BY i.relname
545
- SQL
546
-
547
- result.map do |row|
548
- index_name = row[0]
549
- # FIXME: These values [1,2] are returned in a different format than AR expects, maybe we could update it on the Java side to be more accurate
550
- unique = row[1].is_a?(String) ? row[1] == 't' : row[1] # JDBC gets us a boolean
551
- indkey = row[2].is_a?(Java::OrgPostgresqlUtil::PGobject) ? row[2].value : row[2]
552
- indkey = indkey.split(" ").map(&:to_i)
553
- inddef = row[3]
554
- oid = row[4]
555
- comment = row[5]
556
- opclass = row[6]
557
-
558
- using, expressions, where = inddef.scan(/ USING (\w+?) \((.+?)\)(?: WHERE (.+))?\z/).flatten
559
-
560
- if indkey.include?(0) || opclass > 0
561
- columns = expressions
562
- else
563
- columns = Hash[query(<<-SQL.strip_heredoc, "SCHEMA")].values_at(*indkey).compact
564
- SELECT a.attnum, a.attname
565
- FROM pg_attribute a
566
- WHERE a.attrelid = #{oid}
567
- AND a.attnum IN (#{indkey.join(",")})
568
- SQL
569
-
570
- # add info on sort order for columns (only desc order is explicitly specified, asc is the default)
571
- orders = Hash[
572
- expressions.scan(/(\w+) DESC/).flatten.map { |order_column| [order_column, :desc] }
573
- ]
574
- end
575
-
576
- IndexDefinition.new(table_name, index_name, unique, columns, [], orders, where, nil, using.to_sym, comment.presence)
577
- end.compact
578
- end
579
-
580
525
  # @private
581
526
  def column_name_for_operation(operation, node)
582
527
  case operation
@@ -682,8 +627,6 @@ module ActiveRecord::ConnectionAdapters
682
627
  require 'arjdbc/postgresql/oid_types'
683
628
  include ::ArJdbc::PostgreSQL::OIDTypes
684
629
 
685
- load 'arjdbc/postgresql/_bc_time_cast_patch.rb'
686
-
687
630
  include ::ArJdbc::PostgreSQL::ColumnHelpers
688
631
 
689
632
  include ::ArJdbc::Util::QuotedCache
@@ -736,7 +679,7 @@ module ActiveRecord::ConnectionAdapters
736
679
 
737
680
  # Prepared statements aren't schema aware so we need to make sure we
738
681
  # store different PreparedStatement objects for different schemas
739
- def cached_statement_key(sql)
682
+ def sql_key(sql)
740
683
  "#{schema_search_path}-#{sql}"
741
684
  end
742
685
 
@@ -9,6 +9,61 @@ module ArJdbc
9
9
  # @private
10
10
  OID = ::ActiveRecord::ConnectionAdapters::PostgreSQL::OID
11
11
 
12
+ # this version makes sure to register the types by name as well
13
+ # we still need to version with OID since it's used from SchemaStatements as well
14
+ class ArjdbcTypeMapInitializer < OID::TypeMapInitializer
15
+ private
16
+
17
+ def name_with_ns(row)
18
+ if row['in_ns']
19
+ row['typname']
20
+ else
21
+ %Q("#{row['nspname']}"."#{row['typname']}")
22
+ end
23
+ end
24
+
25
+ def register_enum_type(row)
26
+ super
27
+ register name_with_ns(row), OID::Enum.new
28
+ end
29
+
30
+ def register_array_type(row)
31
+ super
32
+ register_with_subtype(name_with_ns(row), row['typelem'].to_i) do |subtype|
33
+ OID::Array.new(subtype, row['typdelim'])
34
+ end
35
+ end
36
+
37
+ def register_range_type(row)
38
+ super
39
+ name = name_with_ns(row)
40
+ register_with_subtype(name, row['rngsubtype'].to_i) do |subtype|
41
+ OID::Range.new(subtype, name.to_sym)
42
+ end
43
+ end
44
+
45
+ def register_domain_type(row)
46
+ if base_type = @store.lookup(row['typbasetype'].to_i)
47
+ register row['oid'], base_type
48
+ register name_with_ns(row), base_type
49
+ else
50
+ warn "unknown base type (OID: #{row['typbasetype']}) for domain #{row['typname']}."
51
+ end
52
+ end
53
+
54
+ def register_composite_type(row)
55
+ if subtype = @store.lookup(row['typelem'].to_i)
56
+ register row['oid'], OID::Vector.new(row['typdelim'], subtype)
57
+ register name_with_ns(row), OID::Vector.new(row['typdelim'], subtype)
58
+ end
59
+ end
60
+
61
+ def assert_valid_registration(oid, oid_type)
62
+ ret = super
63
+ ret == 0 ? oid : ret
64
+ end
65
+ end
66
+
12
67
  # @private
13
68
  module OIDTypes
14
69
 
@@ -41,7 +96,7 @@ module ArJdbc
41
96
 
42
97
  def get_oid_type(oid, fmod, column_name, sql_type = '') # :nodoc:
43
98
  if !type_map.key?(oid)
44
- load_additional_types(type_map, [oid])
99
+ load_additional_types(type_map, oid)
45
100
  end
46
101
 
47
102
  type_map.fetch(oid, fmod, sql_type) {
@@ -138,26 +193,45 @@ module ArJdbc
138
193
  end
139
194
 
140
195
  load_additional_types(m)
196
+
197
+ # pgjdbc returns these if the column is auto-incrmenting
198
+ m.alias_type 'serial', 'int4'
199
+ m.alias_type 'bigserial', 'int8'
141
200
  end
142
201
 
143
- def load_additional_types(type_map, oids = nil) # :nodoc:
144
- initializer = OID::TypeMapInitializer.new(type_map)
202
+ def load_additional_types(type_map, oid = nil) # :nodoc:
203
+ initializer = ArjdbcTypeMapInitializer.new(type_map)
145
204
 
146
205
  if supports_ranges?
147
206
  query = <<-SQL
148
- SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype
207
+ SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype,
208
+ ns.nspname, ns.nspname = ANY(current_schemas(true)) in_ns
149
209
  FROM pg_type as t
150
210
  LEFT JOIN pg_range as r ON oid = rngtypid
211
+ JOIN pg_namespace AS ns ON t.typnamespace = ns.oid
151
212
  SQL
152
213
  else
153
214
  query = <<-SQL
154
- SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, t.typtype, t.typbasetype
215
+ SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, t.typtype, t.typbasetype,
216
+ ns.nspname, ns.nspname = ANY(current_schemas(true)) in_ns
155
217
  FROM pg_type as t
218
+ JOIN pg_namespace AS ns ON t.typnamespace = ns.oid
156
219
  SQL
157
220
  end
158
221
 
159
- if oids
160
- query += "WHERE t.oid::integer IN (%s)" % oids.join(", ")
222
+ if oid
223
+ if oid.is_a? Numeric || oid.match(/^\d+$/)
224
+ # numeric OID
225
+ query += "WHERE t.oid::integer = %s" % oid
226
+
227
+ elsif m = oid.match(/"?(\w+)"?\."?(\w+)"?/)
228
+ # namespace and type name
229
+ query += "WHERE ns.nspname = '%s' AND t.typname = '%s'" % [m[1], m[2]]
230
+
231
+ else
232
+ # only type name
233
+ query += "WHERE t.typname = '%s' AND ns.nspname = ANY(current_schemas(true))" % oid
234
+ end
161
235
  else
162
236
  query += initializer.query_conditions_for_initial_load(type_map)
163
237
  end
@@ -1,3 +1,3 @@
1
1
  module ArJdbc
2
- VERSION = '50.2'
2
+ VERSION = '50.3'
3
3
  end
data/rakelib/rails.rake CHANGED
@@ -9,14 +9,15 @@ namespace :rails do
9
9
  if ENV['RAILS']
10
10
  ar_path = File.join(ENV['RAILS'], 'activerecord')
11
11
  end
12
-
12
+
13
13
  unless ar_path && File.exist?(ar_path)
14
- ar_path = `bundle info --path activerecord`.chomp
14
+ ar_path = `bundle info --path activerecord`.lines.last.chomp
15
15
  end
16
16
 
17
17
  unless File.exist? ar_test_dir = File.join(ar_path, 'test')
18
18
  raise "can not directly load Rails tests;" +
19
- " try setting a local repository path e.g. export RAILS=`pwd`/../rails"
19
+ " try setting a local repository path e.g. export RAILS=`pwd`/../rails;" +
20
+ " failed guess: #{ar_path}"
20
21
  end
21
22
 
22
23
  driver = "jdbc-#{ENV['DRIVER'] ? ENV['DRIVER'].downcase : (adapter =~ /postgres/i ? 'postgres' : adapter)}"
@@ -29,7 +29,6 @@ import java.util.HashMap;
29
29
  import java.util.Map;
30
30
  import java.util.WeakHashMap;
31
31
 
32
- import org.jruby.NativeException;
33
32
  import org.jruby.Ruby;
34
33
  import org.jruby.RubyArray;
35
34
  import org.jruby.RubyClass;
@@ -148,13 +147,7 @@ public class ArJdbcModule {
148
147
  }
149
148
  }
150
149
  catch (ClassNotFoundException e) { /* ignored */ }
151
- catch (NoSuchMethodException e) {
152
- throw newNativeException(runtime, e);
153
- }
154
- catch (IllegalAccessException e) {
155
- throw newNativeException(runtime, e);
156
- }
157
- catch (InvocationTargetException e) {
150
+ catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
158
151
  throw newNativeException(runtime, e);
159
152
  }
160
153
 
@@ -263,18 +256,15 @@ public class ArJdbcModule {
263
256
  try {
264
257
  return klass.getMethod(name, argType).invoke(null, arg);
265
258
  }
266
- catch (IllegalAccessException e) {
267
- throw newNativeException(runtime, e);
268
- }
269
- catch (InvocationTargetException e) {
259
+ catch (IllegalAccessException | InvocationTargetException e) {
270
260
  throw newNativeException(runtime, e);
271
261
  }
272
262
  }
273
263
 
274
264
  private static RaiseException newNativeException(final Ruby runtime, final Throwable cause) {
275
- RubyClass nativeClass = runtime.getClass(NativeException.CLASS_NAME);
276
- NativeException nativeException = new NativeException(runtime, nativeClass, cause);
277
- return new RaiseException(cause, nativeException);
265
+ final RaiseException error = runtime.newRuntimeError(cause.toString());
266
+ error.initCause(cause);
267
+ return error;
278
268
  }
279
269
 
280
270
  @JRubyMethod(meta = true)
@@ -83,8 +83,8 @@ public class DerbyRubyJdbcConnection extends RubyJdbcConnection {
83
83
  final int minor = jdbcDriver.getMinorVersion();
84
84
  if ( major < 10 || ( major == 10 && minor < 5 ) ) {
85
85
  final RubyClass errorClass = getConnectionNotEstablished(context.runtime);
86
- throw new RaiseException(context.runtime, errorClass,
87
- "adapter requires Derby >= 10.5 got: " + major + "." + minor + "", false);
86
+ throw context.runtime.newRaiseException(errorClass,
87
+ "adapter requires Derby >= 10.5 got: " + major + "." + minor + "");
88
88
  }
89
89
  if ( major == 10 && minor < 8 ) { // 10.8 ~ supports JDBC 4.1
90
90
  // config[:connection_alive_sql] ||= 'SELECT 1 FROM SYS.SYSSCHEMAS FETCH FIRST 1 ROWS ONLY'
@@ -27,12 +27,6 @@ package arjdbc.jdbc;
27
27
 
28
28
  import java.sql.Connection;
29
29
  import java.sql.SQLException;
30
- import javax.sql.DataSource;
31
-
32
- import org.jruby.RubyObject;
33
- import org.jruby.RubyString;
34
- import org.jruby.runtime.ThreadContext;
35
- import org.jruby.runtime.builtin.IRubyObject;
36
30
 
37
31
  /**
38
32
  * Interface to be implemented in Ruby for retrieving a new connection.
@@ -49,84 +43,3 @@ public interface ConnectionFactory {
49
43
  Connection newConnection() throws SQLException;
50
44
 
51
45
  }
52
-
53
- class DataSourceConnectionFactoryImpl implements ConnectionFactory {
54
-
55
- private final DataSource dataSource;
56
- final String username, password; // optional
57
-
58
- public DataSourceConnectionFactoryImpl(final DataSource dataSource) {
59
- this.dataSource = dataSource;
60
- this.username = null; this.password = null;
61
- }
62
-
63
- public DataSourceConnectionFactoryImpl(final DataSource dataSource,
64
- final String username, final String password) {
65
- this.dataSource = dataSource;
66
- this.username = username; this.password = password;
67
- }
68
-
69
- @Override
70
- public Connection newConnection() throws SQLException {
71
- if ( username != null ) {
72
- dataSource.getConnection(username, password);
73
- }
74
- return dataSource.getConnection();
75
- }
76
-
77
- DataSource getDataSource() { return dataSource; } /* for tests */
78
-
79
- }
80
-
81
- class DriverConnectionFactoryImpl implements ConnectionFactory {
82
-
83
- private final DriverWrapper driverWrapper;
84
- final String url;
85
- final String username, password; // null allowed
86
-
87
- public DriverConnectionFactoryImpl(final DriverWrapper driver, final String url) {
88
- this.driverWrapper = driver; this.url = url;
89
- this.username = null; this.password = null;
90
- }
91
-
92
- public DriverConnectionFactoryImpl(final DriverWrapper driver, final String url,
93
- final String username, final String password) {
94
- this.driverWrapper = driver; this.url = url;
95
- this.username = username; this.password = password;
96
- }
97
-
98
- @Override
99
- public Connection newConnection() throws SQLException {
100
- return driverWrapper.connect(url, username, password);
101
- }
102
-
103
- DriverWrapper getDriverWrapper() { return driverWrapper; } /* for tests */
104
-
105
- }
106
-
107
- // @legacy ActiveRecord::ConnectionAdapters::JdbcDriver
108
- class RubyConnectionFactoryImpl implements ConnectionFactory {
109
-
110
- private final IRubyObject driver;
111
- final RubyString url;
112
- final IRubyObject username, password; // null allowed
113
-
114
- private final RubyObject contextProvider;
115
-
116
- public RubyConnectionFactoryImpl(final IRubyObject driver, final RubyString url,
117
- final IRubyObject username, final IRubyObject password) {
118
- this.driver = driver; this.url = url;
119
- this.username = username; this.password = password;
120
- contextProvider = (RubyObject) driver;
121
- }
122
-
123
- @Override
124
- public Connection newConnection() throws SQLException {
125
- final ThreadContext context = contextProvider.getRuntime().getCurrentContext();
126
- final IRubyObject connection = driver.callMethod(context, "connection", new IRubyObject[] { url, username, password });
127
- return (Connection) connection.toJava(Connection.class);
128
- }
129
-
130
- IRubyObject getDriver() { return driver; } /* for tests */
131
-
132
- }