activerecord-jdbc-adapter 1.3.0.beta1 → 1.3.0.beta2
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.
- data/.gitignore +12 -11
- data/.travis.yml +36 -7
- data/Appraisals +3 -3
- data/Gemfile +1 -1
- data/Gemfile.lock +13 -6
- data/History.txt +64 -0
- data/README.md +8 -1
- data/Rakefile +3 -1
- data/gemfiles/rails23.gemfile +1 -1
- data/gemfiles/rails23.gemfile.lock +6 -5
- data/gemfiles/rails30.gemfile +1 -1
- data/gemfiles/rails30.gemfile.lock +7 -6
- data/gemfiles/rails31.gemfile +1 -1
- data/gemfiles/rails31.gemfile.lock +6 -5
- data/gemfiles/rails32.gemfile +1 -1
- data/gemfiles/rails32.gemfile.lock +6 -5
- data/gemfiles/rails40.gemfile +2 -4
- data/gemfiles/rails40.gemfile.lock +37 -51
- data/lib/active_record/connection_adapters/as400_adapter.rb +2 -0
- data/lib/active_record/connection_adapters/db2_adapter.rb +1 -1
- data/lib/arel/visitors/db2.rb +5 -1
- data/lib/arel/visitors/hsqldb.rb +1 -0
- data/lib/arel/visitors/sql_server.rb +55 -13
- data/lib/arjdbc/db2/adapter.rb +197 -227
- data/lib/arjdbc/db2/as400.rb +124 -0
- data/lib/arjdbc/db2/connection_methods.rb +20 -1
- data/lib/arjdbc/derby/adapter.rb +17 -85
- data/lib/arjdbc/derby/connection_methods.rb +2 -1
- data/lib/arjdbc/discover.rb +55 -47
- data/lib/arjdbc/h2/adapter.rb +52 -18
- data/lib/arjdbc/h2/connection_methods.rb +10 -2
- data/lib/arjdbc/hsqldb/adapter.rb +33 -9
- data/lib/arjdbc/hsqldb/connection_methods.rb +10 -2
- data/lib/arjdbc/informix.rb +2 -1
- data/lib/arjdbc/jdbc.rb +5 -1
- data/lib/arjdbc/jdbc/adapter.rb +167 -89
- 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 +25 -3
- data/lib/arjdbc/jdbc/callbacks.rb +9 -8
- data/lib/arjdbc/jdbc/column.rb +8 -20
- data/lib/arjdbc/jdbc/connection.rb +69 -80
- data/lib/arjdbc/jdbc/extension.rb +6 -8
- data/lib/arjdbc/jdbc/jdbc.rake +3 -141
- data/lib/arjdbc/jdbc/rake_tasks.rb +3 -10
- data/lib/arjdbc/mssql/adapter.rb +108 -34
- data/lib/arjdbc/mssql/connection_methods.rb +3 -1
- data/lib/arjdbc/mssql/limit_helpers.rb +3 -2
- data/lib/arjdbc/mssql/lock_helpers.rb +5 -1
- data/lib/arjdbc/mysql/adapter.rb +127 -70
- data/lib/arjdbc/mysql/connection_methods.rb +5 -2
- data/lib/arjdbc/oracle/adapter.rb +124 -94
- data/lib/arjdbc/oracle/connection_methods.rb +2 -1
- data/lib/arjdbc/postgresql/adapter.rb +99 -67
- data/lib/arjdbc/postgresql/column_cast.rb +3 -5
- data/lib/arjdbc/postgresql/connection_methods.rb +6 -6
- data/lib/arjdbc/railtie.rb +3 -1
- data/lib/arjdbc/sqlite3/adapter.rb +60 -43
- data/lib/arjdbc/sqlite3/connection_methods.rb +9 -9
- data/lib/arjdbc/sybase.rb +1 -1
- data/lib/arjdbc/tasks.rb +13 -0
- data/lib/arjdbc/tasks/database_tasks.rb +50 -0
- data/lib/arjdbc/tasks/databases.rake +89 -0
- data/lib/arjdbc/tasks/databases3.rake +203 -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 +29 -0
- data/lib/arjdbc/tasks/hsqldb_database_tasks.rb +70 -0
- data/lib/arjdbc/tasks/jdbc_database_tasks.rb +122 -0
- data/lib/arjdbc/tasks/mssql_database_tasks.rb +36 -0
- data/lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb +297 -0
- data/lib/arjdbc/tasks/oracle_database_tasks.rb +62 -0
- data/lib/arjdbc/version.rb +1 -1
- data/pom.xml +11 -12
- 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/02-test.rake +42 -15
- data/rakelib/compile.rake +29 -2
- data/rakelib/db.rake +2 -1
- data/rakelib/rails.rake +23 -6
- data/src/java/arjdbc/ArJdbcModule.java +175 -0
- data/src/java/arjdbc/db2/DB2Module.java +2 -1
- data/src/java/arjdbc/derby/DerbyModule.java +5 -24
- data/src/java/arjdbc/hsqldb/HSQLDBModule.java +3 -2
- data/src/java/arjdbc/jdbc/AdapterJavaService.java +3 -46
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +1001 -259
- data/src/java/arjdbc/mssql/MSSQLModule.java +2 -1
- data/src/java/arjdbc/mysql/MySQLModule.java +4 -3
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +12 -7
- data/src/java/arjdbc/oracle/OracleModule.java +2 -1
- data/src/java/arjdbc/sqlite3/SQLite3Module.java +2 -1
- data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +12 -0
- data/test/db/db2.rb +14 -7
- data/test/db/db2/rake_test.rb +82 -0
- data/test/db/db2/rake_test_data.sql +35 -0
- data/test/db/db2/simple_test.rb +20 -0
- data/test/db/db2/unit_test.rb +3 -1
- data/test/db/derby.rb +7 -5
- data/test/db/derby/rake_test.rb +96 -0
- data/test/db/derby/simple_test.rb +10 -2
- data/test/db/h2.rb +6 -8
- data/test/db/h2/identity_column_test.rb +35 -0
- data/test/db/h2/offset_test.rb +49 -0
- data/test/db/h2/rake_test.rb +98 -0
- data/test/db/h2/schema_dump_test.rb +5 -1
- data/test/db/hsqldb.rb +6 -10
- data/test/db/hsqldb/rake_test.rb +101 -0
- data/test/db/hsqldb/schema_dump_test.rb +5 -1
- data/test/db/hsqldb/simple_test.rb +8 -0
- data/test/db/jndi_config.rb +1 -3
- data/test/db/jndi_pooled_config.rb +1 -3
- data/test/db/mssql/limit_offset_test.rb +23 -14
- data/test/db/mssql/rake_test.rb +143 -0
- data/test/db/mysql/_rails_test_mysql.32.out +1069 -1252
- data/test/db/mysql/nonstandard_primary_key_test.rb +21 -24
- data/test/db/mysql/rake_test.rb +97 -0
- data/test/db/mysql/schema_dump_test.rb +11 -11
- data/test/db/mysql/simple_test.rb +52 -3
- data/test/db/mysql/statement_escaping_test.rb +46 -0
- data/test/db/oracle/rake_test.rb +100 -0
- data/test/db/oracle/simple_test.rb +48 -0
- data/test/db/postgres/_rails_test_postgres.32.out +998 -1370
- data/test/db/postgres/active_schema_unit_test.rb +68 -0
- data/test/db/postgres/connection_test.rb +10 -2
- data/test/db/postgres/data_types_test.rb +2 -2
- data/test/db/postgres/ltree_test.rb +6 -5
- data/test/db/postgres/native_types_test.rb +1 -5
- data/test/db/postgres/rake_test.rb +117 -0
- data/test/db/postgres/schema_dump_test.rb +9 -2
- data/test/db/postgres/schema_test.rb +4 -2
- data/test/db/postgres/simple_test.rb +57 -16
- data/test/db/sqlite3.rb +3 -10
- data/test/db/sqlite3/_rails_test_sqlite3.32.out +1070 -1298
- data/test/db/sqlite3/rake_test.rb +71 -0
- data/test/db/sqlite3/simple_test.rb +9 -9
- data/test/has_many_through.rb +4 -1
- data/test/jdbc/db2.rb +14 -1
- data/test/jdbc_column_test.rb +23 -0
- data/test/{generic_jdbc_connection_test.rb → jdbc_connection_test.rb} +22 -17
- data/test/jndi_callbacks_test.rb +26 -28
- data/test/jndi_test.rb +7 -16
- data/test/models/data_types.rb +2 -1
- data/test/models/thing.rb +1 -0
- data/test/rails/mysql.rb +13 -0
- data/test/rails/sqlite3/version.rb +6 -0
- data/test/rails_stub.rb +31 -0
- data/test/rake_test_support.rb +298 -0
- data/test/serialize.rb +2 -4
- data/test/{helper.rb → shared_helper.rb} +0 -0
- data/test/simple.rb +167 -93
- data/test/test_helper.rb +52 -16
- metadata +388 -354
- data/lib/pg.rb +0 -26
- data/test/abstract_db_create.rb +0 -139
- data/test/activerecord/connection_adapters/type_conversion_test.rb +0 -36
- data/test/db/mssql/db_create_test.rb +0 -29
- data/test/db/mysql/db_create_test.rb +0 -33
- data/test/db/postgres/db_create_test.rb +0 -44
- data/test/db/postgres/db_drop_test.rb +0 -17
|
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
|
+
def require(path)
|
|
12
|
+
# NOTE: we're inspecting resolver.spec connection resolution which does :
|
|
13
|
+
# `require "active_record/connection_adapters/#{spec[:adapter]}_adapter"`
|
|
14
|
+
# ...
|
|
15
|
+
# this {#require} method is only re-defined on a Resolver object and thus
|
|
16
|
+
# will not hurt performance - it will only be called for a few times (most
|
|
17
|
+
# likely once), this should still be fine for AR < 3.2 where this patch
|
|
18
|
+
# ends up on `class << ActiveRecord::Base` since models usually rely on
|
|
19
|
+
# Rails's auto-loading of (missing) constants and rarely use `require`.
|
|
20
|
+
#
|
|
21
|
+
# other alternative (to make sure we do not need to eager load AR built-in
|
|
22
|
+
# adapters) would be to mingle with the $LOAD_PATH which seems worse ...
|
|
23
|
+
case path
|
|
24
|
+
when 'active_record/connection_adapters/mysql_adapter'
|
|
25
|
+
$LOADED_FEATURES << 'active_record/connection_adapters/mysql_adapter.rb'
|
|
26
|
+
super('arjdbc/mysql')
|
|
27
|
+
when 'active_record/connection_adapters/mysql2_adapter'
|
|
28
|
+
$LOADED_FEATURES << 'active_record/connection_adapters/mysql2_adapter.rb'
|
|
29
|
+
super('arjdbc/mysql')
|
|
30
|
+
when 'active_record/connection_adapters/postgresql_adapter'
|
|
31
|
+
$LOADED_FEATURES << 'active_record/connection_adapters/postgresql_adapter.rb'
|
|
32
|
+
super('arjdbc/postgresql')
|
|
33
|
+
when 'active_record/connection_adapters/sqlite_adapter'
|
|
34
|
+
$LOADED_FEATURES << 'active_record/connection_adapters/sqlite_adapter.rb'
|
|
35
|
+
super('arjdbc/sqlite3')
|
|
36
|
+
when 'active_record/connection_adapters/sqlite3_adapter'
|
|
37
|
+
$LOADED_FEATURES << 'active_record/connection_adapters/sqlite3_adapter.rb'
|
|
38
|
+
super('arjdbc/sqlite3')
|
|
39
|
+
else super
|
|
40
|
+
end
|
|
41
|
+
super
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
data/lib/arjdbc/jdbc/base_ext.rb
CHANGED
|
@@ -4,7 +4,7 @@ module ActiveRecord
|
|
|
4
4
|
class << self
|
|
5
5
|
# Allow adapters to provide their own {#reset_column_information} method.
|
|
6
6
|
# @note This only affects the current thread's connection.
|
|
7
|
-
def reset_column_information_with_arjdbc
|
|
7
|
+
def reset_column_information_with_arjdbc # :nodoc:
|
|
8
8
|
# invoke the adapter-specific reset_column_information method
|
|
9
9
|
connection.reset_column_information if connection.respond_to?(:reset_column_information)
|
|
10
10
|
reset_column_information_without_arjdbc
|
|
@@ -17,14 +17,36 @@ module ActiveRecord
|
|
|
17
17
|
|
|
18
18
|
# Represents exceptions that have propagated up through the JDBC API.
|
|
19
19
|
class JDBCError < ActiveRecordError
|
|
20
|
-
# The vendor code or error number that came from the database
|
|
20
|
+
# The vendor code or error number that came from the database.
|
|
21
|
+
# @note writer being used by the Java API
|
|
21
22
|
attr_accessor :errno
|
|
22
23
|
# The full Java SQLException object that was raised.
|
|
24
|
+
# @note writer being used by the Java API
|
|
23
25
|
attr_accessor :sql_exception
|
|
26
|
+
|
|
27
|
+
attr_reader :original_exception, :raw_backtrace
|
|
28
|
+
|
|
29
|
+
def initialize(message = nil, original_exception = nil) # $!
|
|
30
|
+
super(message)
|
|
31
|
+
@original_exception = original_exception
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def set_backtrace(backtrace)
|
|
35
|
+
@raw_backtrace = backtrace
|
|
36
|
+
if nested = original_exception
|
|
37
|
+
backtrace = backtrace - (
|
|
38
|
+
nested.respond_to?(:raw_backtrace) ? nested.raw_backtrace : nested.backtrace )
|
|
39
|
+
backtrace << "#{nested.backtrace.first}: #{nested.message} (#{nested.class.name})"
|
|
40
|
+
backtrace += nested.backtrace[1..-1] || []
|
|
41
|
+
end
|
|
42
|
+
super(backtrace)
|
|
43
|
+
end
|
|
44
|
+
|
|
24
45
|
end
|
|
25
46
|
|
|
26
47
|
module ConnectionAdapters # :nodoc:
|
|
27
|
-
# Allows properly re-defining methods that may already be
|
|
48
|
+
# Allows properly re-defining methods that may already be alias-chain-ed.
|
|
49
|
+
# Query caching works even with overriden alias_method_chain'd methods.
|
|
28
50
|
module ShadowCoreMethods
|
|
29
51
|
def alias_chained_method(name, feature, target)
|
|
30
52
|
# NOTE: aliasing for things such as columns (with feature query_cache)
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
module ActiveRecord
|
|
2
2
|
module ConnectionAdapters
|
|
3
|
+
|
|
3
4
|
module JdbcConnectionPoolCallbacks
|
|
5
|
+
|
|
4
6
|
def self.included(base)
|
|
5
7
|
if base.respond_to?(:set_callback) # Rails 3 callbacks
|
|
6
8
|
base.set_callback :checkin, :after, :on_checkin
|
|
@@ -11,10 +13,6 @@ module ActiveRecord
|
|
|
11
13
|
end
|
|
12
14
|
end
|
|
13
15
|
|
|
14
|
-
def self.needed?
|
|
15
|
-
ActiveRecord::Base.respond_to?(:connection_pool)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
16
|
def on_checkin
|
|
19
17
|
# default implementation does nothing
|
|
20
18
|
end
|
|
@@ -22,13 +20,15 @@ module ActiveRecord
|
|
|
22
20
|
def on_checkout
|
|
23
21
|
# default implementation does nothing
|
|
24
22
|
end
|
|
23
|
+
|
|
25
24
|
end
|
|
26
25
|
|
|
27
26
|
module JndiConnectionPoolCallbacks
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
|
|
28
|
+
def self.prepare(adapter, connection)
|
|
29
|
+
if adapter.is_a?(JdbcConnectionPoolCallbacks) && connection.jndi?
|
|
30
|
+
adapter.extend self # extend JndiConnectionPoolCallbacks
|
|
31
|
+
connection.disconnect! # disconnect initial (JNDI) connection if any
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
|
|
@@ -40,5 +40,6 @@ module ActiveRecord
|
|
|
40
40
|
reconnect!
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
|
+
|
|
43
44
|
end
|
|
44
45
|
end
|
data/lib/arjdbc/jdbc/column.rb
CHANGED
|
@@ -36,28 +36,16 @@ module ActiveRecord
|
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
public
|
|
39
|
-
|
|
39
|
+
|
|
40
40
|
def self.column_types
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
types = {}
|
|
42
|
+
for mod in ::ArJdbc.modules
|
|
43
|
+
if mod.respond_to?(:column_selector)
|
|
44
|
+
sel = mod.column_selector # [ matcher, block ]
|
|
45
|
+
types[ sel[0] ] = sel[1]
|
|
46
|
+
end
|
|
46
47
|
end
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
def self.driver_constants
|
|
50
|
-
reset_constants
|
|
51
|
-
@driver_constants ||= ::ArJdbc.constants.map { |c| ::ArJdbc.const_get c }
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def self.reset_constants!
|
|
55
|
-
@driver_constants = nil; @column_types = nil
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def self.reset_constants
|
|
59
|
-
return false if ! defined?(@driver_constants) || ! @driver_constants
|
|
60
|
-
reset_constants! if ::ArJdbc.constants.size != @driver_constants.size
|
|
48
|
+
types
|
|
61
49
|
end
|
|
62
50
|
|
|
63
51
|
end
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
module ActiveRecord
|
|
2
2
|
module ConnectionAdapters
|
|
3
|
+
# @note this class is mostly implemented in Java: *RubyJdbcConnection.java*
|
|
3
4
|
class JdbcConnection
|
|
4
5
|
|
|
5
|
-
attr_reader :adapter, :connection_factory
|
|
6
|
-
|
|
7
6
|
# @native_database_types - setup properly by adapter= versus set_native_database_types.
|
|
8
7
|
# This contains type information for the adapter. Individual adapters can make tweaks
|
|
9
8
|
# by defined modify_types
|
|
@@ -14,12 +13,11 @@ module ActiveRecord
|
|
|
14
13
|
|
|
15
14
|
def initialize(config)
|
|
16
15
|
self.config = config
|
|
17
|
-
@connection = nil
|
|
18
|
-
@
|
|
19
|
-
|
|
20
|
-
connection # force
|
|
21
|
-
set_native_database_types
|
|
22
|
-
@stmts = {} # AR compatibility - statement cache not used
|
|
16
|
+
@connection = nil; @jndi = nil
|
|
17
|
+
# @stmts = {} # AR compatibility - statement cache not used
|
|
18
|
+
setup_connection_factory
|
|
19
|
+
connection # force connection to load (@see RubyJdbcConnection.connection)
|
|
20
|
+
set_native_database_types # so we can set the native types
|
|
23
21
|
rescue Java::JavaSql::SQLException => e
|
|
24
22
|
e = e.cause if defined?(NativeException) && e.is_a?(NativeException) # JRuby-1.6.8
|
|
25
23
|
error = e.getMessage || e.getSQLState
|
|
@@ -30,22 +28,15 @@ module ActiveRecord
|
|
|
30
28
|
raise error
|
|
31
29
|
end
|
|
32
30
|
|
|
33
|
-
|
|
34
|
-
@jndi_connection == true
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def active?
|
|
38
|
-
!! @connection
|
|
39
|
-
end
|
|
31
|
+
attr_reader :connection_factory, :adapter, :config
|
|
40
32
|
|
|
33
|
+
# @see ActiveRecord::ConnectionAdapters::JdbcAdapter#initialize
|
|
41
34
|
def adapter=(adapter)
|
|
42
35
|
@adapter = adapter
|
|
43
36
|
@native_database_types = dup_native_types
|
|
44
37
|
@adapter.modify_types(@native_database_types)
|
|
45
38
|
@adapter.config.replace(config)
|
|
46
39
|
end
|
|
47
|
-
|
|
48
|
-
private
|
|
49
40
|
|
|
50
41
|
# Duplicate all native types into new hash structure so it can be modified
|
|
51
42
|
# without destroying original structure.
|
|
@@ -60,80 +51,78 @@ module ActiveRecord
|
|
|
60
51
|
end
|
|
61
52
|
types
|
|
62
53
|
end
|
|
54
|
+
private :dup_native_types
|
|
63
55
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
# @see #configure_jndi
|
|
75
|
-
#
|
|
76
|
-
# @note this has nothing to do with the configure_connection implemented
|
|
77
|
-
# on some of the concrete adapters (e.g. {#ArJdbc::Postgres})
|
|
78
|
-
def configure_connection
|
|
79
|
-
config[:retry_count] ||= 5
|
|
80
|
-
config[:connection_alive_sql] ||= "select 1"
|
|
81
|
-
if config[:jndi]
|
|
82
|
-
begin
|
|
83
|
-
configure_jndi
|
|
84
|
-
rescue => e
|
|
85
|
-
warn "JNDI data source unavailable: #{e.message}; trying straight JDBC"
|
|
86
|
-
configure_jdbc
|
|
87
|
-
end
|
|
88
|
-
else
|
|
89
|
-
configure_jdbc
|
|
90
|
-
end
|
|
91
|
-
end
|
|
56
|
+
def config=(config)
|
|
57
|
+
@config = config.symbolize_keys
|
|
58
|
+
# NOTE: JDBC 4.0 drivers support checking if connection isValid
|
|
59
|
+
# thus no need to @config[:connection_alive_sql] ||= 'SELECT 1'
|
|
60
|
+
@config[:retry_count] ||= 5
|
|
61
|
+
@config
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def jndi?; @jndi; end
|
|
65
|
+
alias_method :jndi_connection?, :jndi?
|
|
92
66
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
67
|
+
# Sets the connection factory from the available configuration.
|
|
68
|
+
# @see #setup_jdbc_factory
|
|
69
|
+
# @see #setup_jndi_factory
|
|
70
|
+
#
|
|
71
|
+
# @note this has nothing to do with the configure_connection implemented
|
|
72
|
+
# on some of the concrete adapters (e.g. {#ArJdbc::Postgres})
|
|
73
|
+
def setup_connection_factory
|
|
74
|
+
if config[:jndi] || config[:data_source]
|
|
75
|
+
begin
|
|
76
|
+
setup_jndi_factory
|
|
77
|
+
rescue => e
|
|
78
|
+
warn "JNDI data source unavailable: #{e.message}; trying straight JDBC"
|
|
79
|
+
setup_jdbc_factory
|
|
98
80
|
end
|
|
81
|
+
else
|
|
82
|
+
setup_jdbc_factory
|
|
99
83
|
end
|
|
84
|
+
end
|
|
100
85
|
|
|
101
|
-
|
|
102
|
-
if ! config[:url] || ( ! config[:driver] && ! config[:driver_instance] )
|
|
103
|
-
raise ::ActiveRecord::ConnectionNotEstablished, "jdbc adapter requires :driver class and :url"
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
url = configure_url
|
|
107
|
-
username = config[:username].to_s
|
|
108
|
-
password = config[:password].to_s
|
|
109
|
-
jdbc_driver = ( config[:driver_instance] ||=
|
|
110
|
-
JdbcDriver.new(config[:driver].to_s, config[:properties]) )
|
|
86
|
+
protected
|
|
111
87
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
88
|
+
def setup_jndi_factory
|
|
89
|
+
data_source = config[:data_source] ||
|
|
90
|
+
Java::JavaxNaming::InitialContext.new.lookup(config[:jndi].to_s)
|
|
91
|
+
|
|
92
|
+
@jndi = true
|
|
93
|
+
@connection_factory = JdbcConnectionFactory.impl do
|
|
94
|
+
data_source.connection
|
|
115
95
|
end
|
|
96
|
+
end
|
|
116
97
|
|
|
117
|
-
|
|
98
|
+
def setup_jdbc_factory
|
|
99
|
+
if ! config[:url] || ( ! config[:driver] && ! config[:driver_instance] )
|
|
100
|
+
raise ::ActiveRecord::ConnectionNotEstablished, "jdbc adapter requires :driver class and :url"
|
|
101
|
+
end
|
|
118
102
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
config[:
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
config[:url] = url
|
|
129
|
-
config[:options] = nil
|
|
130
|
-
end
|
|
131
|
-
url
|
|
103
|
+
url = jdbc_url
|
|
104
|
+
username = config[:username].to_s
|
|
105
|
+
password = config[:password].to_s
|
|
106
|
+
jdbc_driver = ( config[:driver_instance] ||=
|
|
107
|
+
JdbcDriver.new(config[:driver].to_s, config[:properties]) )
|
|
108
|
+
|
|
109
|
+
@jndi = false
|
|
110
|
+
@connection_factory = JdbcConnectionFactory.impl do
|
|
111
|
+
jdbc_driver.connection(url, username, password)
|
|
132
112
|
end
|
|
113
|
+
end
|
|
133
114
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
115
|
+
private
|
|
116
|
+
|
|
117
|
+
def jdbc_url
|
|
118
|
+
url = config[:url].to_s
|
|
119
|
+
if Hash === config[:options]
|
|
120
|
+
options = config[:options].map { |key, val| "#{key}=#{val}" }.join('&')
|
|
121
|
+
url = url['?'] ? "#{url}&#{options}" : "#{url}?#{options}" unless options.empty?
|
|
122
|
+
config[:url] = url; config[:options] = nil
|
|
123
|
+
end
|
|
124
|
+
url
|
|
125
|
+
end
|
|
137
126
|
|
|
138
127
|
end
|
|
139
128
|
end
|
|
@@ -30,16 +30,14 @@ module ArJdbc
|
|
|
30
30
|
mod = const_set(name, Module.new)
|
|
31
31
|
end
|
|
32
32
|
(class << mod; self; end).instance_eval do
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
block.call(_name, config) ? mod : false
|
|
39
|
-
end
|
|
33
|
+
define_method :adapter_matcher do |_name, config|
|
|
34
|
+
if block.arity == 1
|
|
35
|
+
block.call(_name) ? mod : false
|
|
36
|
+
else
|
|
37
|
+
block.call(_name, config) ? mod : false
|
|
40
38
|
end
|
|
41
39
|
end
|
|
42
|
-
end
|
|
40
|
+
end unless mod.respond_to?(:adapter_matcher)
|
|
43
41
|
end
|
|
44
42
|
|
|
45
43
|
private
|
data/lib/arjdbc/jdbc/jdbc.rake
CHANGED
|
@@ -1,141 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
if existing_task
|
|
5
|
-
class << existing_task
|
|
6
|
-
public :instance_variable_set
|
|
7
|
-
attr_reader :actions
|
|
8
|
-
end
|
|
9
|
-
existing_task.instance_variable_set "@prerequisites", FileList[]
|
|
10
|
-
existing_task.actions.shift
|
|
11
|
-
enhancements = existing_task.actions
|
|
12
|
-
existing_task.instance_variable_set "@actions", []
|
|
13
|
-
end
|
|
14
|
-
redefined_task = task(*args, &block)
|
|
15
|
-
enhancements.each {|enhancement| redefined_task.actions << enhancement} unless enhancements.nil?
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def rails_env
|
|
19
|
-
defined?(Rails.env) ? Rails.env : RAILS_ENV
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
namespace :db do
|
|
23
|
-
redefine_task :create => :rails_env do
|
|
24
|
-
create_database(ActiveRecord::Base.configurations[rails_env])
|
|
25
|
-
end
|
|
26
|
-
task :create => :load_config if Rake.application.lookup(:load_config)
|
|
27
|
-
|
|
28
|
-
redefine_task :drop => :environment do
|
|
29
|
-
config = ActiveRecord::Base.configurations[rails_env]
|
|
30
|
-
begin
|
|
31
|
-
db = find_database_name(config)
|
|
32
|
-
ActiveRecord::Base.connection.drop_database(db)
|
|
33
|
-
rescue
|
|
34
|
-
drop_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
task :drop => :load_config if Rake.application.lookup(:load_config)
|
|
38
|
-
|
|
39
|
-
namespace :create do
|
|
40
|
-
task :all => :rails_env
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
namespace :drop do
|
|
44
|
-
task :all => :environment
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
class << self
|
|
48
|
-
alias_method :previous_create_database, :create_database
|
|
49
|
-
alias_method :previous_drop_database, :drop_database
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def find_database_name(config)
|
|
53
|
-
db = config['database']
|
|
54
|
-
if config['adapter'] =~ /postgresql/i
|
|
55
|
-
config = config.dup
|
|
56
|
-
if config['url']
|
|
57
|
-
url = config['url'].dup
|
|
58
|
-
db = url[/\/([^\/]*)$/, 1]
|
|
59
|
-
if db
|
|
60
|
-
url[/\/([^\/]*)$/, 1] = 'postgres'
|
|
61
|
-
config['url'] = url
|
|
62
|
-
end
|
|
63
|
-
else
|
|
64
|
-
db = config['database']
|
|
65
|
-
config['database'] = 'postgres'
|
|
66
|
-
end
|
|
67
|
-
ActiveRecord::Base.establish_connection(config)
|
|
68
|
-
else
|
|
69
|
-
ActiveRecord::Base.establish_connection(config)
|
|
70
|
-
db = ActiveRecord::Base.connection.database_name
|
|
71
|
-
end
|
|
72
|
-
db
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def create_database(config)
|
|
76
|
-
begin
|
|
77
|
-
ActiveRecord::Base.establish_connection(config)
|
|
78
|
-
ActiveRecord::Base.connection
|
|
79
|
-
rescue
|
|
80
|
-
begin
|
|
81
|
-
if url = config['url'] and url =~ /^(.*(?<!\/)\/)(?=\w)/
|
|
82
|
-
url = $1
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
ActiveRecord::Base.establish_connection(config.merge({'database' => nil, 'url' => url}))
|
|
86
|
-
ActiveRecord::Base.connection.create_database(config['database'], config)
|
|
87
|
-
ActiveRecord::Base.establish_connection(config)
|
|
88
|
-
rescue => e
|
|
89
|
-
raise e unless config['adapter'] =~ /mysql|postgresql|sqlite/
|
|
90
|
-
previous_create_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def drop_database(config)
|
|
96
|
-
previous_drop_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
namespace :structure do
|
|
100
|
-
redefine_task :dump => :environment do
|
|
101
|
-
abcs = ActiveRecord::Base.configurations
|
|
102
|
-
ActiveRecord::Base.establish_connection(abcs[rails_env])
|
|
103
|
-
filename = ENV['DB_STRUCTURE'] || "db/#{rails_env}_structure.sql"
|
|
104
|
-
File.open(filename, "w+") { |f| f << ActiveRecord::Base.connection.structure_dump }
|
|
105
|
-
if ActiveRecord::Base.connection.supports_migrations?
|
|
106
|
-
File.open(filename, "a") { |f| f << ActiveRecord::Base.connection.dump_schema_information }
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
redefine_task :load => :environment do
|
|
111
|
-
abcs = ActiveRecord::Base.configurations
|
|
112
|
-
ActiveRecord::Base.establish_connection(abcs[rails_env])
|
|
113
|
-
filename = ENV['DB_STRUCTURE'] || "db/#{rails_env}_structure.sql"
|
|
114
|
-
IO.read(filename).split(/;\n*/m).each do |ddl|
|
|
115
|
-
ActiveRecord::Base.connection.execute(ddl)
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
namespace :test do
|
|
121
|
-
redefine_task :clone_structure => [ "db:structure:dump", "db:test:purge" ] do
|
|
122
|
-
abcs = ActiveRecord::Base.configurations
|
|
123
|
-
abcs['test']['pg_params'] = '?allowEncodingChanges=true' if abcs['test']['adapter'] =~ /postgresql/i
|
|
124
|
-
ActiveRecord::Base.establish_connection(abcs["test"])
|
|
125
|
-
ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0') if abcs["test"]["adapter"] =~ /mysql/i
|
|
126
|
-
IO.readlines("db/#{rails_env}_structure.sql").join.split(";\n\n").each do |ddl|
|
|
127
|
-
begin
|
|
128
|
-
ActiveRecord::Base.connection.execute(ddl.chomp(';'))
|
|
129
|
-
rescue Exception => ex
|
|
130
|
-
puts ex.message
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
redefine_task :purge => :environment do
|
|
136
|
-
abcs = ActiveRecord::Base.configurations
|
|
137
|
-
db = find_database_name(abcs['test'])
|
|
138
|
-
ActiveRecord::Base.connection.recreate_database(db, abcs['test'])
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
|
-
end
|
|
1
|
+
# @deprecated
|
|
2
|
+
warn "[DEPRECATED] load 'arjdbc/tasks.rb' (or 'arjdbc/tasks/database.rake') instead of 'arjdbc/jdbc/jdbc.rake'"
|
|
3
|
+
load 'arjdbc/tasks.rb'
|