activerecord-jdbc-adapter-ficoh 1.3.21-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 (191) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +35 -0
  3. data/.travis.yml +462 -0
  4. data/.yardopts +4 -0
  5. data/Appraisals +36 -0
  6. data/CONTRIBUTING.md +49 -0
  7. data/Gemfile +68 -0
  8. data/History.md +1191 -0
  9. data/LICENSE.txt +25 -0
  10. data/README.md +277 -0
  11. data/RUNNING_TESTS.md +88 -0
  12. data/Rakefile +298 -0
  13. data/Rakefile.jdbc +20 -0
  14. data/activerecord-jdbc-adapter.gemspec +63 -0
  15. data/lib/active_record/connection_adapters/as400_adapter.rb +2 -0
  16. data/lib/active_record/connection_adapters/db2_adapter.rb +1 -0
  17. data/lib/active_record/connection_adapters/derby_adapter.rb +1 -0
  18. data/lib/active_record/connection_adapters/firebird_adapter.rb +1 -0
  19. data/lib/active_record/connection_adapters/h2_adapter.rb +1 -0
  20. data/lib/active_record/connection_adapters/hsqldb_adapter.rb +1 -0
  21. data/lib/active_record/connection_adapters/informix_adapter.rb +1 -0
  22. data/lib/active_record/connection_adapters/jdbc_adapter.rb +1 -0
  23. data/lib/active_record/connection_adapters/jndi_adapter.rb +1 -0
  24. data/lib/active_record/connection_adapters/mariadb_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/active_record/connection_adapters/sqlserver_adapter.rb +1 -0
  32. data/lib/activerecord-jdbc-adapter.rb +1 -0
  33. data/lib/arel/visitors/compat.rb +64 -0
  34. data/lib/arel/visitors/db2.rb +137 -0
  35. data/lib/arel/visitors/derby.rb +112 -0
  36. data/lib/arel/visitors/firebird.rb +79 -0
  37. data/lib/arel/visitors/h2.rb +25 -0
  38. data/lib/arel/visitors/hsqldb.rb +32 -0
  39. data/lib/arel/visitors/postgresql_jdbc.rb +6 -0
  40. data/lib/arel/visitors/sql_server.rb +225 -0
  41. data/lib/arel/visitors/sql_server/ng42.rb +293 -0
  42. data/lib/arjdbc.rb +22 -0
  43. data/lib/arjdbc/db2.rb +4 -0
  44. data/lib/arjdbc/db2/adapter.rb +802 -0
  45. data/lib/arjdbc/db2/as400.rb +137 -0
  46. data/lib/arjdbc/db2/column.rb +177 -0
  47. data/lib/arjdbc/db2/connection_methods.rb +45 -0
  48. data/lib/arjdbc/derby.rb +3 -0
  49. data/lib/arjdbc/derby/active_record_patch.rb +13 -0
  50. data/lib/arjdbc/derby/adapter.rb +567 -0
  51. data/lib/arjdbc/derby/connection_methods.rb +16 -0
  52. data/lib/arjdbc/derby/schema_creation.rb +15 -0
  53. data/lib/arjdbc/discover.rb +104 -0
  54. data/lib/arjdbc/firebird.rb +4 -0
  55. data/lib/arjdbc/firebird/adapter.rb +468 -0
  56. data/lib/arjdbc/firebird/connection_methods.rb +20 -0
  57. data/lib/arjdbc/h2.rb +3 -0
  58. data/lib/arjdbc/h2/adapter.rb +335 -0
  59. data/lib/arjdbc/h2/connection_methods.rb +22 -0
  60. data/lib/arjdbc/hsqldb.rb +3 -0
  61. data/lib/arjdbc/hsqldb/adapter.rb +304 -0
  62. data/lib/arjdbc/hsqldb/connection_methods.rb +23 -0
  63. data/lib/arjdbc/hsqldb/explain_support.rb +35 -0
  64. data/lib/arjdbc/hsqldb/schema_creation.rb +11 -0
  65. data/lib/arjdbc/informix.rb +5 -0
  66. data/lib/arjdbc/informix/adapter.rb +160 -0
  67. data/lib/arjdbc/informix/connection_methods.rb +9 -0
  68. data/lib/arjdbc/jdbc.rb +62 -0
  69. data/lib/arjdbc/jdbc/adapter.rb +997 -0
  70. data/lib/arjdbc/jdbc/adapter_require.rb +46 -0
  71. data/lib/arjdbc/jdbc/arel_support.rb +149 -0
  72. data/lib/arjdbc/jdbc/base_ext.rb +34 -0
  73. data/lib/arjdbc/jdbc/callbacks.rb +52 -0
  74. data/lib/arjdbc/jdbc/column.rb +83 -0
  75. data/lib/arjdbc/jdbc/connection.rb +26 -0
  76. data/lib/arjdbc/jdbc/connection_methods.rb +59 -0
  77. data/lib/arjdbc/jdbc/driver.rb +44 -0
  78. data/lib/arjdbc/jdbc/error.rb +75 -0
  79. data/lib/arjdbc/jdbc/extension.rb +69 -0
  80. data/lib/arjdbc/jdbc/java.rb +13 -0
  81. data/lib/arjdbc/jdbc/type_cast.rb +154 -0
  82. data/lib/arjdbc/jdbc/type_converter.rb +142 -0
  83. data/lib/arjdbc/mssql.rb +7 -0
  84. data/lib/arjdbc/mssql/adapter.rb +822 -0
  85. data/lib/arjdbc/mssql/column.rb +207 -0
  86. data/lib/arjdbc/mssql/connection_methods.rb +72 -0
  87. data/lib/arjdbc/mssql/explain_support.rb +99 -0
  88. data/lib/arjdbc/mssql/limit_helpers.rb +231 -0
  89. data/lib/arjdbc/mssql/lock_methods.rb +77 -0
  90. data/lib/arjdbc/mssql/types.rb +343 -0
  91. data/lib/arjdbc/mssql/utils.rb +82 -0
  92. data/lib/arjdbc/mysql.rb +3 -0
  93. data/lib/arjdbc/mysql/adapter.rb +998 -0
  94. data/lib/arjdbc/mysql/bulk_change_table.rb +150 -0
  95. data/lib/arjdbc/mysql/column.rb +167 -0
  96. data/lib/arjdbc/mysql/connection_methods.rb +137 -0
  97. data/lib/arjdbc/mysql/explain_support.rb +82 -0
  98. data/lib/arjdbc/mysql/schema_creation.rb +58 -0
  99. data/lib/arjdbc/oracle.rb +4 -0
  100. data/lib/arjdbc/oracle/adapter.rb +968 -0
  101. data/lib/arjdbc/oracle/column.rb +136 -0
  102. data/lib/arjdbc/oracle/connection_methods.rb +21 -0
  103. data/lib/arjdbc/postgresql.rb +3 -0
  104. data/lib/arjdbc/postgresql/_bc_time_cast_patch.rb +21 -0
  105. data/lib/arjdbc/postgresql/adapter.rb +1498 -0
  106. data/lib/arjdbc/postgresql/base/array_parser.rb +95 -0
  107. data/lib/arjdbc/postgresql/base/oid.rb +412 -0
  108. data/lib/arjdbc/postgresql/base/pgconn.rb +8 -0
  109. data/lib/arjdbc/postgresql/base/schema_definitions.rb +132 -0
  110. data/lib/arjdbc/postgresql/column.rb +640 -0
  111. data/lib/arjdbc/postgresql/connection_methods.rb +44 -0
  112. data/lib/arjdbc/postgresql/explain_support.rb +53 -0
  113. data/lib/arjdbc/postgresql/oid/bytea.rb +3 -0
  114. data/lib/arjdbc/postgresql/oid_types.rb +265 -0
  115. data/lib/arjdbc/postgresql/schema_creation.rb +60 -0
  116. data/lib/arjdbc/railtie.rb +11 -0
  117. data/lib/arjdbc/sqlite3.rb +3 -0
  118. data/lib/arjdbc/sqlite3/adapter.rb +654 -0
  119. data/lib/arjdbc/sqlite3/connection_methods.rb +36 -0
  120. data/lib/arjdbc/sqlite3/explain_support.rb +29 -0
  121. data/lib/arjdbc/sybase.rb +2 -0
  122. data/lib/arjdbc/sybase/adapter.rb +47 -0
  123. data/lib/arjdbc/tasks.rb +13 -0
  124. data/lib/arjdbc/tasks/database_tasks.rb +66 -0
  125. data/lib/arjdbc/tasks/databases.rake +91 -0
  126. data/lib/arjdbc/tasks/databases3.rake +239 -0
  127. data/lib/arjdbc/tasks/databases4.rake +39 -0
  128. data/lib/arjdbc/tasks/db2_database_tasks.rb +104 -0
  129. data/lib/arjdbc/tasks/derby_database_tasks.rb +95 -0
  130. data/lib/arjdbc/tasks/h2_database_tasks.rb +31 -0
  131. data/lib/arjdbc/tasks/hsqldb_database_tasks.rb +70 -0
  132. data/lib/arjdbc/tasks/jdbc_database_tasks.rb +169 -0
  133. data/lib/arjdbc/tasks/mssql_database_tasks.rb +46 -0
  134. data/lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb +297 -0
  135. data/lib/arjdbc/tasks/oracle_database_tasks.rb +65 -0
  136. data/lib/arjdbc/util/quoted_cache.rb +60 -0
  137. data/lib/arjdbc/util/serialized_attributes.rb +98 -0
  138. data/lib/arjdbc/util/table_copier.rb +108 -0
  139. data/lib/arjdbc/version.rb +8 -0
  140. data/lib/generators/jdbc/USAGE +9 -0
  141. data/lib/generators/jdbc/jdbc_generator.rb +17 -0
  142. data/pom.xml +285 -0
  143. data/rails_generators/jdbc_generator.rb +15 -0
  144. data/rails_generators/templates/config/initializers/jdbc.rb +10 -0
  145. data/rails_generators/templates/lib/tasks/jdbc.rake +11 -0
  146. data/rakelib/01-tomcat.rake +51 -0
  147. data/rakelib/02-test.rake +151 -0
  148. data/rakelib/bundler_ext.rb +11 -0
  149. data/rakelib/db.rake +58 -0
  150. data/rakelib/rails.rake +77 -0
  151. data/src/java/arjdbc/ArJdbcModule.java +288 -0
  152. data/src/java/arjdbc/db2/DB2Module.java +77 -0
  153. data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +128 -0
  154. data/src/java/arjdbc/derby/DerbyModule.java +180 -0
  155. data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +153 -0
  156. data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +190 -0
  157. data/src/java/arjdbc/h2/H2Module.java +50 -0
  158. data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +86 -0
  159. data/src/java/arjdbc/hsqldb/HSQLDBModule.java +74 -0
  160. data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +76 -0
  161. data/src/java/arjdbc/jdbc/AdapterJavaService.java +43 -0
  162. data/src/java/arjdbc/jdbc/Callable.java +44 -0
  163. data/src/java/arjdbc/jdbc/ConnectionFactory.java +77 -0
  164. data/src/java/arjdbc/jdbc/DataSourceConnectionFactory.java +156 -0
  165. data/src/java/arjdbc/jdbc/DriverConnectionFactory.java +63 -0
  166. data/src/java/arjdbc/jdbc/DriverWrapper.java +128 -0
  167. data/src/java/arjdbc/jdbc/JdbcConnectionFactory.java +32 -0
  168. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +4541 -0
  169. data/src/java/arjdbc/jdbc/SQLBlock.java +54 -0
  170. data/src/java/arjdbc/jdbc/WithResultSet.java +37 -0
  171. data/src/java/arjdbc/mssql/MSSQLModule.java +91 -0
  172. data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +193 -0
  173. data/src/java/arjdbc/mysql/MySQLModule.java +140 -0
  174. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +456 -0
  175. data/src/java/arjdbc/oracle/OracleModule.java +81 -0
  176. data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +477 -0
  177. data/src/java/arjdbc/postgresql/ByteaUtils.java +171 -0
  178. data/src/java/arjdbc/postgresql/DriverImplementation.java +78 -0
  179. data/src/java/arjdbc/postgresql/PGDriverImplementation.java +535 -0
  180. data/src/java/arjdbc/postgresql/PostgreSQLModule.java +189 -0
  181. data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +489 -0
  182. data/src/java/arjdbc/sqlite3/SQLite3Module.java +93 -0
  183. data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +405 -0
  184. data/src/java/arjdbc/util/CallResultSet.java +826 -0
  185. data/src/java/arjdbc/util/DateTimeUtils.java +517 -0
  186. data/src/java/arjdbc/util/NumberUtils.java +50 -0
  187. data/src/java/arjdbc/util/ObjectSupport.java +65 -0
  188. data/src/java/arjdbc/util/QuotingUtils.java +139 -0
  189. data/src/java/arjdbc/util/StringCache.java +60 -0
  190. data/src/java/arjdbc/util/StringHelper.java +155 -0
  191. metadata +288 -0
