activerecord-jdbc-adapter 1.0.3-java → 50.1-java

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