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
@@ -1,47 +1,59 @@
1
1
  module ArJdbc
2
- # Defines an AR-JDBC extension. An extension consists of a
3
- # declaration using this method and an ArJdbc::XYZ module that
4
- # contains implementation and overrides for methods in
5
- # ActiveRecord::ConnectionAdapters::AbstractAdapter. When you
6
- # declare your extension, you provide a block that detects when a
7
- # database configured to use the extension is present and loads the
8
- # necessary code for it. AR-JDBC will patch the code into the base
9
- # ActiveRecord::ConnectionAdapters::JdbcAdapter by extending an
10
- # instance of it with your extension module.
2
+
3
+ # Defines an AR-JDBC extension. An extension consists of a declaration using
4
+ # this method and an ArJdbc::XYZ module that contains implementation and
5
+ # overrides for methods in ActiveRecord::ConnectionAdapters::AbstractAdapter.
6
+ # When you declare your extension, you provide a block that detects when a
7
+ # database configured to use the extension is present and loads the necessary
8
+ # code for it. AR-JDBC will patch the code into the base JdbcAdapter by
9
+ # extending an instance of it with your extension module.
11
10
  #
12
- # +name+ should be a symbol that is the name of a module to be
13
- # defined under the +ArJdbc+ module.
11
+ # +name+ the name of a module to be defined under the +ArJdbc+ module.
14
12
  #
15
- # +block+ should be a one- or two-arity block that receives the
16
- # dialect name or driver class name as the first argument, and
17
- # optionally the whole database configuration hash as a second
18
- # argument.
13
+ # +block+ should be a one- or two-arity block that receives the dialect name
14
+ # or driver class name as the first argument, and optionally the whole
15
+ # database configuration hash as a second argument
19
16
  #
20
17
  # Example:
21
18
  #
22
- # ArJdbc.extension :Frob do |name|
23
- # if name =~ /frob/i
24
- # # arjdbc/frob.rb should contain the implementation
25
- # require 'arjdbc/frob'
26
- # true
27
- # end
19
+ # ArJdbc.extension :FRoB do |name|
20
+ # if name =~ /frob/i
21
+ # require 'arjdbc/frob' # contains ArJdbc::FRoB
22
+ # true
28
23
  # end
29
- def self.extension(name,&block)
24
+ # end
25
+ #
26
+ def self.extension(name, &block)
30
27
  if const_defined?(name)
31
28
  mod = const_get(name)
32
29
  else
33
30
  mod = const_set(name, Module.new)
34
31
  end
35
32
  (class << mod; self; end).instance_eval do
36
- unless respond_to?(:adapter_matcher)
37
- define_method :adapter_matcher do |name, config|
38
- if block.arity == 1
39
- block.call(name) ? mod : false
40
- else
41
- block.call(name, config) ? mod : false
42
- end
33
+ define_method :adapter_matcher do |_name, config|
34
+ if block.arity == 1
35
+ block.call(_name) ? mod : false
36
+ else
37
+ block.call(_name, config) ? mod : false
43
38
  end
44
39
  end
40
+ end unless mod.respond_to?(:adapter_matcher)
41
+ end
42
+
43
+ private
44
+ def self.discover_extensions
45
+ if defined?(Gem) && Gem.respond_to?(:find_files)
46
+ files = Gem.find_files('arjdbc/discover')
47
+ else
48
+ files = $LOAD_PATH.map do |path|
49
+ discover = File.join(path, 'arjdbc', 'discover.rb')
50
+ File.exist?(discover) ? discover : nil
51
+ end.compact
52
+ end
53
+ files.each do |file|
54
+ puts "Loading AR-JDBC extension #{file}" if $DEBUG
55
+ require file
45
56
  end
46
57
  end
58
+
47
59
  end
@@ -4,11 +4,10 @@ require 'arjdbc/jdbc/adapter_java'
4
4
  module ActiveRecord
5
5
  module ConnectionAdapters
6
6
  module Jdbc
7
- Mutex = java.lang.Object.new
8
- DriverManager = java.sql.DriverManager
9
- Types = java.sql.Types
7
+ # @private
8
+ DriverManager = ::Java::JavaSql::DriverManager
9
+ # @private
10
+ Types = ::Java::JavaSql::Types
10
11
  end
11
-
12
- java_import "arjdbc.jdbc.JdbcConnectionFactory"
13
12
  end
