cmoran92-activerecord-jdbc-adapter 1.2.1

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