activerecord-jdbc-adapter-onsite 1.2.2
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 +22 -0
- data/.travis.yml +14 -0
- data/Appraisals +16 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +45 -0
- data/History.txt +488 -0
- data/LICENSE.txt +21 -0
- data/README.rdoc +214 -0
- data/Rakefile +62 -0
- data/activerecord-jdbc-adapter.gemspec +23 -0
- data/bench/bench_attributes.rb +13 -0
- data/bench/bench_attributes_new.rb +14 -0
- data/bench/bench_create.rb +12 -0
- data/bench/bench_find_all.rb +12 -0
- data/bench/bench_find_all_mt.rb +25 -0
- data/bench/bench_model.rb +85 -0
- data/bench/bench_new.rb +12 -0
- data/bench/bench_new_valid.rb +12 -0
- data/bench/bench_valid.rb +13 -0
- data/gemfiles/rails23.gemfile +10 -0
- data/gemfiles/rails23.gemfile.lock +38 -0
- data/gemfiles/rails30.gemfile +9 -0
- data/gemfiles/rails30.gemfile.lock +33 -0
- data/gemfiles/rails31.gemfile +9 -0
- data/gemfiles/rails31.gemfile.lock +35 -0
- data/gemfiles/rails32.gemfile +9 -0
- data/gemfiles/rails32.gemfile.lock +35 -0
- data/lib/active_record/connection_adapters/derby_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/h2_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/hsqldb_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/informix_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/jdbc_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/jndi_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/mssql_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/mysql_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/oracle_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +1 -0
- data/lib/activerecord-jdbc-adapter.rb +8 -0
- data/lib/arel/engines/sql/compilers/db2_compiler.rb +9 -0
- data/lib/arel/engines/sql/compilers/derby_compiler.rb +6 -0
- data/lib/arel/engines/sql/compilers/h2_compiler.rb +6 -0
- data/lib/arel/engines/sql/compilers/hsqldb_compiler.rb +15 -0
- data/lib/arel/engines/sql/compilers/jdbc_compiler.rb +6 -0
- data/lib/arel/engines/sql/compilers/mssql_compiler.rb +46 -0
- data/lib/arel/visitors/compat.rb +13 -0
- data/lib/arel/visitors/db2.rb +17 -0
- data/lib/arel/visitors/derby.rb +32 -0
- data/lib/arel/visitors/firebird.rb +24 -0
- data/lib/arel/visitors/hsqldb.rb +26 -0
- data/lib/arel/visitors/sql_server.rb +46 -0
- data/lib/arjdbc.rb +24 -0
- data/lib/arjdbc/db2.rb +2 -0
- data/lib/arjdbc/db2/adapter.rb +541 -0
- data/lib/arjdbc/derby.rb +7 -0
- data/lib/arjdbc/derby/adapter.rb +358 -0
- data/lib/arjdbc/derby/connection_methods.rb +19 -0
- data/lib/arjdbc/discover.rb +92 -0
- data/lib/arjdbc/firebird.rb +2 -0
- data/lib/arjdbc/firebird/adapter.rb +140 -0
- data/lib/arjdbc/h2.rb +4 -0
- data/lib/arjdbc/h2/adapter.rb +54 -0
- data/lib/arjdbc/h2/connection_methods.rb +13 -0
- data/lib/arjdbc/hsqldb.rb +4 -0
- data/lib/arjdbc/hsqldb/adapter.rb +184 -0
- data/lib/arjdbc/hsqldb/connection_methods.rb +15 -0
- data/lib/arjdbc/informix.rb +3 -0
- data/lib/arjdbc/informix/adapter.rb +142 -0
- data/lib/arjdbc/informix/connection_methods.rb +11 -0
- data/lib/arjdbc/jdbc.rb +2 -0
- data/lib/arjdbc/jdbc/adapter.rb +356 -0
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/base_ext.rb +15 -0
- data/lib/arjdbc/jdbc/callbacks.rb +44 -0
- data/lib/arjdbc/jdbc/column.rb +47 -0
- data/lib/arjdbc/jdbc/compatibility.rb +51 -0
- data/lib/arjdbc/jdbc/connection.rb +134 -0
- data/lib/arjdbc/jdbc/connection_methods.rb +16 -0
- data/lib/arjdbc/jdbc/core_ext.rb +24 -0
- data/lib/arjdbc/jdbc/discover.rb +18 -0
- data/lib/arjdbc/jdbc/driver.rb +35 -0
- data/lib/arjdbc/jdbc/extension.rb +47 -0
- data/lib/arjdbc/jdbc/java.rb +14 -0
- data/lib/arjdbc/jdbc/jdbc.rake +131 -0
- data/lib/arjdbc/jdbc/missing_functionality_helper.rb +88 -0
- data/lib/arjdbc/jdbc/quoted_primary_key.rb +28 -0
- data/lib/arjdbc/jdbc/railtie.rb +9 -0
- data/lib/arjdbc/jdbc/rake_tasks.rb +10 -0
- data/lib/arjdbc/jdbc/require_driver.rb +16 -0
- data/lib/arjdbc/jdbc/type_converter.rb +126 -0
- data/lib/arjdbc/mimer.rb +2 -0
- data/lib/arjdbc/mimer/adapter.rb +142 -0
- data/lib/arjdbc/mssql.rb +4 -0
- data/lib/arjdbc/mssql/adapter.rb +477 -0
- data/lib/arjdbc/mssql/connection_methods.rb +31 -0
- data/lib/arjdbc/mssql/limit_helpers.rb +101 -0
- data/lib/arjdbc/mssql/lock_helpers.rb +72 -0
- data/lib/arjdbc/mssql/tsql_helper.rb +61 -0
- data/lib/arjdbc/mysql.rb +4 -0
- data/lib/arjdbc/mysql/adapter.rb +505 -0
- data/lib/arjdbc/mysql/connection_methods.rb +28 -0
- data/lib/arjdbc/oracle.rb +3 -0
- data/lib/arjdbc/oracle/adapter.rb +432 -0
- data/lib/arjdbc/oracle/connection_methods.rb +12 -0
- data/lib/arjdbc/postgresql.rb +4 -0
- data/lib/arjdbc/postgresql/adapter.rb +861 -0
- data/lib/arjdbc/postgresql/connection_methods.rb +23 -0
- data/lib/arjdbc/sqlite3.rb +4 -0
- data/lib/arjdbc/sqlite3/adapter.rb +389 -0
- data/lib/arjdbc/sqlite3/connection_methods.rb +35 -0
- data/lib/arjdbc/sybase.rb +2 -0
- data/lib/arjdbc/sybase/adapter.rb +46 -0
- data/lib/arjdbc/version.rb +8 -0
- data/lib/generators/jdbc/USAGE +10 -0
- data/lib/generators/jdbc/jdbc_generator.rb +9 -0
- data/lib/jdbc_adapter.rb +2 -0
- data/lib/jdbc_adapter/rake_tasks.rb +3 -0
- data/lib/jdbc_adapter/version.rb +3 -0
- data/lib/pg.rb +26 -0
- data/pom.xml +57 -0
- data/rails_generators/jdbc_generator.rb +15 -0
- data/rails_generators/templates/config/initializers/jdbc.rb +7 -0
- data/rails_generators/templates/lib/tasks/jdbc.rake +8 -0
- data/rakelib/bundler_ext.rb +11 -0
- data/rakelib/compile.rake +23 -0
- data/rakelib/db.rake +39 -0
- data/rakelib/rails.rake +41 -0
- data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +69 -0
- data/src/java/arjdbc/derby/DerbyModule.java +324 -0
- data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +70 -0
- data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +74 -0
- data/src/java/arjdbc/jdbc/AdapterJavaService.java +68 -0
- data/src/java/arjdbc/jdbc/JdbcConnectionFactory.java +36 -0
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +1346 -0
- data/src/java/arjdbc/jdbc/SQLBlock.java +48 -0
- data/src/java/arjdbc/mssql/MssqlRubyJdbcConnection.java +127 -0
- data/src/java/arjdbc/mysql/MySQLModule.java +134 -0
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +161 -0
- data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +85 -0
- data/src/java/arjdbc/postgresql/PostgresqlRubyJdbcConnection.java +82 -0
- data/src/java/arjdbc/sqlite3/Sqlite3RubyJdbcConnection.java +126 -0
- data/test/abstract_db_create.rb +135 -0
- data/test/activerecord/connection_adapters/type_conversion_test.rb +31 -0
- data/test/activerecord/connections/native_jdbc_mysql/connection.rb +25 -0
- data/test/activerecord/jall.sh +7 -0
- data/test/activerecord/jtest.sh +3 -0
- data/test/db/db2.rb +11 -0
- data/test/db/derby.rb +12 -0
- data/test/db/h2.rb +11 -0
- data/test/db/hsqldb.rb +13 -0
- data/test/db/informix.rb +11 -0
- data/test/db/jdbc.rb +12 -0
- data/test/db/jndi_config.rb +40 -0
- data/test/db/logger.rb +3 -0
- data/test/db/mssql.rb +9 -0
- data/test/db/mysql.rb +10 -0
- data/test/db/oracle.rb +34 -0
- data/test/db/postgres.rb +18 -0
- data/test/db/sqlite3.rb +11 -0
- data/test/db2_reset_column_information_test.rb +8 -0
- data/test/db2_simple_test.rb +66 -0
- data/test/derby_migration_test.rb +68 -0
- data/test/derby_multibyte_test.rb +12 -0
- data/test/derby_reset_column_information_test.rb +8 -0
- data/test/derby_row_locking_test.rb +9 -0
- data/test/derby_simple_test.rb +139 -0
- data/test/generic_jdbc_connection_test.rb +29 -0
- data/test/h2_change_column_test.rb +68 -0
- data/test/h2_simple_test.rb +41 -0
- data/test/has_many_through.rb +79 -0
- data/test/helper.rb +108 -0
- data/test/hsqldb_simple_test.rb +6 -0
- data/test/informix_simple_test.rb +48 -0
- data/test/jdbc_common.rb +28 -0
- data/test/jndi_callbacks_test.rb +36 -0
- data/test/jndi_test.rb +25 -0
- data/test/manualTestDatabase.rb +191 -0
- data/test/models/add_not_null_column_to_table.rb +9 -0
- data/test/models/auto_id.rb +15 -0
- data/test/models/custom_pk_name.rb +14 -0
- data/test/models/data_types.rb +30 -0
- data/test/models/entry.rb +40 -0
- data/test/models/mixed_case.rb +22 -0
- data/test/models/reserved_word.rb +15 -0
- data/test/models/string_id.rb +17 -0
- data/test/models/thing.rb +16 -0
- data/test/models/validates_uniqueness_of_string.rb +19 -0
- data/test/mssql_db_create_test.rb +26 -0
- data/test/mssql_identity_insert_test.rb +19 -0
- data/test/mssql_ignore_system_views_test.rb +27 -0
- data/test/mssql_legacy_types_test.rb +58 -0
- data/test/mssql_limit_offset_test.rb +136 -0
- data/test/mssql_multibyte_test.rb +18 -0
- data/test/mssql_null_test.rb +14 -0
- data/test/mssql_reset_column_information_test.rb +8 -0
- data/test/mssql_row_locking_sql_test.rb +159 -0
- data/test/mssql_row_locking_test.rb +9 -0
- data/test/mssql_simple_test.rb +55 -0
- data/test/mysql_db_create_test.rb +27 -0
- data/test/mysql_index_length_test.rb +58 -0
- data/test/mysql_info_test.rb +123 -0
- data/test/mysql_multibyte_test.rb +10 -0
- data/test/mysql_nonstandard_primary_key_test.rb +42 -0
- data/test/mysql_reset_column_information_test.rb +8 -0
- data/test/mysql_simple_test.rb +125 -0
- data/test/oracle_reset_column_information_test.rb +8 -0
- data/test/oracle_simple_test.rb +18 -0
- data/test/oracle_specific_test.rb +83 -0
- data/test/postgres_db_create_test.rb +32 -0
- data/test/postgres_drop_db_test.rb +16 -0
- data/test/postgres_information_schema_leak_test.rb +29 -0
- data/test/postgres_mixed_case_test.rb +29 -0
- data/test/postgres_native_type_mapping_test.rb +93 -0
- data/test/postgres_nonseq_pkey_test.rb +38 -0
- data/test/postgres_reserved_test.rb +22 -0
- data/test/postgres_reset_column_information_test.rb +8 -0
- data/test/postgres_schema_search_path_test.rb +48 -0
- data/test/postgres_simple_test.rb +168 -0
- data/test/postgres_table_alias_length_test.rb +15 -0
- data/test/postgres_type_conversion_test.rb +34 -0
- data/test/row_locking.rb +90 -0
- data/test/simple.rb +731 -0
- data/test/sqlite3_reset_column_information_test.rb +8 -0
- data/test/sqlite3_simple_test.rb +316 -0
- data/test/sybase_jtds_simple_test.rb +28 -0
- data/test/sybase_reset_column_information_test.rb +8 -0
- metadata +288 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
class ActiveRecord::Base
|
|
2
|
+
class << self
|
|
3
|
+
def informix_connection(config)
|
|
4
|
+
config[:port] ||= 9088
|
|
5
|
+
config[:url] ||= "jdbc:informix-sqli://#{config[:host]}:#{config[:port]}/#{config[:database]}:INFORMIXSERVER=#{config[:servername]}"
|
|
6
|
+
config[:driver] = 'com.informix.jdbc.IfxDriver'
|
|
7
|
+
config[:adapter_spec] = ::ArJdbc::Informix
|
|
8
|
+
jdbc_connection(config)
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
data/lib/arjdbc/jdbc.rb
ADDED
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
require 'active_record/version'
|
|
2
|
+
require 'active_record/connection_adapters/abstract_adapter'
|
|
3
|
+
require 'arjdbc/version'
|
|
4
|
+
require 'arjdbc/jdbc/require_driver'
|
|
5
|
+
require 'arjdbc/jdbc/connection_methods'
|
|
6
|
+
require 'arjdbc/jdbc/compatibility'
|
|
7
|
+
require 'arjdbc/jdbc/core_ext'
|
|
8
|
+
require 'arjdbc/jdbc/java'
|
|
9
|
+
require 'arjdbc/jdbc/type_converter'
|
|
10
|
+
require 'arjdbc/jdbc/driver'
|
|
11
|
+
require 'arjdbc/jdbc/column'
|
|
12
|
+
require 'arjdbc/jdbc/connection'
|
|
13
|
+
require 'arjdbc/jdbc/callbacks'
|
|
14
|
+
require 'arjdbc/jdbc/extension'
|
|
15
|
+
require 'arjdbc/jdbc/base_ext'
|
|
16
|
+
require 'bigdecimal'
|
|
17
|
+
|
|
18
|
+
module ActiveRecord
|
|
19
|
+
module ConnectionAdapters
|
|
20
|
+
class JdbcAdapter < AbstractAdapter
|
|
21
|
+
extend ShadowCoreMethods
|
|
22
|
+
include CompatibilityMethods if CompatibilityMethods.needed?(self)
|
|
23
|
+
include JdbcConnectionPoolCallbacks if JdbcConnectionPoolCallbacks.needed?
|
|
24
|
+
|
|
25
|
+
attr_reader :config
|
|
26
|
+
|
|
27
|
+
def initialize(connection, logger, config)
|
|
28
|
+
@config = config
|
|
29
|
+
spec = config[:adapter_spec] || adapter_spec(config)
|
|
30
|
+
config[:adapter_spec] ||= spec
|
|
31
|
+
unless connection
|
|
32
|
+
connection_class = jdbc_connection_class spec
|
|
33
|
+
connection = connection_class.new config
|
|
34
|
+
end
|
|
35
|
+
super(connection, logger)
|
|
36
|
+
if spec && (config[:adapter_class].nil? || config[:adapter_class] == JdbcAdapter)
|
|
37
|
+
extend spec
|
|
38
|
+
end
|
|
39
|
+
configure_arel2_visitors(config)
|
|
40
|
+
connection.adapter = self
|
|
41
|
+
JndiConnectionPoolCallbacks.prepare(self, connection)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def jdbc_connection_class(spec)
|
|
45
|
+
connection_class = spec.jdbc_connection_class if spec && spec.respond_to?(:jdbc_connection_class)
|
|
46
|
+
connection_class = ::ActiveRecord::ConnectionAdapters::JdbcConnection unless connection_class
|
|
47
|
+
connection_class
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def jdbc_column_class
|
|
51
|
+
ActiveRecord::ConnectionAdapters::JdbcColumn
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Retrieve the raw java.sql.Connection object.
|
|
55
|
+
def jdbc_connection
|
|
56
|
+
raw_connection.connection
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Locate specialized adapter specification if one exists based on config data
|
|
60
|
+
def adapter_spec(config)
|
|
61
|
+
2.times do
|
|
62
|
+
dialect = (config[:dialect] || config[:driver]).to_s
|
|
63
|
+
::ArJdbc.constants.map { |name| ::ArJdbc.const_get name }.each do |constant|
|
|
64
|
+
if constant.respond_to? :adapter_matcher
|
|
65
|
+
spec = constant.adapter_matcher(dialect, config)
|
|
66
|
+
return spec if spec
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# If nothing matches and we're using jndi, try to automatically detect the database.
|
|
71
|
+
break unless config[:jndi] and !config[:dialect]
|
|
72
|
+
begin
|
|
73
|
+
conn = Java::javax.naming.InitialContext.new.lookup(config[:jndi]).getConnection
|
|
74
|
+
config[:dialect] = conn.getMetaData.getDatabaseProductName
|
|
75
|
+
|
|
76
|
+
# Derby-specific hack
|
|
77
|
+
if ::ArJdbc::Derby.adapter_matcher(config[:dialect], config)
|
|
78
|
+
# Needed to set the correct database schema name
|
|
79
|
+
config[:username] ||= conn.getMetaData.getUserName
|
|
80
|
+
end
|
|
81
|
+
rescue
|
|
82
|
+
conn.close if conn
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
nil
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def modify_types(tp)
|
|
89
|
+
tp
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def adapter_name #:nodoc:
|
|
93
|
+
'JDBC'
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def self.visitor_for(pool)
|
|
97
|
+
config = pool.spec.config
|
|
98
|
+
adapter = config[:adapter]
|
|
99
|
+
adapter_spec = config[:adapter_spec] || self
|
|
100
|
+
if adapter =~ /^(jdbc|jndi)$/
|
|
101
|
+
adapter_spec.arel2_visitors(config).values.first.new(pool)
|
|
102
|
+
else
|
|
103
|
+
adapter_spec.arel2_visitors(config)[adapter].new(pool)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def self.arel2_visitors(config)
|
|
108
|
+
{ 'jdbc' => ::Arel::Visitors::ToSql }
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def configure_arel2_visitors(config)
|
|
112
|
+
if defined?(::Arel::Visitors::VISITORS)
|
|
113
|
+
visitors = ::Arel::Visitors::VISITORS
|
|
114
|
+
visitor = nil
|
|
115
|
+
adapter_spec = [config[:adapter_spec], self.class].detect {|a| a && a.respond_to?(:arel2_visitors) }
|
|
116
|
+
adapter_spec.arel2_visitors(config).each do |k,v|
|
|
117
|
+
visitor = v
|
|
118
|
+
visitors[k] = v
|
|
119
|
+
end
|
|
120
|
+
if visitor && config[:adapter] =~ /^(jdbc|jndi)$/
|
|
121
|
+
visitors[config[:adapter]] = visitor
|
|
122
|
+
end
|
|
123
|
+
@visitor = visitors[config[:adapter]].new(self)
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def is_a?(klass) # :nodoc:
|
|
128
|
+
# This is to fake out current_adapter? conditional logic in AR tests
|
|
129
|
+
if Class === klass && klass.name =~ /#{adapter_name}Adapter$/i
|
|
130
|
+
true
|
|
131
|
+
else
|
|
132
|
+
super
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def supports_migrations?
|
|
137
|
+
true
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def native_database_types #:nodoc:
|
|
141
|
+
@connection.native_database_types
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def database_name #:nodoc:
|
|
145
|
+
@connection.database_name
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def native_sql_to_type(tp)
|
|
149
|
+
if /^(.*?)\(([0-9]+)\)/ =~ tp
|
|
150
|
+
tname = $1
|
|
151
|
+
limit = $2.to_i
|
|
152
|
+
ntype = native_database_types
|
|
153
|
+
if ntype[:primary_key] == tp
|
|
154
|
+
return :primary_key,nil
|
|
155
|
+
else
|
|
156
|
+
ntype.each do |name,val|
|
|
157
|
+
if name == :primary_key
|
|
158
|
+
next
|
|
159
|
+
end
|
|
160
|
+
if val[:name].downcase == tname.downcase && (val[:limit].nil? || val[:limit].to_i == limit)
|
|
161
|
+
return name,limit
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
elsif /^(.*?)/ =~ tp
|
|
166
|
+
tname = $1
|
|
167
|
+
ntype = native_database_types
|
|
168
|
+
if ntype[:primary_key] == tp
|
|
169
|
+
return :primary_key,nil
|
|
170
|
+
else
|
|
171
|
+
ntype.each do |name,val|
|
|
172
|
+
if val[:name].downcase == tname.downcase && val[:limit].nil?
|
|
173
|
+
return name,nil
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
else
|
|
178
|
+
return :string,255
|
|
179
|
+
end
|
|
180
|
+
return nil,nil
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def active?
|
|
184
|
+
@connection.active?
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def reconnect!
|
|
188
|
+
@connection.reconnect!
|
|
189
|
+
@connection
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def disconnect!
|
|
193
|
+
@connection.disconnect!
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
def substitute_binds(manager, binds = [])
|
|
197
|
+
sql = extract_sql(manager)
|
|
198
|
+
if binds.empty?
|
|
199
|
+
sql
|
|
200
|
+
else
|
|
201
|
+
copy = binds.dup
|
|
202
|
+
sql.gsub('?') { quote(*copy.shift.reverse) }
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def execute(sql, name = nil, binds = [])
|
|
207
|
+
sql = substitute_binds(sql, binds)
|
|
208
|
+
if name == :skip_logging
|
|
209
|
+
_execute(sql)
|
|
210
|
+
else
|
|
211
|
+
log(sql, name) { _execute(sql) }
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# we need to do it this way, to allow Rails stupid tests to always work
|
|
216
|
+
# even if we define a new execute method. Instead of mixing in a new
|
|
217
|
+
# execute, an _execute should be mixed in.
|
|
218
|
+
def _execute(sql, name = nil)
|
|
219
|
+
@connection.execute(sql)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def jdbc_insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
|
|
223
|
+
insert_sql(sql, name, pk, id_value, sequence_name, binds)
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def jdbc_update(sql, name = nil, binds = []) #:nodoc:
|
|
227
|
+
execute(sql, name, binds)
|
|
228
|
+
end
|
|
229
|
+
def jdbc_select_all(sql, name = nil, binds = [])
|
|
230
|
+
select(sql, name, binds)
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
if ActiveRecord::VERSION::MAJOR < 3
|
|
234
|
+
# Allow query caching to work even when we override alias_method_chain'd methods
|
|
235
|
+
alias_chained_method :select_all, :query_cache, :jdbc_select_all
|
|
236
|
+
alias_chained_method :update, :query_dirty, :jdbc_update
|
|
237
|
+
alias_chained_method :insert, :query_dirty, :jdbc_insert
|
|
238
|
+
|
|
239
|
+
# Do we need this? Not in AR 3.
|
|
240
|
+
def select_one(sql, name = nil)
|
|
241
|
+
select(sql, name).first
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def last_inserted_id(result)
|
|
246
|
+
result
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def select_rows(sql, name = nil)
|
|
250
|
+
rows = []
|
|
251
|
+
select(sql, name).each {|row| rows << row.values }
|
|
252
|
+
rows
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def insert_sql(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
|
|
256
|
+
id = execute(sql, name = nil, binds)
|
|
257
|
+
id_value || id
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
### Rails 3.1 prepared statement support
|
|
261
|
+
|
|
262
|
+
# Executes +sql+ statement in the context of this connection using
|
|
263
|
+
# +binds+ as the bind substitutes. +name+ is logged along with
|
|
264
|
+
# the executed +sql+ statement.
|
|
265
|
+
def exec_query(sql, name = 'SQL', binds = [])
|
|
266
|
+
execute(sql, name, binds)
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
# Executes insert +sql+ statement in the context of this connection using
|
|
270
|
+
# +binds+ as the bind substitutes. +name+ is the logged along with
|
|
271
|
+
# the executed +sql+ statement.
|
|
272
|
+
def exec_insert(sql, name, binds)
|
|
273
|
+
exec_query(sql, name, binds)
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
# Executes delete +sql+ statement in the context of this connection using
|
|
277
|
+
# +binds+ as the bind substitutes. +name+ is the logged along with
|
|
278
|
+
# the executed +sql+ statement.
|
|
279
|
+
def exec_delete(sql, name, binds)
|
|
280
|
+
exec_query(sql, name, binds)
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
# Executes update +sql+ statement in the context of this connection using
|
|
284
|
+
# +binds+ as the bind substitutes. +name+ is the logged along with
|
|
285
|
+
# the executed +sql+ statement.
|
|
286
|
+
def exec_update(sql, name, binds)
|
|
287
|
+
exec_query(sql, name, binds)
|
|
288
|
+
end
|
|
289
|
+
|
|
290
|
+
def jdbc_columns(table_name, name = nil)
|
|
291
|
+
@connection.columns(table_name.to_s)
|
|
292
|
+
end
|
|
293
|
+
alias_chained_method :columns, :query_cache, :jdbc_columns
|
|
294
|
+
|
|
295
|
+
def tables(name = nil)
|
|
296
|
+
@connection.tables
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def table_exists?(name)
|
|
300
|
+
jdbc_columns(name) rescue nil
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
def indexes(table_name, name = nil, schema_name = nil)
|
|
304
|
+
@connection.indexes(table_name, name, schema_name)
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
def begin_db_transaction
|
|
308
|
+
@connection.begin
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def commit_db_transaction
|
|
312
|
+
@connection.commit
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
def rollback_db_transaction
|
|
316
|
+
@connection.rollback
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def write_large_object(*args)
|
|
320
|
+
@connection.write_large_object(*args)
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
def pk_and_sequence_for(table)
|
|
324
|
+
key = primary_key(table)
|
|
325
|
+
[key, nil] if key
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
def primary_key(table)
|
|
329
|
+
primary_keys(table).first
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
def primary_keys(table)
|
|
333
|
+
@connection.primary_keys(table)
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
def select(*args)
|
|
337
|
+
execute(*args)
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
def translate_exception(e, message)
|
|
341
|
+
puts e.backtrace if $DEBUG || ENV['DEBUG']
|
|
342
|
+
super
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def extract_sql(obj)
|
|
346
|
+
if obj.respond_to? :to_sql
|
|
347
|
+
obj.send :to_sql
|
|
348
|
+
else
|
|
349
|
+
obj
|
|
350
|
+
end
|
|
351
|
+
end
|
|
352
|
+
|
|
353
|
+
protected :translate_exception, :extract_sql
|
|
354
|
+
end
|
|
355
|
+
end
|
|
356
|
+
end
|
|
Binary file
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
class Base # reopen
|
|
3
|
+
class <<self
|
|
4
|
+
# Allow adapters to provide their own reset_column_information methods
|
|
5
|
+
#
|
|
6
|
+
# NOTE: This only affects the current thread's connection.
|
|
7
|
+
def reset_column_information_with_arjdbc_base_ext
|
|
8
|
+
# Invoke the adapter-specific reset_column_information method
|
|
9
|
+
connection.reset_column_information if connection.respond_to?(:reset_column_information)
|
|
10
|
+
reset_column_information_without_arjdbc_base_ext
|
|
11
|
+
end
|
|
12
|
+
alias_method_chain :reset_column_information, :arjdbc_base_ext unless instance_methods.include?("reset_column_information_without_arjdbc_base_ext")
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
module ConnectionAdapters
|
|
3
|
+
module JdbcConnectionPoolCallbacks
|
|
4
|
+
def self.included(base)
|
|
5
|
+
if base.respond_to?(:set_callback) # Rails 3 callbacks
|
|
6
|
+
base.set_callback :checkin, :after, :on_checkin
|
|
7
|
+
base.set_callback :checkout, :before, :on_checkout
|
|
8
|
+
else
|
|
9
|
+
base.checkin :on_checkin
|
|
10
|
+
base.checkout :on_checkout
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.needed?
|
|
15
|
+
ActiveRecord::Base.respond_to?(:connection_pool)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def on_checkin
|
|
19
|
+
# default implementation does nothing
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def on_checkout
|
|
23
|
+
# default implementation does nothing
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
module JndiConnectionPoolCallbacks
|
|
28
|
+
def self.prepare(adapter, conn)
|
|
29
|
+
if ActiveRecord::Base.respond_to?(:connection_pool) && conn.jndi_connection?
|
|
30
|
+
adapter.extend self
|
|
31
|
+
conn.disconnect! # disconnect initial connection in JdbcConnection#initialize
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def on_checkin
|
|
36
|
+
disconnect!
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def on_checkout
|
|
40
|
+
reconnect!
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module ActiveRecord
|
|
2
|
+
module ConnectionAdapters
|
|
3
|
+
class JdbcColumn < Column
|
|
4
|
+
attr_writer :limit, :precision
|
|
5
|
+
|
|
6
|
+
def initialize(config, name, default, *args)
|
|
7
|
+
call_discovered_column_callbacks(config)
|
|
8
|
+
super(name,default_value(default),*args)
|
|
9
|
+
init_column(name, default, *args)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def init_column(*args)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def default_value(val)
|
|
16
|
+
val
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.column_types
|
|
20
|
+
# GH #25: reset the column types if the # of constants changed
|
|
21
|
+
# since last call
|
|
22
|
+
if ::ArJdbc.constants.size != driver_constants.size
|
|
23
|
+
@driver_constants = nil
|
|
24
|
+
@column_types = nil
|
|
25
|
+
end
|
|
26
|
+
@column_types ||= driver_constants.select {|c|
|
|
27
|
+
c.respond_to? :column_selector }.map {|c|
|
|
28
|
+
c.column_selector }.inject({}) {|h,val|
|
|
29
|
+
h[val[0]] = val[1]; h }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.driver_constants
|
|
33
|
+
@driver_constants ||= ::ArJdbc.constants.map {|c| ::ArJdbc.const_get c }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
protected
|
|
37
|
+
def call_discovered_column_callbacks(config)
|
|
38
|
+
dialect = config[:dialect] || config[:driver]
|
|
39
|
+
for reg, func in JdbcColumn.column_types
|
|
40
|
+
if reg === dialect.to_s
|
|
41
|
+
func.call(config,self)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|