@@ -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,149 @@
1
+ module ActiveRecord::ConnectionAdapters
2
+ module Jdbc
3
+ # AREL support for the JDBC adapter.
4
+ # @see ActiveRecord::ConnectionAdapters::JdbcAdapter
5
+ module ArelSupport
6
+
7
+ def self.included(base)
8
+ base.extend ClassMethods
9
+ end
10
+
11
+ module ClassMethods
12
+
13
+ def arel_visitor_name(spec)
14
+ if spec
15
+ if spec.respond_to?(:arel_visitor_name)
16
+ spec.arel_visitor_name # for AREL built-in visitors
17
+ else
18
+ spec.name.split('::').last.downcase # ArJdbc::PostgreSQL -> postgresql
19
+ end
20
+ else # AR::ConnnectionAdapters::MySQLAdapter => mysql
21
+ name.split('::').last.sub('Adapter', '').downcase
22
+ end
23
+ end
24
+
25
+ # NOTE: it's important to track our own since we might want to override
26
+ # what AREL setup for us e.g. we do not want `::Arel::Visitors::MSSQL`
27
+
28
+ # @private
29
+ RESOLVED_VISITORS = {} # lazy filled mirror of ::Arel::Visitors::VISITORS
30
+
31
+ # @todo document
32
+ def resolve_visitor_type(config)
33
+ raise "missing :adapter in #{config.inspect}" unless adapter = config[:adapter]
34
+
35
+ visitor_type = RESOLVED_VISITORS[ adapter ]
36
+
37
+ if visitor_type.nil? || adapter == 'jdbc'
38
+ if adapter_spec = config[:adapter_spec]
39
+ if adapter_spec.respond_to?(:arel_visitor_type)
40
+ visitor_type = adapter_spec.arel_visitor_type(config)
41
+ elsif adapter_spec.respond_to?(:arel2_visitors) # backwards compat
42
+ visitor_type = adapter_spec.arel2_visitors(config).values.first
43
+ else # auto-convention ArJdbc::MySQL -> Arel::Visitors::MySQL
44
+ const_name = adapter_spec.name.split('::').last
45
+ visitor_type = ::Arel::Visitors.const_get(const_name) rescue nil
46
+ end
47
+ elsif respond_to?(:arel_visitor_type)
48
+ visitor_type = arel_visitor_type(config) # adapter_class' override
49
+ end
50
+
51
+ if visitor_type && RESOLVED_VISITORS[ adapter ] # adapter == 'jdbc'
52
+ if visitor_type != RESOLVED_VISITORS[ adapter ]
53
+ ArJdbc.warn("overriding visitor for 'adapter: jdbc' (from #{RESOLVED_VISITORS[ adapter ]} to #{visitor_type})")
54
+ end
55
+ end
56
+
57
+ visitor_type ||= ::Arel::Visitors::VISITORS[ arel_visitor_name(adapter_spec) ]
58
+ visitor_type ||= ::Arel::Visitors::ToSql # default (if nothing resolved)
59
+
60
+ RESOLVED_VISITORS.to_java.synchronized do
61
+ RESOLVED_VISITORS[ adapter ] = ::Arel::Visitors::VISITORS[ adapter ] = visitor_type
62
+ end
63
+ end
64
+
65
+ visitor_type
66
+ end
67
+
68
+ # @private
69
+ def clean_visitor_type(adapter)
70
+ RESOLVED_VISITORS.to_java.synchronized do
71
+ RESOLVED_VISITORS.delete(adapter); ::Arel::Visitors::VISITORS.delete(adapter)
72
+ end
73
+ end
74
+ private :clean_visitor_type
75
+
76
+ # @note called from `ActiveRecord::ConnectionAdapters::ConnectionPool.checkout` (up till AR-3.2)
77
+ # @override
78
+ def visitor_for(pool)
79
+ visitor = resolve_visitor_type(config = pool.spec.config)
80
+ ( prepared_statements?(config) ? visitor : bind_substitution(visitor) ).new(pool)
81
+ end
82
+
83
+ # @private
84
+ @@bind_substitutions = nil
85
+
86
+ # Generates a class for the given visitor type, this new {Class} instance
87
+ # is a sub-class of `Arel::Visitors::BindVisitor`.
88
+ # @return [Class] class for given visitor type
89
+ def bind_substitution(visitor)
90
+ # NOTE: similar convention as in AR (but no base substitution type) :
91
+ # class BindSubstitution < ::Arel::Visitors::ToSql
92
+ # include ::Arel::Visitors::BindVisitor
93
+ # end
94
+ return const_get(:BindSubstitution) if const_defined?(:BindSubstitution)
95
+
96
+ @@bind_substitutions ||= Java::JavaUtil::HashMap.new
97
+ unless bind_visitor = @@bind_substitutions.get(visitor)
98
+ @@bind_substitutions.synchronized do
99
+ unless @@bind_substitutions.get(visitor)
100
+ bind_visitor = Class.new(visitor) do
101
+ include ::Arel::Visitors::BindVisitor
102
+ end
103
+ @@bind_substitutions.put(visitor, bind_visitor)
104
+ end
105
+ end
106
+ bind_visitor = @@bind_substitutions.get(visitor)
107
+ end
108
+ bind_visitor
109
+ end
110
+
111
+ begin
112
+ require 'arel/visitors/bind_visitor'
113
+ rescue LoadError # AR-3.0
114
+ def bind_substitution(visitor); visitor; end
115
+ end
116
+
117
+ end
118
+
119
+ if defined? ::Arel::Visitors::VISITORS
120
+
121
+ # Instantiates a new AREL visitor for this adapter.
122
+ # @note On `ActiveRecord` **2.3** this method won't be used.
123
+ def new_visitor
124
+ visitor = self.class.resolve_visitor_type(config)
125
+ ( prepared_statements? ? visitor : bind_substitution(visitor) ).new(self)
126
+ end
127
+ protected :new_visitor
128
+
129
+ def bind_substitution(visitor); self.class.bind_substitution(visitor); end
130
+ private :bind_substitution
131
+
132
+ # @override ActiveRecord's convention
133
+ def unprepared_visitor
134
+ # super does self.class::BindSubstitution.new self
135
+ # we do not require the BindSubstitution constant - auto-generated :
136
+ visitor = self.class.resolve_visitor_type(config)
137
+ bind_substitution(visitor).new(self)
138
+ end
139
+
140
+ else # NO-OP when no AREL (AR-2.3)
141
+
142
+ # @private documented above
143
+ def new_visitor; end
144
+
145
+ end
146
+
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,34 @@
1
+ module ActiveRecord
2
+ # ActiveRecord::Base extensions.
3
+ Base.class_eval do
4
+ class << self
5
+ # Allow adapters to provide their own {#reset_column_information} method.
6
+ # @note This only affects the current thread's connection.
7
+ def reset_column_information_with_arjdbc # :nodoc:
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
11
+ end
12
+ unless method_defined?("reset_column_information_without_arjdbc")
13
+ alias_method_chain :reset_column_information, :arjdbc
14
+ end
15
+ end
16
+ end
17
+
18
+ module ConnectionAdapters
19
+ # Allows properly re-defining methods that may already be alias-chain-ed.
20
+ # Query caching works even with overriden alias_method_chain'd methods.
21
+ # @private
22
+ module ShadowCoreMethods
23
+ def alias_chained_method(name, feature, target)
24
+ # NOTE: aliasing for things such as columns (with feature query_cache)
25
+ # seems to only be used for 2.3 since 3.0 methods are not aliased ...
26
+ if method_defined?(method = "#{name}_without_#{feature}")
27
+ alias_method method, target
28
+ else
29
+ alias_method name, target if name.to_s != target.to_s
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,52 @@
1
+ module ActiveRecord::ConnectionAdapters
2
+ module Jdbc
3
+ # ActiveRecord connection pool callbacks for JDBC.
4
+ # @see ActiveRecord::ConnectionAdapters::Jdbc::JndiConnectionPoolCallbacks
5
+ module ConnectionPoolCallbacks
6
+
7
+ def self.included(base)
8
+ if base.respond_to?(:set_callback) # Rails 3 callbacks
9
+ base.set_callback :checkin, :after, :on_checkin
10
+ base.set_callback :checkout, :before, :on_checkout
11
+ else
12
+ base.checkin :on_checkin
13
+ base.checkout :on_checkout
14
+ end
15
+ end
16
+
17
+ def on_checkin
18
+ # default implementation does nothing
19
+ end
20
+
21
+ def on_checkout
22
+ # default implementation does nothing
23
+ end
24
+
25
+ end
26
+ # JNDI specific connection pool callbacks that make sure the JNDI connection
27
+ # is disconnected on check-in and looked up (re-connected) on-checkout.
28
+ module JndiConnectionPoolCallbacks
29
+
30
+ def self.prepare(adapter, connection)
31
+ if adapter.is_a?(ConnectionPoolCallbacks) && connection.jndi?
32
+ adapter.extend self # extend JndiConnectionPoolCallbacks
33
+ #connection.disconnect! #if connection.open? # close initial (JNDI) connection
34
+ connection.disconnect! if connection.open? # close initial (JNDI) connection
35
+ end
36
+ end
37
+
38
+ def on_checkin
39
+ disconnect!
40
+ end
41
+
42
+ def on_checkout
43
+ reconnect!
44
+ end
45
+ end
46
+
47
+ end
48
+ # @deprecated use {ActiveRecord::ConnectionAdapters::Jdbc::ConnectionPoolCallbacks}
49
+ JdbcConnectionPoolCallbacks = Jdbc::ConnectionPoolCallbacks
50
+ # @deprecated use {ActiveRecord::ConnectionAdapters::Jdbc::JndiConnectionPoolCallbacks}
51
+ JndiConnectionPoolCallbacks = Jdbc::JndiConnectionPoolCallbacks
52
+ end
@@ -0,0 +1,83 @@
1
+ module ActiveRecord
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
12
+ class JdbcColumn < Column
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
28
+ default = default_value(default)
29
+
30
+ # super <= 4.1: (name, default, sql_type = nil, null = true)
31
+ # super >= 4.2: (name, default, cast_type, sql_type = nil, null = true)
32
+ super(name, default, *args)
33
+ init_column(name, default, *args)
34
+ end
35
+
36
+ # Additional column initialization for sub-classes.
37
+ def init_column(*args); end
38
+
39
+ # Similar to `ActiveRecord`'s `extract_value_from_default(default)`.
40
+ # @return default value for a column (possibly extracted from driver value)
41
+ def default_value(value); value; end
42
+
43
+ protected
44
+
45
+ # @private
46
+ def call_discovered_column_callbacks(config)
47
+ dialect = (config[:dialect] || config[:driver]).to_s
48
+ for matcher, block in self.class.column_types
49
+ block.call(config, self) if matcher === dialect
50
+ end
51
+ end
52
+
53
+ public
54
+
55
+ # Returns the available column types
56
+ # @return [Hash] of (matcher, block) pairs
57
+ def self.column_types
58
+ types = {}
59
+ for mod in ::ArJdbc.modules
60
+ if mod.respond_to?(:column_selector)
61
+ sel = mod.column_selector # [ matcher, block ]
62
+ types[ sel[0] ] = sel[1]
63
+ end
64
+ end
65
+ types
66
+ end
67
+
68
+ class << self
69
+
70
+ include Jdbc::TypeCast if ::ActiveRecord::VERSION::STRING >= '4.2'
71
+
72
+ if ActiveRecord::VERSION::MAJOR > 3 && ActiveRecord::VERSION::STRING < '4.2'
73
+
74
+ # @private provides compatibility between AR 3.x/4.0 API
75
+ def string_to_date(value); value_to_date(value) end
76
+
77
+ end
78
+
79
+ end
80
+
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,26 @@
1
+ module ActiveRecord
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 "native" Java, check: *RubyJdbcConnection.java*
6
+ class JdbcConnection
7
+
8
+ # @deprecated no longer used (pass adapter into #initialize)
9
+ # @see ActiveRecord::ConnectionAdapters::JdbcAdapter#initialize
10
+ def adapter=(adapter)
11
+ ArJdbc.deprecate "adapter= will be removed, please pass adapter on JdbcConnection#initialize(config, adapter)"
12
+ set_adapter adapter
13
+ end
14
+
15
+ def native_database_types
16
+ JdbcTypeConverter.new(supported_data_types).choose_best_types
17
+ end
18
+
19
+ # @deprecated no longer used - only kept for compatibility
20
+ def set_native_database_types
21
+ ArJdbc.deprecate "set_native_database_types is no longer used and does nothing override native_database_types instead"
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,59 @@
1
+ module ArJdbc
2
+ if ActiveRecord.const_defined? :ConnectionHandling # 4.0
3
+ ConnectionMethods = ActiveRecord::ConnectionHandling
4
+ else # 3.x
5
+ ConnectionMethods = (class << ActiveRecord::Base; self; end)
6
+ end
7
+ ConnectionMethods.module_eval do
8
+
9
+ def jdbc_connection(config)
10
+ adapter_class = config[:adapter_class] || begin
11
+ if config[:adapter] == 'jdbc' && adapter = supported_adapter(config)
12
+ ArJdbc.deprecate("please update your **adapter: jdbc** configuration to adapter: #{adapter}", true)
13
+ end
14
+ ::ActiveRecord::ConnectionAdapters::JdbcAdapter
15
+ end
16
+ adapter_class.new(nil, logger, config)
17
+ end
18
+
19
+ def jndi_connection(config)
20
+ if config[:adapter] == 'jndi'
21
+ ArJdbc.deprecate("please change your **adapter: jndi** configuration to " <<
22
+ "the concrete adapter you're wish to use with jndi: '#{config[:jndi]}'", true)
23
+ end
24
+ jdbc_connection(config)
25
+ end
26
+
27
+ def embedded_driver(config)
28
+ config[:username] ||= 'sa'
29
+ config[:password] ||= ''
30
+ jdbc_connection(config)
31
+ end
32
+
33
+ private
34
+
35
+ def jndi_config?(config)
36
+ ::ActiveRecord::ConnectionAdapters::JdbcConnection.jndi_config?(config)
37
+ end
38
+
39
+ def supported_adapter(config)
40
+ return unless driver = config[:driver]
41
+ case driver
42
+ when 'com.ibm.db2.jcc.DB2Driver' then 'db2'
43
+ when /derby/ then 'derby' # 'org.apache.derby.jdbc.EmbeddedDriver'
44
+ when 'org.firebirdsql.jdbc.FBDriver' then 'firebird'
45
+ when 'org.h2.Driver' then 'h2'
46
+ when 'org.hsqldb.jdbcDriver' then 'hsqldb'
47
+ when 'net.sourceforge.jtds.jdbc.Driver' then 'mssql'
48
+ when 'com.microsoft.sqlserver.jdbc.SQLServerDriver' then 'sqlserver'
49
+ when /mysql/ then 'mysql' # 'com.mysql.jdbc.Driver/NonRegisteringDriver'
50
+ when /mariadb/ then 'mariadb' # 'org.mariadb.jdbc.Driver'
51
+ when /oracle/ then 'oracle' # 'oracle.jdbc.driver.OracleDriver'
52
+ when /postgre/i then 'postgresql' # 'org.postgresql.Driver'
53
+ when /sqlite/i then 'sqlite3' # 'org.sqlite.JDBC'
54
+ else false
55
+ end
56
+ end
57
+
58
+ end
59
+ end