14
- end
13
+ end
@@ -1,127 +1,4 @@
1
- def redefine_task(*args, &block)
2
- task_name = Hash === args.first ? args.first.keys[0] : args.first
3
- existing_task = Rake.application.lookup task_name
4
- if existing_task
5
- class << existing_task
6
- public :instance_variable_set
7
- attr_reader :actions
8
- end
9
- existing_task.instance_variable_set "@prerequisites", FileList[]
10
- existing_task.actions.shift
11
- enhancements = existing_task.actions
12
- existing_task.instance_variable_set "@actions", []
13
- end
14
- redefined_task = task(*args, &block)
15
- enhancements.each {|enhancement| redefined_task.actions << enhancement}
16
- end
1
+ load 'arjdbc/tasks.rb'
17
2
 
18
- def rails_env
19
- defined?(Rails.env) ? Rails.env : RAILS_ENV
20
- end
21
-
22
- namespace :db do
23
- redefine_task :create => :rails_env do
24
- create_database(ActiveRecord::Base.configurations[rails_env])
25
- end
26
- task :create => :load_config if Rake.application.lookup(:load_config)
27
-
28
- redefine_task :drop => :environment do
29
- config = ActiveRecord::Base.configurations[rails_env]
30
- begin
31
- db = find_database_name(config)
32
- ActiveRecord::Base.connection.drop_database(db)
33
- rescue
34
- drop_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
35
- end
36
- end
37
- task :drop => :load_config if Rake.application.lookup(:load_config)
38
-
39
- namespace :create do
40
- task :all => :rails_env
41
- end
42
-
43
- namespace :drop do
44
- task :all => :environment
45
- end
46
-
47
- class << self
48
- alias_method :previous_create_database, :create_database
49
- alias_method :previous_drop_database, :drop_database
50
- end
51
-
52
- def find_database_name(config)
53
- db = config['database']
54
- if config['adapter'] =~ /postgresql/i
55
- config = config.dup
56
- if config['url']
57
- db = config['url'][/\/([^\/]*)$/, 1]
58
- config['url'][/\/([^\/]*)$/, 1] = 'postgres' if db
59
- else
60
- db = config['database']
61
- config['database'] = 'postgres'
62
- end
63
- ActiveRecord::Base.establish_connection(config)
64
- else
65
- ActiveRecord::Base.establish_connection(config)
66
- db = ActiveRecord::Base.connection.database_name
67
- end
68
- db
69
- end
70
-
71
- def create_database(config)
72
- begin
73
- ActiveRecord::Base.establish_connection(config)
74
- ActiveRecord::Base.connection
75
- rescue
76
- begin
77
- if url = config['url'] && url =~ /^(.*(?<!\/)\/)(?=\w)/
78
- url = $1
79
- end
80
-
81
- ActiveRecord::Base.establish_connection(config.merge({'database' => nil, 'url' => url}))
82
- ActiveRecord::Base.connection.create_database(config['database'])
83
- ActiveRecord::Base.establish_connection(config)
84
- rescue => e
85
- raise e unless config['adapter'] =~ /mysql|postgresql|sqlite/
86
- previous_create_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
87
- end
88
- end
89
- end
90
-
91
- def drop_database(config)
92
- previous_drop_database(config.merge('adapter' => config['adapter'].sub(/^jdbc/, '')))
93
- end
94
-
95
- namespace :structure do
96
- redefine_task :dump => :environment do
97
- abcs = ActiveRecord::Base.configurations
98
- ActiveRecord::Base.establish_connection(abcs[rails_env])
99
- File.open("db/#{rails_env}_structure.sql", "w+") { |f| f << ActiveRecord::Base.connection.structure_dump }
100
- if ActiveRecord::Base.connection.supports_migrations?
101
- File.open("db/#{rails_env}_structure.sql", "a") { |f| f << ActiveRecord::Base.connection.dump_schema_information }
102
- end
103
- end
104
- end
105
-
106
- namespace :test do
107
- redefine_task :clone_structure => [ "db:structure:dump", "db:test:purge" ] do
108
- abcs = ActiveRecord::Base.configurations
109
- abcs['test']['pg_params'] = '?allowEncodingChanges=true' if abcs['test']['adapter'] =~ /postgresql/i
110
- ActiveRecord::Base.establish_connection(abcs["test"])
111
- ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0') if abcs["test"]["adapter"] =~ /mysql/i
112
- IO.readlines("db/#{rails_env}_structure.sql").join.split(";\n\n").each do |ddl|
113
- begin
114
- ActiveRecord::Base.connection.execute(ddl.chomp(';'))
115
- rescue Exception => ex
116
- puts ex.message
117
- end
118
- end
119
- end
120
-
121
- redefine_task :purge => :environment do
122
- abcs = ActiveRecord::Base.configurations
123
- db = find_database_name(abcs['test'])
124
- ActiveRecord::Base.connection.recreate_database(db)
125
- end
126
- end
127
- end
3
+ require 'arjdbc'
4
+ ArJdbc.deprecate "load 'arjdbc/tasks.rb' (or 'arjdbc/tasks/database.rake') instead of 'arjdbc/jdbc/jdbc.rake'"
@@ -1,9 +1,2 @@
1
- require 'rails/railtie'
2
-
3
- module ::ArJdbc
4
- class Railtie < ::Rails::Railtie
5
- rake_tasks do
6
- load File.expand_path('../rake_tasks.rb', __FILE__)
7
- end
8
- end
9
- end
1
+ require 'arjdbc/railtie'
2
+ ArJdbc.deprecate "require 'arjdbc/railtie' instead of 'arjdbc/jdbc/railtie'"
@@ -1,10 +1,3 @@
1
- if defined?(Rake.application) && Rake.application && ENV["SKIP_AR_JDBC_RAKE_REDEFINES"].nil?
2
- jdbc_rakefile = File.dirname(__FILE__) + "/jdbc.rake"
3
- if Rake.application.lookup("db:create")
4
- # rails tasks already defined; load the override tasks now
5
- load jdbc_rakefile
6
- else
7
- # rails tasks not loaded yet; load as an import
8
- Rake.application.add_import(jdbc_rakefile)
9
- end
10
- end
1
+ load 'arjdbc/tasks.rb'
2
+
3
+ ArJdbc.deprecate "load 'arjdbc/tasks.rb' instead of 'arjdbc/jdbc/rake_tasks.rb'"
@@ -0,0 +1,3 @@
1
+ require 'arjdbc/util/serialized_attributes'
2
+
3
+ ArJdbc.deprecate "require 'arjdbc/util/serialized_attributes' instead of 'arjdbc/jdbc/serialized_attributes_helper'"
@@ -0,0 +1,166 @@
1
+ require 'active_record/connection_adapters/column'
2
+
3
+ module ActiveRecord::ConnectionAdapters
4
+ module Jdbc
5
+ # Type casting methods taken from AR 4.1's Column class.
6
+ # @private Simply to quickly "hack-in" 4.2 compatibility.
7
+ module TypeCast
8
+ TRUE_VALUES = Column::TRUE_VALUES if Column.const_defined?(:TRUE_VALUES)
9
+ FALSE_VALUES = if defined?(ActiveModel::Type::Boolean::FALSE_VALUES)
10
+ ActiveModel::Type::Boolean::FALSE_VALUES
11
+ else
12
+ Column::FALSE_VALUES
13
+ end
14
+
15
+ #module Format
16
+ ISO_DATE = if defined?(ActiveModel::Type::Date::ISO_DATE)
17
+ ActiveModel::Type::Date::ISO_DATE
18
+ else
19
+ Column::Format::ISO_DATE
20
+ end
21
+
22
+ ISO_DATETIME = if defined?(ActiveModel::Type::Helpers::TimeValue::ISO_DATETIME)
23
+ ActiveModel::Type::Helpers::TimeValue::ISO_DATETIME
24
+ else
25
+ Column::Format::ISO_DATETIME
26
+ end
27
+ #end
28
+
29
+ # Used to convert from BLOBs to Strings
30
+ def binary_to_string(value)
31
+ value
32
+ end
33
+
34
+ def value_to_date(value)
35
+ if value.is_a?(String)
36
+ return nil if value.empty?
37
+ fast_string_to_date(value) || fallback_string_to_date(value)
38
+ elsif value.respond_to?(:to_date)
39
+ value.to_date
40
+ else
41
+ value
42
+ end
43
+ end
44
+
45
+ def string_to_time(string)
46
+ return string unless string.is_a?(String)
47
+ return nil if string.empty?
48
+ return string if string =~ /^-?infinity$/.freeze
49
+
50
+ fast_string_to_time(string) || fallback_string_to_time(string)
51
+ end
52
+
53
+ def string_to_dummy_time(string)
54
+ return string unless string.is_a?(String)
55
+ return nil if string.empty?
56
+
57
+ dummy_time_string = "2000-01-01 #{string}"
58
+
59
+ fast_string_to_time(dummy_time_string) || begin
60
+ time_hash = Date._parse(dummy_time_string)
61
+ return nil if time_hash[:hour].nil?
62
+ new_time(*time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction))
63
+ end
64
+ end
65
+
66
+ # convert something to a boolean
67
+ def value_to_boolean(value)
68
+ if value.is_a?(String) && value.empty?
69
+ nil
70
+ else
71
+ TRUE_VALUES.include?(value)
72
+ end
73
+ end if const_defined?(:TRUE_VALUES) # removed on AR 5.0
74
+
75
+ # convert something to a boolean
76
+ def value_to_boolean(value)
77
+ if value.is_a?(String) && value.empty?
78
+ nil
79
+ else
80
+ ! FALSE_VALUES.include?(value)
81
+ end
82
+ end unless const_defined?(:TRUE_VALUES)
83
+
84
+ # Used to convert values to integer.
85
+ # handle the case when an integer column is used to store boolean values
86
+ def value_to_integer(value)
87
+ case value
88
+ when TrueClass, FalseClass
89
+ value ? 1 : 0
90
+ else
91
+ value.to_i rescue nil
92
+ end
93
+ end
94
+
95
+ # convert something to a BigDecimal
96
+ def value_to_decimal(value)
97
+ # Using .class is faster than .is_a? and
98
+ # subclasses of BigDecimal will be handled
99
+ # in the else clause
100
+ if value.class == BigDecimal
101
+ value
102
+ elsif value.respond_to?(:to_d)
103
+ value.to_d
104
+ else
105
+ value.to_s.to_d
106
+ end
107
+ end
108
+
109
+ protected
110
+ # '0.123456' -> 123456
111
+ # '1.123456' -> 123456
112
+ def microseconds(time)
113
+ time[:sec_fraction] ? (time[:sec_fraction] * 1_000_000).to_i : 0
114
+ end
115
+
116
+ def new_date(year, mon, mday)
117
+ if year && year != 0
118
+ Date.new(year, mon, mday) rescue nil
119
+ end
120
+ end
121
+
122
+ def new_time(year, mon, mday, hour, min, sec, microsec, offset = nil)
123
+ # Treat 0000-00-00 00:00:00 as nil.
124
+ return nil if year.nil? || (year == 0 && mon == 0 && mday == 0)
125
+
126
+ if offset
127
+ time = Time.utc(year, mon, mday, hour, min, sec, microsec) rescue nil
128
+ return nil unless time
129
+
130
+ time -= offset
131
+ ActiveRecord::Base.default_timezone == :utc ? time : time.getlocal
132
+ else
133
+ timezone = ActiveRecord::Base.default_timezone
134
+ Time.public_send(timezone, year, mon, mday, hour, min, sec, microsec) rescue nil
135
+ end
136
+ end
137
+
138
+ def fast_string_to_date(string)
139
+ if string =~ ISO_DATE
140
+ new_date $1.to_i, $2.to_i, $3.to_i
141
+ end
142
+ end
143
+
144
+ # Doesn't handle time zones.
145
+ def fast_string_to_time(string)
146
+ if string =~ ISO_DATETIME
147
+ microsec = ($7.to_r * 1_000_000).to_i
148
+ new_time $1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i, microsec
149
+ end
150
+ end
151
+
152
+ def fallback_string_to_date(string)
153
+ new_date(*::Date._parse(string, false).values_at(:year, :mon, :mday))
154
+ end
155
+
156
+ def fallback_string_to_time(string)
157
+ time_hash = Date._parse(string)
158
+ time_hash[:sec_fraction] = microseconds(time_hash)
159
+ time_hash[:year] *= -1 if time_hash[:zone] == 'BC'
160
+
161
+ new_time(*time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction, :offset))
162
+ end
163
+
164
+ end
165
+ end
166
+ end
@@ -5,10 +5,23 @@ module ActiveRecord
5
5
  # but apparently a database driver can return multiple types for a given
