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
@@ -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