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

Sign up to get free protection for your applications and to get access to all the features.
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