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.
- checksums.yaml +5 -5
- data/.gitignore +1 -2
- data/.travis.yml +15 -416
- data/Gemfile +35 -37
- data/README.md +23 -118
- data/RUNNING_TESTS.md +31 -26
- data/Rakefile +2 -3
- data/activerecord-jdbc-adapter.gemspec +1 -2
- data/lib/arjdbc/abstract/connection_management.rb +21 -0
- data/lib/arjdbc/abstract/core.rb +62 -0
- data/lib/arjdbc/abstract/database_statements.rb +46 -0
- data/lib/arjdbc/abstract/statement_cache.rb +58 -0
- data/lib/arjdbc/abstract/transaction_support.rb +86 -0
- data/lib/arjdbc/derby/adapter.rb +6 -1
- data/lib/arjdbc/discover.rb +0 -7
- data/lib/arjdbc/firebird/adapter.rb +2 -2
- data/lib/arjdbc/jdbc/adapter.rb +10 -252
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/connection.rb +6 -0
- data/lib/arjdbc/jdbc.rb +2 -2
- data/lib/arjdbc/mysql/adapter.rb +87 -944
- data/lib/arjdbc/mysql/connection_methods.rb +4 -2
- data/lib/arjdbc/postgresql/adapter.rb +288 -1023
- data/lib/arjdbc/postgresql/base/array_decoder.rb +26 -0
- data/lib/arjdbc/postgresql/base/array_encoder.rb +25 -0
- data/lib/arjdbc/postgresql/base/pgconn.rb +8 -5
- data/lib/arjdbc/postgresql/column.rb +10 -599
- data/lib/arjdbc/postgresql/connection_methods.rb +9 -0
- data/lib/arjdbc/postgresql/name.rb +24 -0
- data/lib/arjdbc/postgresql/oid_types.rb +25 -110
- data/lib/arjdbc/sqlite3/adapter.rb +171 -170
- data/lib/arjdbc/tasks/database_tasks.rb +1 -3
- data/lib/arjdbc/tasks/db2_database_tasks.rb +2 -2
- data/lib/arjdbc/version.rb +1 -1
- data/pom.xml +3 -3
- data/rakelib/02-test.rake +0 -12
- data/rakelib/compile.rake +1 -1
- data/rakelib/db.rake +7 -5
- data/rakelib/rails.rake +63 -64
- data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +1 -17
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +518 -1260
- data/src/java/arjdbc/mysql/MySQLModule.java +3 -3
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +53 -134
- data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +214 -240
- data/src/java/arjdbc/sqlite3/SQLite3Module.java +0 -20
- data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +85 -10
- metadata +20 -34
- data/Appraisals +0 -41
- data/lib/active_record/connection_adapters/oracle_adapter.rb +0 -1
- data/lib/arjdbc/common_jdbc_methods.rb +0 -89
- data/lib/arjdbc/mysql/bulk_change_table.rb +0 -150
- data/lib/arjdbc/mysql/column.rb +0 -162
- data/lib/arjdbc/mysql/explain_support.rb +0 -82
- data/lib/arjdbc/mysql/schema_creation.rb +0 -58
- data/lib/arjdbc/oracle/adapter.rb +0 -952
- data/lib/arjdbc/oracle/column.rb +0 -126
- data/lib/arjdbc/oracle/connection_methods.rb +0 -21
- data/lib/arjdbc/oracle.rb +0 -4
- data/lib/arjdbc/postgresql/_bc_time_cast_patch.rb +0 -21
- data/lib/arjdbc/postgresql/base/oid.rb +0 -412
- data/lib/arjdbc/postgresql/base/schema_definitions.rb +0 -131
- data/lib/arjdbc/postgresql/explain_support.rb +0 -53
- data/lib/arjdbc/postgresql/oid/bytea.rb +0 -2
- data/lib/arjdbc/postgresql/schema_creation.rb +0 -60
- data/lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb +0 -297
- data/lib/arjdbc/tasks/oracle_database_tasks.rb +0 -65
- data/src/java/arjdbc/oracle/OracleModule.java +0 -75
- data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +0 -465
data/lib/arjdbc/jdbc/adapter.rb
CHANGED
@@ -11,6 +11,10 @@ require 'arjdbc/jdbc/connection'
|
|
11
11
|
require 'arjdbc/jdbc/callbacks'
|
12
12
|
require 'arjdbc/jdbc/extension'
|
13
13
|
require 'arjdbc/jdbc/type_converter'
|
14
|
+
require 'arjdbc/abstract/core'
|
15
|
+
require 'arjdbc/abstract/connection_management'
|
16
|
+
require 'arjdbc/abstract/database_statements'
|
17
|
+
require 'arjdbc/abstract/transaction_support'
|
14
18
|
|
15
19
|
module ActiveRecord
|
16
20
|
module ConnectionAdapters
|
@@ -34,7 +38,12 @@ module ActiveRecord
|
|
34
38
|
class JdbcAdapter < AbstractAdapter
|
35
39
|
include Jdbc::ConnectionPoolCallbacks
|
36
40
|
|
37
|
-
|
41
|
+
include ArJdbc::Abstract::Core
|
42
|
+
include ArJdbc::Abstract::ConnectionManagement
|
43
|
+
include ArJdbc::Abstract::DatabaseStatements
|
44
|
+
include ArJdbc::Abstract::TransactionSupport
|
45
|
+
|
46
|
+
attr_reader :prepared_statements
|
38
47
|
|
39
48
|
def self.new(connection, logger = nil, pool = nil)
|
40
49
|
adapter = super
|
@@ -67,17 +76,11 @@ module ActiveRecord
|
|
67
76
|
@config[:adapter_spec] = adapter_spec(@config) unless @config.key?(:adapter_spec)
|
68
77
|
spec = @config[:adapter_spec]
|
69
78
|
|
70
|
-
# NOTE: adapter spec's init_connection only called if instantiated here :
|
71
|
-
connection ||= jdbc_connection_class(spec).new(@config, self)
|
72
|
-
|
73
79
|
super(connection, logger, @config)
|
74
80
|
|
75
81
|
# kind of like `extend ArJdbc::MyDB if self.class == JdbcAdapter` :
|
76
82
|
klass = @config[:adapter_class]
|
77
83
|
extend spec if spec && ( ! klass || klass == JdbcAdapter)
|
78
|
-
|
79
|
-
# NOTE: should not be necessary for JNDI due reconnect! on checkout :
|
80
|
-
configure_connection if respond_to?(:configure_connection)
|
81
84
|
end
|
82
85
|
|
83
86
|
# Returns the (JDBC) connection class to be used for this adapter.
|
@@ -96,30 +99,6 @@ module ActiveRecord
|
|
96
99
|
::ActiveRecord::ConnectionAdapters::JdbcColumn
|
97
100
|
end
|
98
101
|
|
99
|
-
# Retrieve the raw `java.sql.Connection` object.
|
100
|
-
# The unwrap parameter is useful if an attempt to unwrap a pooled (JNDI)
|
101
|
-
# connection should be made - to really return the 'native' JDBC object.
|
102
|
-
# @param unwrap [true, false] whether to unwrap the connection object
|
103
|
-
# @return [Java::JavaSql::Connection] the JDBC connection
|
104
|
-
def jdbc_connection(unwrap = nil)
|
105
|
-
java_connection = raw_connection.connection
|
106
|
-
return java_connection unless unwrap
|
107
|
-
connection_class = java.sql.Connection.java_class
|
108
|
-
begin
|
109
|
-
if java_connection.wrapper_for?(connection_class)
|
110
|
-
return java_connection.unwrap(connection_class) # java.sql.Wrapper.unwrap
|
111
|
-
end
|
112
|
-
rescue Java::JavaLang::AbstractMethodError => e
|
113
|
-
ArJdbc.warn("driver/pool connection impl does not support unwrapping (#{e})")
|
114
|
-
end
|
115
|
-
if java_connection.respond_to?(:connection)
|
116
|
-
# e.g. org.apache.tomcat.jdbc.pool.PooledConnection
|
117
|
-
java_connection.connection # getConnection
|
118
|
-
else
|
119
|
-
java_connection
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
102
|
# Locate the specialized (database specific) adapter specification module
|
124
103
|
# if one exists based on provided configuration data. This module will than
|
125
104
|
# extend an instance of the adapter (unless an `:adapter_class` provided).
|
@@ -282,202 +261,15 @@ module ActiveRecord
|
|
282
261
|
return nil, nil
|
283
262
|
end
|
284
263
|
|
285
|
-
# @override
|
286
|
-
def active?
|
287
|
-
@connection.active?
|
288
|
-
end
|
289
|
-
|
290
|
-
# @override
|
291
|
-
def reconnect!
|
292
|
-
@connection.reconnect! # handles adapter.configure_connection
|
293
|
-
@connection
|
294
|
-
end
|
295
|
-
|
296
|
-
# @override
|
297
|
-
def disconnect!
|
298
|
-
@connection.disconnect!
|
299
|
-
end
|
300
|
-
|
301
|
-
# @note Used on AR 2.3 and 3.0
|
302
|
-
# @override
|
303
|
-
def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil)
|
304
|
-
id = execute(sql, name)
|
305
|
-
id_value || id
|
306
|
-
end
|
307
|
-
|
308
264
|
def columns(table_name, name = nil)
|
309
265
|
@connection.columns(table_name.to_s)
|
310
266
|
end
|
311
267
|
|
312
|
-
# Starts a database transaction.
|
313
|
-
# @override
|
314
|
-
def begin_db_transaction
|
315
|
-
@connection.begin
|
316
|
-
end
|
317
|
-
|
318
|
-
# Commits the current database transaction.
|
319
|
-
# @override
|
320
|
-
def commit_db_transaction
|
321
|
-
@connection.commit
|
322
|
-
end
|
323
|
-
|
324
|
-
# Rolls back the current database transaction.
|
325
|
-
# @override
|
326
|
-
def rollback_db_transaction
|
327
|
-
@connection.rollback
|
328
|
-
end
|
329
|
-
|
330
|
-
# Starts a database transaction.
|
331
|
-
# @param isolation the transaction isolation to use
|
332
|
-
# @since 1.3.0
|
333
|
-
# @override on **AR-4.0**
|
334
|
-
def begin_isolated_db_transaction(isolation)
|
335
|
-
@connection.begin(isolation)
|
336
|
-
end
|
337
|
-
|
338
|
-
# Does this adapter support setting the isolation level for a transaction?
|
339
|
-
# Unlike 'plain' `ActiveRecord` we allow checking for concrete transaction
|
340
|
-
# isolation level support by the database.
|
341
|
-
# @param level optional to check if we support a specific isolation level
|
342
|
-
# @since 1.3.0
|
343
|
-
# @extension added optional level parameter
|
344
|
-
def supports_transaction_isolation?(level = nil)
|
345
|
-
@connection.supports_transaction_isolation?(level)
|
346
|
-
end
|
347
|
-
|
348
|
-
# Does our database (+ its JDBC driver) support save-points?
|
349
|
-
# @since 1.3.0
|
350
|
-
# @override
|
351
|
-
def supports_savepoints?
|
352
|
-
@connection.supports_savepoints?
|
353
|
-
end
|
354
|
-
|
355
|
-
# Creates a (transactional) save-point one can rollback to.
|
356
|
-
# Unlike 'plain' `ActiveRecord` it is allowed to pass a save-point name.
|
357
|
-
# @param name the save-point name
|
358
|
-
# @return save-point name (even if nil passed will be generated)
|
359
|
-
# @since 1.3.0
|
360
|
-
# @extension added optional name parameter
|
361
|
-
def create_savepoint(name = current_savepoint_name(true))
|
362
|
-
@connection.create_savepoint(name)
|
363
|
-
end
|
364
|
-
|
365
|
-
# Transaction rollback to a given (previously created) save-point.
|
366
|
-
# If no save-point name given rollback to the last created one.
|
367
|
-
# @param name the save-point name
|
368
|
-
# @since 1.3.0
|
369
|
-
# @extension added optional name parameter
|
370
|
-
def rollback_to_savepoint(name = current_savepoint_name(true))
|
371
|
-
@connection.rollback_savepoint(name)
|
372
|
-
end
|
373
|
-
|
374
|
-
# Release a previously created save-point.
|
375
|
-
# @note Save-points are auto-released with the transaction they're created
|
376
|
-
# in (on transaction commit or roll-back).
|
377
|
-
# @param name the save-point name
|
378
|
-
# @since 1.3.0
|
379
|
-
# @extension added optional name parameter
|
380
|
-
def release_savepoint(name = current_savepoint_name(false))
|
381
|
-
@connection.release_savepoint(name)
|
382
|
-
end
|
383
|
-
|
384
|
-
# Due tracking of save-points created in a LIFO manner, always returns
|
385
|
-
# the correct name if any (last) save-point has been marked and not released.
|
386
|
-
# Otherwise when creating a save-point same naming convention as
|
387
|
-
# `ActiveRecord` uses ("active_record_" prefix) will be returned.
|
388
|
-
# @return [String] the current save-point name
|
389
|
-
# @since 1.3.0
|
390
|
-
# @override
|
391
|
-
def current_savepoint_name(compat = true)
|
392
|
-
open_tx = open_transactions
|
393
|
-
return "active_record_#{open_tx}" if compat # by default behave like AR
|
394
|
-
|
395
|
-
sp_names = @connection.marked_savepoint_names
|
396
|
-
sp_names.last || "active_record_#{open_tx}"
|
397
|
-
# should (open_tx- 1) here but we play by AR's rules as it might fail
|
398
|
-
end unless ArJdbc::AR42
|
399
|
-
|
400
|
-
# @note Same as AR 4.2 but we're allowing an unused parameter.
|
401
|
-
# @private
|
402
|
-
def current_savepoint_name(compat = nil)
|
403
|
-
current_transaction.savepoint_name # unlike AR 3.2-4.1 might be nil
|
404
|
-
end if ArJdbc::AR42
|
405
|
-
|
406
268
|
# @override
|
407
269
|
def supports_views?
|
408
270
|
@connection.supports_views?
|
409
271
|
end
|
410
272
|
|
411
|
-
# Executes a SQL query in the context of this connection using the bind
|
412
|
-
# substitutes.
|
413
|
-
# @param sql the query string (or AREL object)
|
414
|
-
# @param name logging marker for the executed SQL statement log entry
|
415
|
-
# @param binds the bind parameters
|
416
|
-
# @return [ActiveRecord::Result] or [Array] on **AR-2.3**
|
417
|
-
# @override available since **AR-3.1**
|
418
|
-
def exec_query(sql, name = 'SQL', binds = [])
|
419
|
-
if sql.respond_to?(:to_sql)
|
420
|
-
sql = to_sql(sql, binds); to_sql = true
|
421
|
-
end
|
422
|
-
if prepared_statements?
|
423
|
-
log(sql, name, binds) { @connection.execute_query(sql, binds) }
|
424
|
-
else
|
425
|
-
sql = suble_binds(sql, binds) unless to_sql # deprecated behavior
|
426
|
-
log(sql, name) { @connection.execute_query(sql) }
|
427
|
-
end
|
428
|
-
end
|
429
|
-
|
430
|
-
# Executes an insert statement in the context of this connection.
|
431
|
-
# @param sql the query string (or AREL object)
|
432
|
-
# @param name logging marker for the executed SQL statement log entry
|
433
|
-
# @param binds the bind parameters
|
434
|
-
# @override available since **AR-3.1**
|
435
|
-
def exec_insert(sql, name, binds, pk = nil, sequence_name = nil)
|
436
|
-
if sql.respond_to?(:to_sql)
|
437
|
-
sql = to_sql(sql, binds); to_sql = true
|
438
|
-
end
|
439
|
-
if prepared_statements?
|
440
|
-
log(sql, name || 'SQL', binds) { @connection.execute_insert(sql, binds) }
|
441
|
-
else
|
442
|
-
sql = suble_binds(sql, binds) unless to_sql # deprecated behavior
|
443
|
-
log(sql, name || 'SQL') { @connection.execute_insert(sql) }
|
444
|
-
end
|
445
|
-
end
|
446
|
-
|
447
|
-
# Executes a delete statement in the context of this connection.
|
448
|
-
# @param sql the query string (or AREL object)
|
449
|
-
# @param name logging marker for the executed SQL statement log entry
|
450
|
-
# @param binds the bind parameters
|
451
|
-
# @override available since **AR-3.1**
|
452
|
-
def exec_delete(sql, name, binds)
|
453
|
-
if sql.respond_to?(:to_sql)
|
454
|
-
sql = to_sql(sql, binds); to_sql = true
|
455
|
-
end
|
456
|
-
if prepared_statements?
|
457
|
-
log(sql, name || 'SQL', binds) { @connection.execute_delete(sql, binds) }
|
458
|
-
else
|
459
|
-
sql = suble_binds(sql, binds) unless to_sql # deprecated behavior
|
460
|
-
log(sql, name || 'SQL') { @connection.execute_delete(sql) }
|
461
|
-
end
|
462
|
-
end
|
463
|
-
|
464
|
-
# # Executes an update statement in the context of this connection.
|
465
|
-
# @param sql the query string (or AREL object)
|
466
|
-
# @param name logging marker for the executed SQL statement log entry
|
467
|
-
# @param binds the bind parameters
|
468
|
-
# @override available since **AR-3.1**
|
469
|
-
def exec_update(sql, name, binds)
|
470
|
-
if sql.respond_to?(:to_sql)
|
471
|
-
sql = to_sql(sql, binds); to_sql = true
|
472
|
-
end
|
473
|
-
if prepared_statements?
|
474
|
-
log(sql, name || 'SQL', binds) { @connection.execute_update(sql, binds) }
|
475
|
-
else
|
476
|
-
sql = suble_binds(sql, binds) unless to_sql # deprecated behavior
|
477
|
-
log(sql, name || 'SQL') { @connection.execute_update(sql) }
|
478
|
-
end
|
479
|
-
end
|
480
|
-
|
481
273
|
# Similar to {#exec_query} except it returns "raw" results in an array
|
482
274
|
# where each rows is a hash with keys as columns (just like Rails used to
|
483
275
|
# do up until 3.0) instead of wrapping them in a {#ActiveRecord::Result}.
|
@@ -506,22 +298,6 @@ module ActiveRecord
|
|
506
298
|
exec_query_raw(sql, name, binds).map!(&:values)
|
507
299
|
end
|
508
300
|
|
509
|
-
if ActiveRecord::VERSION::MAJOR > 3 # expects AR::Result e.g. from select_all
|
510
|
-
|
511
|
-
# @private
|
512
|
-
def select(sql, name = nil, binds = [])
|
513
|
-
exec_query(to_sql(sql, binds), name, binds)
|
514
|
-
end
|
515
|
-
|
516
|
-
else
|
517
|
-
|
518
|
-
# @private
|
519
|
-
def select(sql, name = nil, binds = []) # NOTE: only (sql, name) on AR < 3.1
|
520
|
-
exec_query_raw(to_sql(sql, binds), name, binds)
|
521
|
-
end
|
522
|
-
|
523
|
-
end
|
524
|
-
|
525
301
|
# Executes the SQL statement in the context of this connection.
|
526
302
|
# The return value from this method depends on the SQL type (whether
|
527
303
|
# it's a SELECT, INSERT etc.). For INSERTs a generated id might get
|
@@ -595,11 +371,6 @@ module ActiveRecord
|
|
595
371
|
( key = primary_key(table) ) ? [ key, nil ] : nil
|
596
372
|
end
|
597
373
|
|
598
|
-
# @override
|
599
|
-
def primary_key(table)
|
600
|
-
primary_keys(table).first
|
601
|
-
end
|
602
|
-
|
603
374
|
# @override
|
604
375
|
def primary_keys(table)
|
605
376
|
@connection.primary_keys(table)
|
@@ -662,19 +433,6 @@ module ActiveRecord
|
|
662
433
|
end if ActiveRecord::VERSION::MAJOR < 3 ||
|
663
434
|
( ActiveRecord::VERSION::MAJOR == 3 && ActiveRecord::VERSION::MINOR < 1 )
|
664
435
|
|
665
|
-
def translate_exception(e, message)
|
666
|
-
# we shall not translate native "Java" exceptions as they might
|
667
|
-
# swallow an ArJdbc / driver bug into a AR::StatementInvalid ...
|
668
|
-
return e if e.is_a?(NativeException) # JRuby 1.6
|
669
|
-
return e if e.is_a?(Java::JavaLang::Throwable)
|
670
|
-
|
671
|
-
case e
|
672
|
-
when SystemExit, SignalException, NoMemoryError then e
|
673
|
-
# NOTE: wraps AR::JDBCError into AR::StatementInvalid, desired ?!
|
674
|
-
else super
|
675
|
-
end
|
676
|
-
end
|
677
|
-
|
678
436
|
# Take an id from the result of an INSERT query.
|
679
437
|
# @return [Integer, NilClass]
|
680
438
|
def last_inserted_id(result)
|
Binary file
|
@@ -33,6 +33,12 @@ module ActiveRecord
|
|
33
33
|
JdbcTypeConverter.new(supported_data_types).choose_best_types
|
34
34
|
end
|
35
35
|
|
36
|
+
def time_in_default_timezone(value)
|
37
|
+
value = value.to_time if value.respond_to? :to_time
|
38
|
+
|
39
|
+
ActiveRecord::Base::default_timezone == :utc ? value.utc : value.getlocal
|
40
|
+
end
|
41
|
+
|
36
42
|
# @deprecated no longer used - only kept for compatibility
|
37
43
|
def set_native_database_types
|
38
44
|
ArJdbc.deprecate "set_native_database_types is no longer used and does nothing override native_database_types instead"
|
data/lib/arjdbc/jdbc.rb
CHANGED
@@ -31,7 +31,7 @@ module ArJdbc
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def deprecate(message, once = nil) # adds a "DEPRECATION WARNING: " prefix
|
34
|
-
::ActiveSupport::Deprecation.warn(message,
|
34
|
+
::ActiveSupport::Deprecation.warn(message, caller_locations) || true if warn?(message, once)
|
35
35
|
end
|
36
36
|
|
37
37
|
private
|
@@ -56,4 +56,4 @@ module ArJdbc
|
|
56
56
|
else
|
57
57
|
require 'arjdbc/discover'
|
58
58
|
end
|
59
|
-
end
|
59
|
+
end
|