activerecord-jdbc-adapter 5.0.pre1 → 51.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|