6
6
  # java.sql.Types constant. So this type converter uses some heuristics to try to pick
7
7
  # the best (most common) type to use. It's not great, it would be better to just
8
- # delegate to each database's existin AR adapter's native_database_types method, but I
8
+ # delegate to each database's existing AR adapter's native_database_types method, but I
9
9
  # wanted to try to do this in a way that didn't pull in all the other adapters as
10
- # dependencies. Suggestions appreciated.
10
+ # dependencies. Improvements appreciated.
11
11
  class JdbcTypeConverter
12
+
13
+ # @private
14
+ TEXT_TYPES = [ Jdbc::Types::LONGVARCHAR, Jdbc::Types::CLOB ]
15
+ private_constant :TEXT_TYPES if respond_to? :private_constant
16
+
17
+ # @private
18
+ FLOAT_TYPES = [ Jdbc::Types::FLOAT, Jdbc::Types::DOUBLE, Jdbc::Types::REAL ]
19
+ private_constant :FLOAT_TYPES if respond_to? :private_constant
20
+
21
+ # @private
22
+ BINARY_TYPES = [ Jdbc::Types::LONGVARBINARY,Jdbc::Types::BINARY,Jdbc::Types::BLOB ]
23
+ private_constant :BINARY_TYPES if respond_to? :private_constant
24
+
12
25
  # The basic ActiveRecord types, mapped to an array of procs that are used to #select
