activerecord-jdbc-adapter 1.0.3-java → 50.1-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 +7 -0
- data/.gitignore +33 -0
- data/.travis.yml +79 -0
- data/.yardopts +4 -0
- data/CONTRIBUTING.md +50 -0
- data/Gemfile +91 -0
- data/History.md +1191 -0
- data/LICENSE.txt +22 -17
- data/README.md +169 -0
- data/RUNNING_TESTS.md +127 -0
- data/Rakefile +294 -5
- data/Rakefile.jdbc +20 -0
- data/activerecord-jdbc-adapter.gemspec +55 -0
- data/lib/active_record/connection_adapters/as400_adapter.rb +2 -0
- data/lib/active_record/connection_adapters/db2_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/firebird_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/mariadb_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +1 -0
- data/lib/activerecord-jdbc-adapter.rb +0 -5
- data/lib/arel/visitors/compat.rb +60 -0
- data/lib/arel/visitors/db2.rb +128 -6
- data/lib/arel/visitors/derby.rb +103 -10
- data/lib/arel/visitors/firebird.rb +79 -0
- data/lib/arel/visitors/h2.rb +25 -0
- data/lib/arel/visitors/hsqldb.rb +18 -10
- data/lib/arel/visitors/postgresql_jdbc.rb +6 -0
- data/lib/arel/visitors/sql_server.rb +225 -0
- data/lib/arel/visitors/sql_server/ng42.rb +293 -0
- data/lib/arjdbc.rb +11 -21
- data/lib/arjdbc/abstract/connection_management.rb +35 -0
- data/lib/arjdbc/abstract/core.rb +64 -0
- data/lib/arjdbc/abstract/database_statements.rb +64 -0
- data/lib/arjdbc/abstract/statement_cache.rb +58 -0
- data/lib/arjdbc/abstract/transaction_support.rb +86 -0
- data/lib/arjdbc/db2.rb +3 -1
- data/lib/arjdbc/db2/adapter.rb +630 -250
- data/lib/arjdbc/db2/as400.rb +130 -0
- data/lib/arjdbc/db2/column.rb +167 -0
- data/lib/arjdbc/db2/connection_methods.rb +44 -0
- data/lib/arjdbc/derby.rb +1 -5
- data/lib/arjdbc/derby/active_record_patch.rb +13 -0
- data/lib/arjdbc/derby/adapter.rb +409 -217
- data/lib/arjdbc/derby/connection_methods.rb +16 -14
- data/lib/arjdbc/derby/schema_creation.rb +15 -0
- data/lib/arjdbc/discover.rb +62 -50
- data/lib/arjdbc/firebird.rb +3 -1
- data/lib/arjdbc/firebird/adapter.rb +365 -62
- data/lib/arjdbc/firebird/connection_methods.rb +23 -0
- data/lib/arjdbc/h2.rb +2 -3
- data/lib/arjdbc/h2/adapter.rb +273 -6
- data/lib/arjdbc/h2/connection_methods.rb +23 -8
- data/lib/arjdbc/hsqldb.rb +2 -3
- data/lib/arjdbc/hsqldb/adapter.rb +204 -77
- data/lib/arjdbc/hsqldb/connection_methods.rb +24 -10
- data/lib/arjdbc/hsqldb/explain_support.rb +35 -0
- data/lib/arjdbc/hsqldb/schema_creation.rb +11 -0
- data/lib/arjdbc/informix.rb +4 -2
- data/lib/arjdbc/informix/adapter.rb +78 -54
- data/lib/arjdbc/informix/connection_methods.rb +8 -9
- data/lib/arjdbc/jdbc.rb +59 -2
- data/lib/arjdbc/jdbc/adapter.rb +356 -166
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/adapter_require.rb +46 -0
- data/lib/arjdbc/jdbc/base_ext.rb +15 -0
- data/lib/arjdbc/jdbc/callbacks.rb +27 -18
- data/lib/arjdbc/jdbc/column.rb +79 -20
- data/lib/arjdbc/jdbc/connection.rb +5 -119
- data/lib/arjdbc/jdbc/connection_methods.rb +32 -4
- data/lib/arjdbc/jdbc/error.rb +65 -0
- data/lib/arjdbc/jdbc/extension.rb +41 -29
- data/lib/arjdbc/jdbc/java.rb +5 -6
- data/lib/arjdbc/jdbc/jdbc.rake +3 -126
- data/lib/arjdbc/jdbc/railtie.rb +2 -9
- data/lib/arjdbc/jdbc/rake_tasks.rb +3 -10
- data/lib/arjdbc/jdbc/serialized_attributes_helper.rb +3 -0
- data/lib/arjdbc/jdbc/type_cast.rb +166 -0
- data/lib/arjdbc/jdbc/type_converter.rb +35 -19
- data/lib/arjdbc/mssql.rb +6 -3
- data/lib/arjdbc/mssql/adapter.rb +630 -298
- data/lib/arjdbc/mssql/column.rb +200 -0
- data/lib/arjdbc/mssql/connection_methods.rb +66 -17
- data/lib/arjdbc/mssql/explain_support.rb +99 -0
- data/lib/arjdbc/mssql/limit_helpers.rb +189 -50
- data/lib/arjdbc/mssql/lock_methods.rb +77 -0
- data/lib/arjdbc/mssql/types.rb +343 -0
- data/lib/arjdbc/mssql/utils.rb +82 -0
- data/lib/arjdbc/mysql.rb +2 -3
- data/lib/arjdbc/mysql/adapter.rb +86 -356
- data/lib/arjdbc/mysql/connection_methods.rb +159 -23
- data/lib/arjdbc/oracle/adapter.rb +714 -263
- data/lib/arjdbc/postgresql.rb +2 -3
- data/lib/arjdbc/postgresql/_bc_time_cast_patch.rb +24 -0
- data/lib/arjdbc/postgresql/adapter.rb +570 -400
- 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/array_parser.rb +95 -0
- data/lib/arjdbc/postgresql/base/pgconn.rb +11 -0
- data/lib/arjdbc/postgresql/column.rb +51 -0
- data/lib/arjdbc/postgresql/connection_methods.rb +57 -18
- data/lib/arjdbc/postgresql/name.rb +24 -0
- data/lib/arjdbc/postgresql/oid_types.rb +192 -0
- data/lib/arjdbc/railtie.rb +11 -0
- data/lib/arjdbc/sqlite3.rb +2 -3
- data/lib/arjdbc/sqlite3/adapter.rb +518 -198
- data/lib/arjdbc/sqlite3/connection_methods.rb +49 -24
- data/lib/arjdbc/sybase.rb +2 -2
- data/lib/arjdbc/sybase/adapter.rb +7 -6
- data/lib/arjdbc/tasks.rb +13 -0
- data/lib/arjdbc/tasks/database_tasks.rb +52 -0
- data/lib/arjdbc/tasks/databases.rake +91 -0
- data/lib/arjdbc/tasks/databases3.rake +215 -0
- data/lib/arjdbc/tasks/databases4.rake +39 -0
- data/lib/arjdbc/tasks/db2_database_tasks.rb +104 -0
- data/lib/arjdbc/tasks/derby_database_tasks.rb +95 -0
- data/lib/arjdbc/tasks/h2_database_tasks.rb +31 -0
- data/lib/arjdbc/tasks/hsqldb_database_tasks.rb +70 -0
- data/lib/arjdbc/tasks/jdbc_database_tasks.rb +169 -0
- data/lib/arjdbc/tasks/mssql_database_tasks.rb +46 -0
- data/lib/arjdbc/util/quoted_cache.rb +60 -0
- data/lib/arjdbc/util/serialized_attributes.rb +98 -0
- data/lib/arjdbc/util/table_copier.rb +110 -0
- data/lib/arjdbc/version.rb +1 -6
- data/lib/generators/jdbc/USAGE +9 -0
- data/lib/generators/jdbc/jdbc_generator.rb +8 -0
- data/lib/jdbc_adapter.rb +1 -1
- data/lib/jdbc_adapter/rake_tasks.rb +3 -2
- data/lib/jdbc_adapter/version.rb +2 -1
- data/pom.xml +114 -0
- data/rails_generators/jdbc_generator.rb +1 -1
- data/rails_generators/templates/config/initializers/jdbc.rb +8 -5
- data/rails_generators/templates/lib/tasks/jdbc.rake +7 -4
- data/rakelib/01-tomcat.rake +51 -0
- data/rakelib/02-test.rake +132 -0
- data/rakelib/bundler_ext.rb +11 -0
- data/rakelib/compile.rake +67 -22
- data/rakelib/db.rake +61 -0
- data/rakelib/rails.rake +204 -29
- data/src/java/arjdbc/ArJdbcModule.java +286 -0
- data/src/java/arjdbc/db2/DB2Module.java +76 -0
- data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +126 -0
- data/src/java/arjdbc/derby/DerbyModule.java +99 -243
- data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +152 -0
- data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +174 -0
- data/src/java/arjdbc/{jdbc/JdbcConnectionFactory.java → h2/H2Module.java} +20 -6
- data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +27 -12
- data/src/java/arjdbc/hsqldb/HSQLDBModule.java +73 -0
- data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +7 -6
- data/src/java/arjdbc/jdbc/AdapterJavaService.java +7 -29
- data/src/java/arjdbc/jdbc/Callable.java +44 -0
- data/src/java/arjdbc/jdbc/ConnectionFactory.java +132 -0
- data/src/java/arjdbc/jdbc/DataSourceConnectionFactory.java +157 -0
- data/src/java/arjdbc/jdbc/DriverConnectionFactory.java +63 -0
- data/src/java/arjdbc/jdbc/DriverWrapper.java +119 -0
- data/src/java/arjdbc/jdbc/JdbcResult.java +130 -0
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +3622 -948
- data/src/java/arjdbc/mssql/MSSQLModule.java +90 -0
- data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +181 -0
- data/src/java/arjdbc/mysql/MySQLModule.java +99 -81
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +294 -0
- data/src/java/arjdbc/oracle/OracleModule.java +80 -0
- data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +387 -17
- data/src/java/arjdbc/postgresql/ByteaUtils.java +157 -0
- data/src/java/arjdbc/postgresql/PgResultSetMetaDataWrapper.java +23 -0
- data/src/java/arjdbc/postgresql/PostgreSQLModule.java +77 -0
- data/src/java/arjdbc/postgresql/PostgreSQLResult.java +184 -0
- data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +952 -0
- data/src/java/arjdbc/sqlite3/SQLite3Module.java +73 -0
- data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +525 -0
- data/src/java/arjdbc/util/CallResultSet.java +826 -0
- data/src/java/arjdbc/util/DateTimeUtils.java +580 -0
- data/src/java/arjdbc/util/ObjectSupport.java +65 -0
- data/src/java/arjdbc/util/QuotingUtils.java +138 -0
- data/src/java/arjdbc/util/StringCache.java +63 -0
- data/src/java/arjdbc/util/StringHelper.java +159 -0
- metadata +245 -268
- data/History.txt +0 -369
- data/Manifest.txt +0 -180
- data/README.txt +0 -181
- data/lib/active_record/connection_adapters/oracle_adapter.rb +0 -1
- data/lib/arel/engines/sql/compilers/db2_compiler.rb +0 -9
- data/lib/arel/engines/sql/compilers/derby_compiler.rb +0 -6
- data/lib/arel/engines/sql/compilers/h2_compiler.rb +0 -6
- data/lib/arel/engines/sql/compilers/hsqldb_compiler.rb +0 -15
- data/lib/arel/engines/sql/compilers/jdbc_compiler.rb +0 -6
- data/lib/arel/engines/sql/compilers/mssql_compiler.rb +0 -46
- data/lib/arel/visitors/mssql.rb +0 -44
- data/lib/arjdbc/jdbc/compatibility.rb +0 -51
- data/lib/arjdbc/jdbc/core_ext.rb +0 -24
- data/lib/arjdbc/jdbc/discover.rb +0 -18
- data/lib/arjdbc/jdbc/driver.rb +0 -44
- data/lib/arjdbc/jdbc/missing_functionality_helper.rb +0 -87
- data/lib/arjdbc/jdbc/quoted_primary_key.rb +0 -28
- data/lib/arjdbc/jdbc/require_driver.rb +0 -16
- data/lib/arjdbc/mimer.rb +0 -2
- data/lib/arjdbc/mimer/adapter.rb +0 -142
- data/lib/arjdbc/mssql/tsql_helper.rb +0 -61
- data/lib/arjdbc/oracle.rb +0 -3
- data/lib/arjdbc/oracle/connection_methods.rb +0 -11
- data/lib/pg.rb +0 -4
- data/rakelib/package.rake +0 -92
- data/rakelib/test.rake +0 -81
- data/src/java/arjdbc/jdbc/SQLBlock.java +0 -48
- data/src/java/arjdbc/mssql/MssqlRubyJdbcConnection.java +0 -127
- data/src/java/arjdbc/postgresql/PostgresqlRubyJdbcConnection.java +0 -57
- data/src/java/arjdbc/sqlite3/Sqlite3RubyJdbcConnection.java +0 -64
- data/test/abstract_db_create.rb +0 -117
- data/test/activerecord/connection_adapters/type_conversion_test.rb +0 -31
- data/test/activerecord/connections/native_jdbc_mysql/connection.rb +0 -25
- data/test/db/db2.rb +0 -11
- data/test/db/derby.rb +0 -12
- data/test/db/h2.rb +0 -11
- data/test/db/hsqldb.rb +0 -13
- data/test/db/informix.rb +0 -11
- data/test/db/jdbc.rb +0 -11
- data/test/db/jndi_config.rb +0 -40
- data/test/db/logger.rb +0 -3
- data/test/db/mssql.rb +0 -9
- data/test/db/mysql.rb +0 -10
- data/test/db/oracle.rb +0 -34
- data/test/db/postgres.rb +0 -9
- data/test/db/sqlite3.rb +0 -11
- data/test/db2_simple_test.rb +0 -66
- data/test/derby_migration_test.rb +0 -68
- data/test/derby_multibyte_test.rb +0 -12
- data/test/derby_simple_test.rb +0 -99
- data/test/generic_jdbc_connection_test.rb +0 -29
- data/test/h2_simple_test.rb +0 -41
- data/test/has_many_through.rb +0 -79
- data/test/helper.rb +0 -5
- data/test/hsqldb_simple_test.rb +0 -6
- data/test/informix_simple_test.rb +0 -48
- data/test/jdbc_common.rb +0 -25
- data/test/jndi_callbacks_test.rb +0 -40
- data/test/jndi_test.rb +0 -25
- data/test/manualTestDatabase.rb +0 -191
- data/test/models/add_not_null_column_to_table.rb +0 -12
- data/test/models/auto_id.rb +0 -18
- data/test/models/data_types.rb +0 -28
- data/test/models/entry.rb +0 -43
- data/test/models/mixed_case.rb +0 -25
- data/test/models/reserved_word.rb +0 -18
- data/test/models/string_id.rb +0 -18
- data/test/models/validates_uniqueness_of_string.rb +0 -19
- data/test/mssql_db_create_test.rb +0 -26
- data/test/mssql_identity_insert_test.rb +0 -19
- data/test/mssql_legacy_types_test.rb +0 -58
- data/test/mssql_limit_offset_test.rb +0 -136
- data/test/mssql_multibyte_test.rb +0 -18
- data/test/mssql_simple_test.rb +0 -55
- data/test/mysql_db_create_test.rb +0 -27
- data/test/mysql_info_test.rb +0 -113
- data/test/mysql_multibyte_test.rb +0 -10
- data/test/mysql_nonstandard_primary_key_test.rb +0 -42
- data/test/mysql_simple_test.rb +0 -49
- data/test/oracle_simple_test.rb +0 -18
- data/test/oracle_specific_test.rb +0 -83
- data/test/pick_rails_version.rb +0 -3
- data/test/postgres_db_create_test.rb +0 -32
- data/test/postgres_drop_db_test.rb +0 -16
- data/test/postgres_mixed_case_test.rb +0 -29
- data/test/postgres_nonseq_pkey_test.rb +0 -38
- data/test/postgres_reserved_test.rb +0 -22
- data/test/postgres_schema_search_path_test.rb +0 -44
- data/test/postgres_simple_test.rb +0 -51
- data/test/postgres_table_alias_length_test.rb +0 -15
- data/test/simple.rb +0 -546
- data/test/sqlite3_simple_test.rb +0 -233
- data/test/sybase_jtds_simple_test.rb +0 -28
|
Binary file
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
|
|
3
|
+
if defined? ConnectionAdapters::ConnectionSpecification::Resolver # 4.0
|
|
4
|
+
ConnectionAdapters::ConnectionSpecification::Resolver
|
|
5
|
+
elsif defined? Base::ConnectionSpecification::Resolver # 3.2
|
|
6
|
+
Base::ConnectionSpecification::Resolver
|
|
7
|
+
else class << Base; self; end # 2.3, 3.0, 3.1 :
|
|
8
|
+
# def self.establish_connection ... on ActiveRecord::Base
|
|
9
|
+
end.class_eval do
|
|
10
|
+
|
|
11
|
+
# @private
|
|
12
|
+
def require(path)
|
|
13
|
+
# NOTE: we're inspecting resolver.spec connection resolution which does :
|
|
14
|
+
# `require "active_record/connection_adapters/#{spec[:adapter]}_adapter"`
|
|
15
|
+
# ...
|
|
16
|
+
# this {#require} method is only re-defined on a Resolver object and thus
|
|
17
|
+
# will not hurt performance - it will only be called for a few times (most
|
|
18
|
+
# likely once), this should still be fine for AR < 3.2 where this patch
|
|
19
|
+
# ends up on `class << ActiveRecord::Base` since models usually rely on
|
|
20
|
+
# Rails's auto-loading of (missing) constants and rarely use `require`.
|
|
21
|
+
#
|
|
22
|
+
# other alternative (to make sure we do not need to eager load AR built-in
|
|
23
|
+
# adapters) would be to mingle with the $LOAD_PATH which seems worse ...
|
|
24
|
+
case path
|
|
25
|
+
when 'active_record/connection_adapters/mysql_adapter'
|
|
26
|
+
$LOADED_FEATURES << 'active_record/connection_adapters/mysql_adapter.rb'
|
|
27
|
+
super('arjdbc/mysql')
|
|
28
|
+
when 'active_record/connection_adapters/mysql2_adapter'
|
|
29
|
+
$LOADED_FEATURES << 'active_record/connection_adapters/mysql2_adapter.rb'
|
|
30
|
+
super('arjdbc/mysql')
|
|
31
|
+
when 'active_record/connection_adapters/postgresql_adapter'
|
|
32
|
+
$LOADED_FEATURES << 'active_record/connection_adapters/postgresql_adapter.rb'
|
|
33
|
+
super('arjdbc/postgresql')
|
|
34
|
+
when 'active_record/connection_adapters/sqlite_adapter'
|
|
35
|
+
$LOADED_FEATURES << 'active_record/connection_adapters/sqlite_adapter.rb'
|
|
36
|
+
super('arjdbc/sqlite3')
|
|
37
|
+
when 'active_record/connection_adapters/sqlite3_adapter'
|
|
38
|
+
$LOADED_FEATURES << 'active_record/connection_adapters/sqlite3_adapter.rb'
|
|
39
|
+
super('arjdbc/sqlite3')
|
|
40
|
+
else super
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
class << Base
|
|
3
|
+
m = Module.new do
|
|
4
|
+
# Allow adapters to provide their own {#reset_column_information} method.
|
|
5
|
+
# @note This only affects the current thread's connection.
|
|
6
|
+
def reset_column_information # :nodoc:
|
|
7
|
+
# invoke the adapter-specific reset_column_information method
|
|
8
|
+
connection.reset_column_information if connection.respond_to?(:reset_column_information)
|
|
9
|
+
super
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
self.prepend(m)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
module ActiveRecord
|
|
2
|
-
module
|
|
3
|
-
|
|
1
|
+
module ActiveRecord::ConnectionAdapters
|
|
2
|
+
module Jdbc
|
|
3
|
+
# ActiveRecord connection pool callbacks for JDBC.
|
|
4
|
+
# @see ActiveRecord::ConnectionAdapters::Jdbc::JndiConnectionPoolCallbacks
|
|
5
|
+
module ConnectionPoolCallbacks
|
|
6
|
+
|
|
4
7
|
def self.included(base)
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
base.set_callback :checkin, :after, :on_checkin
|
|
9
|
+
base.set_callback :checkout, :before, :on_checkout
|
|
10
|
+
base.class_eval do
|
|
11
|
+
def self.new(*args)
|
|
12
|
+
adapter = super # extend with JndiConnectionPoolCallbacks if a JNDI connection :
|
|
13
|
+
Jdbc::JndiConnectionPoolCallbacks.prepare(adapter, adapter.instance_variable_get(:@connection))
|
|
14
|
+
adapter
|
|
15
|
+
end
|
|
11
16
|
end
|
|
12
17
|
end
|
|
13
18
|
|
|
14
|
-
def self.needed?
|
|
15
|
-
ActiveRecord::Base.respond_to?(:connection_pool)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
19
|
def on_checkin
|
|
19
20
|
# default implementation does nothing
|
|
20
21
|
end
|
|
@@ -22,13 +23,16 @@ module ActiveRecord
|
|
|
22
23
|
def on_checkout
|
|
23
24
|
# default implementation does nothing
|
|
24
25
|
end
|
|
25
|
-
end
|
|
26
26
|
|
|
27
|
+
end
|
|
28
|
+
# JNDI specific connection pool callbacks that make sure the JNDI connection
|
|
29
|
+
# is disconnected on check-in and looked up (re-connected) on-checkout.
|
|
27
30
|
module JndiConnectionPoolCallbacks
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
|
|
32
|
+
def self.prepare(adapter, connection)
|
|
33
|
+
if adapter.is_a?(ConnectionPoolCallbacks) && connection.jndi?
|
|
34
|
+
adapter.extend self # extend JndiConnectionPoolCallbacks
|
|
35
|
+
connection.disconnect! # if connection.open? - close initial (JNDI) connection
|
|
32
36
|
end
|
|
33
37
|
end
|
|
34
38
|
|
|
@@ -40,5 +44,10 @@ module ActiveRecord
|
|
|
40
44
|
reconnect!
|
|
41
45
|
end
|
|
42
46
|
end
|
|
47
|
+
|
|
43
48
|
end
|
|
49
|
+
# @deprecated use {ActiveRecord::ConnectionAdapters::Jdbc::ConnectionPoolCallbacks}
|
|
50
|
+
JdbcConnectionPoolCallbacks = Jdbc::ConnectionPoolCallbacks
|
|
51
|
+
# @deprecated use {ActiveRecord::ConnectionAdapters::Jdbc::JndiConnectionPoolCallbacks}
|
|
52
|
+
JndiConnectionPoolCallbacks = Jdbc::JndiConnectionPoolCallbacks
|
|
44
53
|
end
|
data/lib/arjdbc/jdbc/column.rb
CHANGED
|
@@ -1,38 +1,97 @@
|
|
|
1
1
|
module ActiveRecord
|
|
2
2
|
module ConnectionAdapters
|
|
3
|
+
module Jdbc
|
|
4
|
+
autoload :TypeCast, 'arjdbc/jdbc/type_cast'
|
|
5
|
+
end
|
|
6
|
+
# The base class for all of {JdbcAdapter}'s returned columns.
|
|
7
|
+
# Instances of {JdbcColumn} will get extended with "column-spec" modules
|
|
8
|
+
# (similar to how {JdbcAdapter} gets spec modules in) if the adapter spec
|
|
9
|
+
# module provided a `column_selector` (matcher) method for it's database
|
|
10
|
+
# specific type.
|
|
11
|
+
# @see JdbcAdapter#jdbc_column_class
|
|
3
12
|
class JdbcColumn < Column
|
|
4
|
-
|
|
13
|
+
# @deprecated attribute writers will be removed in 1.4
|
|
14
|
+
attr_writer :limit, :precision # unless ArJdbc::AR42
|
|
15
|
+
|
|
16
|
+
def initialize(config, name, *args)
|
|
17
|
+
if self.class == JdbcColumn
|
|
18
|
+
# NOTE: extending classes do not want this if they do they shall call
|
|
19
|
+
call_discovered_column_callbacks(config) if config
|
|
20
|
+
default = args.shift
|
|
21
|
+
else # for extending classes allow ignoring first argument :
|
|
22
|
+
if ! config.nil? && ! config.is_a?(Hash)
|
|
23
|
+
default = name; name = config # initialize(name, default, *args)
|
|
24
|
+
else
|
|
25
|
+
default = args.shift
|
|
26
|
+
end
|
|
27
|
+
end
|
|
5
28
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
29
|
+
if ArJdbc::AR50
|
|
30
|
+
default = args[0].cast(default)
|
|
31
|
+
|
|
32
|
+
sql_type = args.delete_at(1)
|
|
33
|
+
type = args.delete_at(0)
|
|
34
|
+
|
|
35
|
+
args.unshift(SqlTypeMetadata.new(:sql_type => sql_type, :type => type))
|
|
36
|
+
elsif ArJdbc::AR42
|
|
37
|
+
default = args[0].type_cast_from_database(default)
|
|
38
|
+
else
|
|
39
|
+
default = default_value(default)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# super <= 4.1: (name, default, sql_type = nil, null = true)
|
|
43
|
+
# super >= 4.2: (name, default, cast_type, sql_type = nil, null = true)
|
|
44
|
+
# super >= 5.0: (name, default, sql_type_metadata = nil, null = true)
|
|
45
|
+
|
|
46
|
+
super(name, default, *args)
|
|
9
47
|
init_column(name, default, *args)
|
|
10
48
|
end
|
|
11
49
|
|
|
12
|
-
|
|
13
|
-
end
|
|
50
|
+
# Additional column initialization for sub-classes.
|
|
51
|
+
def init_column(*args); end
|
|
52
|
+
|
|
53
|
+
# Similar to `ActiveRecord`'s `extract_value_from_default(default)`.
|
|
54
|
+
# @return default value for a column (possibly extracted from driver value)
|
|
55
|
+
def default_value(value); value; end
|
|
14
56
|
|
|
15
|
-
|
|
16
|
-
|
|
57
|
+
protected
|
|
58
|
+
|
|
59
|
+
# @private
|
|
60
|
+
def call_discovered_column_callbacks(config)
|
|
61
|
+
dialect = (config[:dialect] || config[:driver]).to_s
|
|
62
|
+
for matcher, block in self.class.column_types
|
|
63
|
+
block.call(config, self) if matcher === dialect
|
|
64
|
+
end
|
|
17
65
|
end
|
|
18
66
|
|
|
67
|
+
public
|
|
68
|
+
|
|
69
|
+
# Returns the available column types
|
|
70
|
+
# @return [Hash] of (matcher, block) pairs
|
|
19
71
|
def self.column_types
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
72
|
+
types = {}
|
|
73
|
+
for mod in ::ArJdbc.modules
|
|
74
|
+
if mod.respond_to?(:column_selector)
|
|
75
|
+
sel = mod.column_selector # [ matcher, block ]
|
|
76
|
+
types[ sel[0] ] = sel[1]
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
types
|
|
25
80
|
end
|
|
26
81
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
82
|
+
class << self
|
|
83
|
+
|
|
84
|
+
include Jdbc::TypeCast if ::ActiveRecord::VERSION::STRING >= '4.2'
|
|
85
|
+
|
|
86
|
+
if ActiveRecord::VERSION::MAJOR > 3 && ActiveRecord::VERSION::STRING < '4.2'
|
|
87
|
+
|
|
88
|
+
# @private provides compatibility between AR 3.x/4.0 API
|
|
89
|
+
def string_to_date(value); value_to_date(value) end
|
|
90
|
+
|
|
34
91
|
end
|
|
92
|
+
|
|
35
93
|
end
|
|
94
|
+
|
|
36
95
|
end
|
|
37
96
|
end
|
|
38
97
|
end
|
|
@@ -1,128 +1,14 @@
|
|
|
1
1
|
module ActiveRecord
|
|
2
2
|
module ConnectionAdapters
|
|
3
|
+
# JDBC (connection) base class, custom adapters we support likely extend
|
|
4
|
+
# this class. For maximum performance most of this class and the sub-classes
|
|
5
|
+
# we ship are implemented in Java, check: *RubyJdbcConnection.java*
|
|
3
6
|
class JdbcConnection
|
|
4
|
-
module ConfigHelper
|
|
5
|
-
attr_reader :config
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def configure_connection
|
|
12
|
-
config[:retry_count] ||= 5
|
|
13
|
-
config[:connection_alive_sql] ||= "select 1"
|
|
14
|
-
@jndi_connection = false
|
|
15
|
-
@connection = nil
|
|
16
|
-
if config[:jndi]
|
|
17
|
-
begin
|
|
18
|
-
configure_jndi
|
|
19
|
-
rescue => e
|
|
20
|
-
warn "JNDI data source unavailable: #{e.message}; trying straight JDBC"
|
|
21
|
-
configure_jdbc
|
|
22
|
-
end
|
|
23
|
-
else
|
|
24
|
-
configure_jdbc
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def configure_jndi
|
|
29
|
-
jndi = config[:jndi].to_s
|
|
30
|
-
ctx = javax.naming.InitialContext.new
|
|
31
|
-
ds = ctx.lookup(jndi)
|
|
32
|
-
@connection_factory = JdbcConnectionFactory.impl do
|
|
33
|
-
ds.connection
|
|
34
|
-
end
|
|
35
|
-
unless config[:driver]
|
|
36
|
-
config[:driver] = connection.meta_data.connection.java_class.name
|
|
37
|
-
end
|
|
38
|
-
@jndi_connection = true
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def configure_url
|
|
42
|
-
url = config[:url].to_s
|
|
43
|
-
if Hash === config[:options]
|
|
44
|
-
options = ''
|
|
45
|
-
config[:options].each do |k,v|
|
|
46
|
-
options << '&' unless options.empty?
|
|
47
|
-
options << "#{k}=#{v}"
|
|
48
|
-
end
|
|
49
|
-
url = url['?'] ? "#{url}&#{options}" : "#{url}?#{options}" unless options.empty?
|
|
50
|
-
config[:url] = url
|
|
51
|
-
config[:options] = nil
|
|
52
|
-
end
|
|
53
|
-
url
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def configure_jdbc
|
|
57
|
-
unless config[:driver] && config[:url]
|
|
58
|
-
raise ::ActiveRecord::ConnectionNotEstablished, "jdbc adapter requires driver class and url"
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
driver = config[:driver].to_s
|
|
62
|
-
user = config[:username].to_s
|
|
63
|
-
pass = config[:password].to_s
|
|
64
|
-
url = configure_url
|
|
65
|
-
|
|
66
|
-
jdbc_driver = JdbcDriver.new(driver)
|
|
67
|
-
jdbc_driver.load
|
|
68
|
-
@connection_factory = JdbcConnectionFactory.impl do
|
|
69
|
-
jdbc_driver.connection(url, user, pass)
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
attr_reader :adapter, :connection_factory
|
|
75
|
-
|
|
76
|
-
# @native_database_types - setup properly by adapter= versus set_native_database_types.
|
|
77
|
-
# This contains type information for the adapter. Individual adapters can make tweaks
|
|
78
|
-
# by defined modify_types
|
|
79
|
-
#
|
|
80
|
-
# @native_types - This is the default type settings sans any modifications by the
|
|
81
|
-
# individual adapter. My guess is that if we loaded two adapters of different types
|
|
82
|
-
# then this is used as a base to be tweaked by each adapter to create @native_database_types
|
|
83
|
-
|
|
84
|
-
def initialize(config)
|
|
85
|
-
self.config = config
|
|
86
|
-
configure_connection
|
|
87
|
-
connection # force the connection to load
|
|
88
|
-
set_native_database_types
|
|
89
|
-
@stmts = {}
|
|
90
|
-
rescue ::ActiveRecord::ActiveRecordError
|
|
91
|
-
raise
|
|
92
|
-
rescue Exception => e
|
|
93
|
-
raise "The driver encountered an unknown error: #{e}"
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
def adapter=(adapter)
|
|
97
|
-
@adapter = adapter
|
|
98
|
-
@native_database_types = dup_native_types
|
|
99
|
-
@adapter.modify_types(@native_database_types)
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# Duplicate all native types into new hash structure so it can be modified
|
|
103
|
-
# without destroying original structure.
|
|
104
|
-
def dup_native_types
|
|
105
|
-
types = {}
|
|
106
|
-
@native_types.each_pair do |k, v|
|
|
107
|
-
types[k] = v.inject({}) do |memo, kv|
|
|
108
|
-
memo[kv.first] = begin kv.last.dup rescue kv.last end
|
|
109
|
-
memo
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
types
|
|
113
|
-
end
|
|
114
|
-
private :dup_native_types
|
|
115
|
-
|
|
116
|
-
def jndi_connection?
|
|
117
|
-
@jndi_connection
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def active?
|
|
121
|
-
@connection
|
|
8
|
+
def native_database_types
|
|
9
|
+
JdbcTypeConverter.new(supported_data_types).choose_best_types
|
|
122
10
|
end
|
|
123
11
|
|
|
124
|
-
private
|
|
125
|
-
include ConfigHelper
|
|
126
12
|
end
|
|
127
13
|
end
|
|
128
14
|
end
|
|
@@ -1,16 +1,44 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
module ArJdbc
|
|
2
|
+
ConnectionMethods = ::ActiveRecord::ConnectionHandling
|
|
3
|
+
|
|
4
|
+
ConnectionMethods.module_eval do
|
|
5
|
+
|
|
3
6
|
def jdbc_connection(config)
|
|
4
7
|
adapter_class = config[:adapter_class]
|
|
5
8
|
adapter_class ||= ::ActiveRecord::ConnectionAdapters::JdbcAdapter
|
|
6
|
-
|
|
9
|
+
|
|
10
|
+
# Once all adapters converted to AR5 then this rescue can be removed
|
|
11
|
+
begin
|
|
12
|
+
adapter_class.new(nil, logger, nil, config)
|
|
13
|
+
rescue ArgumentError
|
|
14
|
+
adapter_class.new(nil, logger, config)
|
|
15
|
+
end
|
|
7
16
|
end
|
|
8
|
-
|
|
17
|
+
|
|
18
|
+
def jndi_connection(config); jdbc_connection(config) end
|
|
9
19
|
|
|
10
20
|
def embedded_driver(config)
|
|
11
21
|
config[:username] ||= "sa"
|
|
12
22
|
config[:password] ||= ""
|
|
13
23
|
jdbc_connection(config)
|
|
14
24
|
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def jndi_config?(config)
|
|
29
|
+
::ActiveRecord::ConnectionAdapters::JdbcConnection.jndi_config?(config)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @note keeps the same Hash when possible - helps caching on native side
|
|
33
|
+
def symbolize_keys_if_necessary(hash)
|
|
34
|
+
symbolize = false
|
|
35
|
+
hash.each_key do |key|
|
|
36
|
+
if ! key.is_a?(Symbol) && key.respond_to?(:to_sym)
|
|
37
|
+
symbolize = true; break
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
symbolize ? hash.symbolize_keys : hash
|
|
41
|
+
end
|
|
42
|
+
|
|
15
43
|
end
|
|
16
44
|
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
# Represents exceptions that have propagated up through the JDBC API.
|
|
3
|
+
class JDBCError < WrappedDatabaseException
|
|
4
|
+
|
|
5
|
+
def initialize(message = nil, cause = $!)
|
|
6
|
+
super( ( message.nil? && cause ) ? cause.message : message, nil )
|
|
7
|
+
if cause.is_a? Java::JavaSql::SQLException
|
|
8
|
+
@jdbc_exception, @cause = cause, nil
|
|
9
|
+
else
|
|
10
|
+
@cause, @jdbc_exception = cause, nil
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# The DB (or JDBC driver implementation specific) vendor error code.
|
|
15
|
+
# @see #jdbc_exception
|
|
16
|
+
# @return [Integer, NilClass]
|
|
17
|
+
def error_code
|
|
18
|
+
if ( @error_code ||= nil ).nil?
|
|
19
|
+
@error_code = jdbc_exception ? jdbc_exception.getErrorCode : nil
|
|
20
|
+
else
|
|
21
|
+
@error_code
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
# @deprecated
|
|
25
|
+
# @see #error_code
|
|
26
|
+
def errno; error_code end
|
|
27
|
+
|
|
28
|
+
# SQL code as standardized by ISO/ANSI and Open Group (X/Open), although
|
|
29
|
+
# some codes have been reserved for DB vendors to define for themselves.
|
|
30
|
+
# @see #jdbc_exception
|
|
31
|
+
# @return [String, NilClass]
|
|
32
|
+
def sql_state; jdbc_exception ? jdbc_exception.getSQLState : nil end
|
|
33
|
+
|
|
34
|
+
# The full Java exception (SQLException) object that was raised (if any).
|
|
35
|
+
# @note Navigate through chained exceptions using `jdbc_exception.next_exception`.
|
|
36
|
+
def jdbc_exception; @jdbc_exception end
|
|
37
|
+
alias_method :sql_exception, :jdbc_exception
|
|
38
|
+
|
|
39
|
+
# true if the current error might be recovered e.g. by re-trying the transaction
|
|
40
|
+
def recoverable?; jdbc_exception.is_a?(Java::JavaSql::SQLRecoverableException) end
|
|
41
|
+
# true when a failed operation might be able to succeed when retried (e.g. timeouts)
|
|
42
|
+
def transient?; jdbc_exception.is_a?(Java::JavaSql::SQLTransientException) end
|
|
43
|
+
|
|
44
|
+
# Likely (but not necessarily) the same as {#jdbc_exception}.
|
|
45
|
+
def cause; ( @cause ||= nil ) || jdbc_exception end
|
|
46
|
+
# @override
|
|
47
|
+
# @private for correct super-class (StatementInvalid) compatibility
|
|
48
|
+
alias_method :original_exception, :cause
|
|
49
|
+
|
|
50
|
+
# @override
|
|
51
|
+
def set_backtrace(backtrace)
|
|
52
|
+
@raw_backtrace = backtrace
|
|
53
|
+
if ( nested = cause ) && ! nested.equal?(self)
|
|
54
|
+
backtrace = backtrace - ( nested.respond_to?(:raw_backtrace) ? nested.raw_backtrace : nested.backtrace )
|
|
55
|
+
backtrace << "#{nested.backtrace.first}: #{nested.message} (#{nested.class.name})"
|
|
56
|
+
backtrace.concat nested.backtrace[1..-1] || []
|
|
57
|
+
end
|
|
58
|
+
super(backtrace)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# @private
|
|
62
|
+
def raw_backtrace; @raw_backtrace ||= backtrace end
|
|
63
|
+
|
|
64
|
+
end
|
|
65
|
+
end
|