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.
Files changed (228) hide show
  1. data/.gitignore +22 -0
  2. data/.travis.yml +14 -0
  3. data/Appraisals +16 -0
  4. data/Gemfile +11 -0
  5. data/Gemfile.lock +45 -0
  6. data/History.txt +488 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.rdoc +214 -0
  9. data/Rakefile +62 -0
  10. data/activerecord-jdbc-adapter.gemspec +23 -0
  11. data/bench/bench_attributes.rb +13 -0
  12. data/bench/bench_attributes_new.rb +14 -0
  13. data/bench/bench_create.rb +12 -0
  14. data/bench/bench_find_all.rb +12 -0
  15. data/bench/bench_find_all_mt.rb +25 -0
  16. data/bench/bench_model.rb +85 -0
  17. data/bench/bench_new.rb +12 -0
  18. data/bench/bench_new_valid.rb +12 -0
  19. data/bench/bench_valid.rb +13 -0
  20. data/gemfiles/rails23.gemfile +10 -0
  21. data/gemfiles/rails23.gemfile.lock +38 -0
  22. data/gemfiles/rails30.gemfile +9 -0
  23. data/gemfiles/rails30.gemfile.lock +33 -0
  24. data/gemfiles/rails31.gemfile +9 -0
  25. data/gemfiles/rails31.gemfile.lock +35 -0
  26. data/gemfiles/rails32.gemfile +9 -0
  27. data/gemfiles/rails32.gemfile.lock +35 -0
  28. data/lib/active_record/connection_adapters/derby_adapter.rb +1 -0
  29. data/lib/active_record/connection_adapters/h2_adapter.rb +1 -0
  30. data/lib/active_record/connection_adapters/hsqldb_adapter.rb +1 -0
  31. data/lib/active_record/connection_adapters/informix_adapter.rb +1 -0
  32. data/lib/active_record/connection_adapters/jdbc_adapter.rb +1 -0
  33. data/lib/active_record/connection_adapters/jndi_adapter.rb +1 -0
  34. data/lib/active_record/connection_adapters/mssql_adapter.rb +1 -0
  35. data/lib/active_record/connection_adapters/mysql2_adapter.rb +1 -0
  36. data/lib/active_record/connection_adapters/mysql_adapter.rb +1 -0
  37. data/lib/active_record/connection_adapters/oracle_adapter.rb +1 -0
  38. data/lib/active_record/connection_adapters/postgresql_adapter.rb +1 -0
  39. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +1 -0
  40. data/lib/activerecord-jdbc-adapter.rb +8 -0
  41. data/lib/arel/engines/sql/compilers/db2_compiler.rb +9 -0
  42. data/lib/arel/engines/sql/compilers/derby_compiler.rb +6 -0
  43. data/lib/arel/engines/sql/compilers/h2_compiler.rb +6 -0
  44. data/lib/arel/engines/sql/compilers/hsqldb_compiler.rb +15 -0
  45. data/lib/arel/engines/sql/compilers/jdbc_compiler.rb +6 -0
  46. data/lib/arel/engines/sql/compilers/mssql_compiler.rb +46 -0
  47. data/lib/arel/visitors/compat.rb +13 -0
  48. data/lib/arel/visitors/db2.rb +17 -0
  49. data/lib/arel/visitors/derby.rb +32 -0
  50. data/lib/arel/visitors/firebird.rb +24 -0
  51. data/lib/arel/visitors/hsqldb.rb +26 -0
  52. data/lib/arel/visitors/sql_server.rb +46 -0
  53. data/lib/arjdbc.rb +24 -0
  54. data/lib/arjdbc/db2.rb +2 -0
  55. data/lib/arjdbc/db2/adapter.rb +541 -0
  56. data/lib/arjdbc/derby.rb +7 -0
  57. data/lib/arjdbc/derby/adapter.rb +358 -0
  58. data/lib/arjdbc/derby/connection_methods.rb +19 -0
  59. data/lib/arjdbc/discover.rb +92 -0
  60. data/lib/arjdbc/firebird.rb +2 -0
  61. data/lib/arjdbc/firebird/adapter.rb +140 -0
  62. data/lib/arjdbc/h2.rb +4 -0
  63. data/lib/arjdbc/h2/adapter.rb +54 -0
  64. data/lib/arjdbc/h2/connection_methods.rb +13 -0
  65. data/lib/arjdbc/hsqldb.rb +4 -0
  66. data/lib/arjdbc/hsqldb/adapter.rb +184 -0
  67. data/lib/arjdbc/hsqldb/connection_methods.rb +15 -0
  68. data/lib/arjdbc/informix.rb +3 -0
  69. data/lib/arjdbc/informix/adapter.rb +142 -0
  70. data/lib/arjdbc/informix/connection_methods.rb +11 -0
  71. data/lib/arjdbc/jdbc.rb +2 -0
  72. data/lib/arjdbc/jdbc/adapter.rb +356 -0
  73. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  74. data/lib/arjdbc/jdbc/base_ext.rb +15 -0
  75. data/lib/arjdbc/jdbc/callbacks.rb +44 -0
  76. data/lib/arjdbc/jdbc/column.rb +47 -0
  77. data/lib/arjdbc/jdbc/compatibility.rb +51 -0
  78. data/lib/arjdbc/jdbc/connection.rb +134 -0
  79. data/lib/arjdbc/jdbc/connection_methods.rb +16 -0
  80. data/lib/arjdbc/jdbc/core_ext.rb +24 -0
  81. data/lib/arjdbc/jdbc/discover.rb +18 -0
  82. data/lib/arjdbc/jdbc/driver.rb +35 -0
  83. data/lib/arjdbc/jdbc/extension.rb +47 -0
  84. data/lib/arjdbc/jdbc/java.rb +14 -0
  85. data/lib/arjdbc/jdbc/jdbc.rake +131 -0
  86. data/lib/arjdbc/jdbc/missing_functionality_helper.rb +88 -0
  87. data/lib/arjdbc/jdbc/quoted_primary_key.rb +28 -0
  88. data/lib/arjdbc/jdbc/railtie.rb +9 -0
  89. data/lib/arjdbc/jdbc/rake_tasks.rb +10 -0
  90. data/lib/arjdbc/jdbc/require_driver.rb +16 -0
  91. data/lib/arjdbc/jdbc/type_converter.rb +126 -0
  92. data/lib/arjdbc/mimer.rb +2 -0
  93. data/lib/arjdbc/mimer/adapter.rb +142 -0
  94. data/lib/arjdbc/mssql.rb +4 -0
  95. data/lib/arjdbc/mssql/adapter.rb +477 -0
  96. data/lib/arjdbc/mssql/connection_methods.rb +31 -0
  97. data/lib/arjdbc/mssql/limit_helpers.rb +101 -0
  98. data/lib/arjdbc/mssql/lock_helpers.rb +72 -0
  99. data/lib/arjdbc/mssql/tsql_helper.rb +61 -0
  100. data/lib/arjdbc/mysql.rb +4 -0
  101. data/lib/arjdbc/mysql/adapter.rb +505 -0
  102. data/lib/arjdbc/mysql/connection_methods.rb +28 -0
  103. data/lib/arjdbc/oracle.rb +3 -0
  104. data/lib/arjdbc/oracle/adapter.rb +432 -0
  105. data/lib/arjdbc/oracle/connection_methods.rb +12 -0
  106. data/lib/arjdbc/postgresql.rb +4 -0
  107. data/lib/arjdbc/postgresql/adapter.rb +861 -0
  108. data/lib/arjdbc/postgresql/connection_methods.rb +23 -0
  109. data/lib/arjdbc/sqlite3.rb +4 -0
  110. data/lib/arjdbc/sqlite3/adapter.rb +389 -0
  111. data/lib/arjdbc/sqlite3/connection_methods.rb +35 -0
  112. data/lib/arjdbc/sybase.rb +2 -0
  113. data/lib/arjdbc/sybase/adapter.rb +46 -0
  114. data/lib/arjdbc/version.rb +8 -0
  115. data/lib/generators/jdbc/USAGE +10 -0
  116. data/lib/generators/jdbc/jdbc_generator.rb +9 -0
  117. data/lib/jdbc_adapter.rb +2 -0
  118. data/lib/jdbc_adapter/rake_tasks.rb +3 -0
  119. data/lib/jdbc_adapter/version.rb +3 -0
  120. data/lib/pg.rb +26 -0
  121. data/pom.xml +57 -0
  122. data/rails_generators/jdbc_generator.rb +15 -0
  123. data/rails_generators/templates/config/initializers/jdbc.rb +7 -0
  124. data/rails_generators/templates/lib/tasks/jdbc.rake +8 -0
  125. data/rakelib/bundler_ext.rb +11 -0
  126. data/rakelib/compile.rake +23 -0
  127. data/rakelib/db.rake +39 -0
  128. data/rakelib/rails.rake +41 -0
  129. data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +69 -0
  130. data/src/java/arjdbc/derby/DerbyModule.java +324 -0
  131. data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +70 -0
  132. data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +74 -0
  133. data/src/java/arjdbc/jdbc/AdapterJavaService.java +68 -0
  134. data/src/java/arjdbc/jdbc/JdbcConnectionFactory.java +36 -0
  135. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +1346 -0
  136. data/src/java/arjdbc/jdbc/SQLBlock.java +48 -0
  137. data/src/java/arjdbc/mssql/MssqlRubyJdbcConnection.java +127 -0
  138. data/src/java/arjdbc/mysql/MySQLModule.java +134 -0
  139. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +161 -0
  140. data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +85 -0
  141. data/src/java/arjdbc/postgresql/PostgresqlRubyJdbcConnection.java +82 -0
  142. data/src/java/arjdbc/sqlite3/Sqlite3RubyJdbcConnection.java +126 -0
  143. data/test/abstract_db_create.rb +135 -0
  144. data/test/activerecord/connection_adapters/type_conversion_test.rb +31 -0
  145. data/test/activerecord/connections/native_jdbc_mysql/connection.rb +25 -0
  146. data/test/activerecord/jall.sh +7 -0
  147. data/test/activerecord/jtest.sh +3 -0
  148. data/test/db/db2.rb +11 -0
  149. data/test/db/derby.rb +12 -0
  150. data/test/db/h2.rb +11 -0
  151. data/test/db/hsqldb.rb +13 -0
  152. data/test/db/informix.rb +11 -0
  153. data/test/db/jdbc.rb +12 -0
  154. data/test/db/jndi_config.rb +40 -0
  155. data/test/db/logger.rb +3 -0
  156. data/test/db/mssql.rb +9 -0
  157. data/test/db/mysql.rb +10 -0
  158. data/test/db/oracle.rb +34 -0
  159. data/test/db/postgres.rb +18 -0
  160. data/test/db/sqlite3.rb +11 -0
  161. data/test/db2_reset_column_information_test.rb +8 -0
  162. data/test/db2_simple_test.rb +66 -0
  163. data/test/derby_migration_test.rb +68 -0
  164. data/test/derby_multibyte_test.rb +12 -0
  165. data/test/derby_reset_column_information_test.rb +8 -0
  166. data/test/derby_row_locking_test.rb +9 -0
  167. data/test/derby_simple_test.rb +139 -0
  168. data/test/generic_jdbc_connection_test.rb +29 -0
  169. data/test/h2_change_column_test.rb +68 -0
  170. data/test/h2_simple_test.rb +41 -0
  171. data/test/has_many_through.rb +79 -0
  172. data/test/helper.rb +108 -0
  173. data/test/hsqldb_simple_test.rb +6 -0
  174. data/test/informix_simple_test.rb +48 -0
  175. data/test/jdbc_common.rb +28 -0
  176. data/test/jndi_callbacks_test.rb +36 -0
  177. data/test/jndi_test.rb +25 -0
  178. data/test/manualTestDatabase.rb +191 -0
  179. data/test/models/add_not_null_column_to_table.rb +9 -0
  180. data/test/models/auto_id.rb +15 -0
  181. data/test/models/custom_pk_name.rb +14 -0
  182. data/test/models/data_types.rb +30 -0
  183. data/test/models/entry.rb +40 -0
  184. data/test/models/mixed_case.rb +22 -0
  185. data/test/models/reserved_word.rb +15 -0
  186. data/test/models/string_id.rb +17 -0
  187. data/test/models/thing.rb +16 -0
  188. data/test/models/validates_uniqueness_of_string.rb +19 -0
  189. data/test/mssql_db_create_test.rb +26 -0
  190. data/test/mssql_identity_insert_test.rb +19 -0
  191. data/test/mssql_ignore_system_views_test.rb +27 -0
  192. data/test/mssql_legacy_types_test.rb +58 -0
  193. data/test/mssql_limit_offset_test.rb +136 -0
  194. data/test/mssql_multibyte_test.rb +18 -0
  195. data/test/mssql_null_test.rb +14 -0
  196. data/test/mssql_reset_column_information_test.rb +8 -0
  197. data/test/mssql_row_locking_sql_test.rb +159 -0
  198. data/test/mssql_row_locking_test.rb +9 -0
  199. data/test/mssql_simple_test.rb +55 -0
  200. data/test/mysql_db_create_test.rb +27 -0
  201. data/test/mysql_index_length_test.rb +58 -0
  202. data/test/mysql_info_test.rb +123 -0
  203. data/test/mysql_multibyte_test.rb +10 -0
  204. data/test/mysql_nonstandard_primary_key_test.rb +42 -0
  205. data/test/mysql_reset_column_information_test.rb +8 -0
  206. data/test/mysql_simple_test.rb +125 -0
  207. data/test/oracle_reset_column_information_test.rb +8 -0
  208. data/test/oracle_simple_test.rb +18 -0
  209. data/test/oracle_specific_test.rb +83 -0
  210. data/test/postgres_db_create_test.rb +32 -0
  211. data/test/postgres_drop_db_test.rb +16 -0
  212. data/test/postgres_information_schema_leak_test.rb +29 -0
  213. data/test/postgres_mixed_case_test.rb +29 -0
  214. data/test/postgres_native_type_mapping_test.rb +93 -0
  215. data/test/postgres_nonseq_pkey_test.rb +38 -0
  216. data/test/postgres_reserved_test.rb +22 -0
  217. data/test/postgres_reset_column_information_test.rb +8 -0
  218. data/test/postgres_schema_search_path_test.rb +48 -0
  219. data/test/postgres_simple_test.rb +168 -0
  220. data/test/postgres_table_alias_length_test.rb +15 -0
  221. data/test/postgres_type_conversion_test.rb +34 -0
  222. data/test/row_locking.rb +90 -0
  223. data/test/simple.rb +731 -0
  224. data/test/sqlite3_reset_column_information_test.rb +8 -0
  225. data/test/sqlite3_simple_test.rb +316 -0
  226. data/test/sybase_jtds_simple_test.rb +28 -0
  227. data/test/sybase_reset_column_information_test.rb +8 -0
  228. 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
@@ -0,0 +1,2 @@
1
+ require 'arjdbc/jdbc/adapter'
2
+ require 'arjdbc/jdbc/discover'
@@ -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
@@ -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