13
26
  # the best type. The procs are used as selectors in order until there is only one
14
27
  # type left. If all the selectors are applied and there is still more than one
@@ -18,7 +31,7 @@ module ActiveRecord
18
31
  lambda {|r| r['type_name'] =~ /^varchar/i},
19
32
  lambda {|r| r['type_name'] =~ /^varchar$/i},
20
33
  lambda {|r| r['type_name'] =~ /varying/i}],
21
- :text => [ lambda {|r| [Jdbc::Types::LONGVARCHAR, Jdbc::Types::CLOB].include?(r['data_type'].to_i)},
34
+ :text => [ lambda {|r| TEXT_TYPES.include?(r['data_type'].to_i)},
22
35
  lambda {|r| r['type_name'] =~ /^text$/i}, # For Informix
23
36
  lambda {|r| r['type_name'] =~ /sub_type 1$/i}, # For FireBird
24
37
  lambda {|r| r['type_name'] =~ /^(text|clob)$/i},
@@ -34,8 +47,8 @@ module ActiveRecord
34
47
  lambda {|r| r['type_name'] =~ /^number$/i},
35
48
  lambda {|r| r['type_name'] =~ /^real$/i},
36
49
  lambda {|r| r['precision'] == '38'},
37
- lambda {|r| r['data_type'] == '2'}],
38
- :float => [ lambda {|r| [Jdbc::Types::FLOAT,Jdbc::Types::DOUBLE, Jdbc::Types::REAL].include?(r['data_type'].to_i)},
50
+ lambda {|r| r['data_type'].to_i == Jdbc::Types::DECIMAL}],
51
+ :float => [ lambda {|r| FLOAT_TYPES.include?(r['data_type'].to_i)},
39
52
  lambda {|r| r['data_type'].to_i == Jdbc::Types::REAL}, #Prefer REAL to DOUBLE for Postgresql
40
53
  lambda {|r| r['type_name'] =~ /^float/i},
41
54
  lambda {|r| r['type_name'] =~ /^double$/i},
@@ -44,30 +57,34 @@ module ActiveRecord
44
57
  :datetime => [ lambda {|r| Jdbc::Types::TIMESTAMP == r['data_type'].to_i},
45
58
  lambda {|r| r['type_name'] =~ /^datetime$/i},
46
59
  lambda {|r| r['type_name'] =~ /^timestamp$/i},
60
+ lambda {|r| r['type_name'] =~ /^datetime.+/i},
47
61
  lambda {|r| r['type_name'] =~ /^date/i},
48
62
  lambda {|r| r['type_name'] =~ /^integer/i}], #Num of milliseconds for SQLite3 JDBC Driver
49
63
  :timestamp => [ lambda {|r| Jdbc::Types::TIMESTAMP == r['data_type'].to_i},
50
64
  lambda {|r| r['type_name'] =~ /^timestamp$/i},
51
- lambda {|r| r['type_name'] =~ /^datetime/i},
65
+ lambda {|r| r['type_name'] =~ /^datetime$/i},
66
+ lambda {|r| r['type_name'] =~ /^datetime.+/i},
52
67
  lambda {|r| r['type_name'] =~ /^date/i},
53
68
  lambda {|r| r['type_name'] =~ /^integer/i}], #Num of milliseconds for SQLite3 JDBC Driver
54
69
  :time => [ lambda {|r| Jdbc::Types::TIME == r['data_type'].to_i},
55
70
  lambda {|r| r['type_name'] =~ /^time$/i},
56
- lambda {|r| r['type_name'] =~ /^datetime/i}, # For Informix
71
+ lambda {|r| r['type_name'] =~ /^datetime$/i},
72
+ lambda {|r| r['type_name'] =~ /^datetime.+/i}, # For Informix
57
73
  lambda {|r| r['type_name'] =~ /^date/i},
58
74
  lambda {|r| r['type_name'] =~ /^integer/i}], #Num of milliseconds for SQLite3 JDBC Driver
59
75
  :date => [ lambda {|r| Jdbc::Types::DATE == r['data_type'].to_i},
60
76
  lambda {|r| r['type_name'] =~ /^date$/i},
61
77
  lambda {|r| r['type_name'] =~ /^date/i},
62
78
  lambda {|r| r['type_name'] =~ /^integer/i}], #Num of milliseconds for SQLite3 JDBC Driver3
63
- :binary => [ lambda {|r| [Jdbc::Types::LONGVARBINARY,Jdbc::Types::BINARY,Jdbc::Types::BLOB].include?(r['data_type'].to_i)},
79
+ :binary => [ lambda {|r| BINARY_TYPES.include?(r['data_type'].to_i)},
64
80
  lambda {|r| r['type_name'] =~ /^blob/i},
65
81
  lambda {|r| r['type_name'] =~ /sub_type 0$/i}, # For FireBird
66
82
  lambda {|r| r['type_name'] =~ /^varbinary$/i}, # We want this sucker for Mimer
67
83
  lambda {|r| r['type_name'] =~ /^binary$/i}, ],
68
- :boolean => [ lambda {|r| [Jdbc::Types::TINYINT].include?(r['data_type'].to_i)},
84
+ :boolean => [ lambda {|r| Jdbc::Types::BIT == r['data_type'].to_i && r['precision'].to_i == 1},
85
+ lambda {|r| Jdbc::Types::TINYINT == r['data_type'].to_i},
69
86
  lambda {|r| r['type_name'] =~ /^bool/i},
70
- lambda {|r| r['data_type'] == '-7'},
87
+ lambda {|r| r['data_type'].to_i == Jdbc::Types::BIT},
71
88
  lambda {|r| r['type_name'] =~ /^tinyint$/i},
72
89
  lambda {|r| r['type_name'] =~ /^decimal$/i},
73
90
  lambda {|r| r['type_name'] =~ /^integer$/i}]
@@ -87,25 +104,24 @@ module ActiveRecord
87
104
  set_limit_to_nonzero_precision(type_map[k], row)
88
105
  end
89
106
 
90
- AR_TO_JDBC_TYPES.keys.each do |k|
91
- typerow = choose_type(k)
92
- type_map[k] = { :name => typerow['type_name'].downcase }
93
- case k
107
+ AR_TO_JDBC_TYPES.keys.each do |ar_type|
108
+ typerow = choose_type(ar_type)
109
+ type_map[ar_type] = { :name => typerow['type_name'].downcase }
110
+ case ar_type
94
111
  when :integer, :string, :decimal
95
- set_limit_to_nonzero_precision(type_map[k], typerow)
112
+ set_limit_to_nonzero_precision(type_map[ar_type], typerow)
96
113
  when :boolean
97
- type_map[k][:limit] = 1
114
+ type_map[ar_type][:limit] = 1
98
115
  end
99
116
  end
100
117
  type_map
101
118
  end
102
119
 
103
120
  def choose_type(ar_type)
104
- procs = AR_TO_JDBC_TYPES[ar_type]
105
121
  types = @types
106
- procs.each do |p|
122
+ AR_TO_JDBC_TYPES[ar_type].each do |proc|
107
123
  new_types = types.reject {|r| r["data_type"].to_i == Jdbc::Types::OTHER}
108
- new_types = new_types.select(&p)
124
+ new_types = new_types.select(&proc)
109
125
  new_types = new_types.inject([]) do |typs,t|
110
126
  typs << t unless typs.detect {|el| el['type_name'] == t['type_name']}
111
127
  typs