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,34 +1,59 @@
1
- # Don't need to load native sqlite3 adapter
2
- $LOADED_FEATURES << "active_record/connection_adapters/sqlite_adapter.rb"
3
- $LOADED_FEATURES << "active_record/connection_adapters/sqlite3_adapter.rb"
1
+ # frozen_string_literal: true
2
+ ArJdbc::ConnectionMethods.module_eval do
3
+ def sqlite3_connection(config)
4
+ config[:adapter_spec] ||= ::ArJdbc::SQLite3
5
+ config[:adapter_class] = ActiveRecord::ConnectionAdapters::SQLite3Adapter unless config.key?(:adapter_class)
4
6
 
5
- class ActiveRecord::Base
6
- class << self
7
- def sqlite3_connection(config)
8
- require "arjdbc/sqlite3"
7
+ return jndi_connection(config) if jndi_config?(config)
9
8
 
9
+ begin
10
+ require 'jdbc/sqlite3'
11
+ ::Jdbc::SQLite3.load_driver(:require) if defined?(::Jdbc::SQLite3.load_driver)
12
+ rescue LoadError # assuming driver.jar is on the class-path
13
+ end
14
+ config[:driver] ||= 'org.sqlite.JDBC'
15
+
16
+ begin
10
17
  parse_sqlite3_config!(config)
11
- database = config[:database]
12
- database = '' if database == ':memory:'
13
- config[:url] ||= "jdbc:sqlite:#{database}"
14
- config[:driver] ||= "org.sqlite.JDBC"
15
- config[:adapter_class] = ActiveRecord::ConnectionAdapters::SQLite3Adapter
16
- jdbc_connection(config)
18
+ rescue Errno::ENOENT => error
19
+ if error.message.include?('No such file or directory')
20
+ raise ActiveRecord::NoDatabaseError
21
+ else
22
+ raise
23
+ end
17
24
  end
18
25
 
19
- def parse_sqlite3_config!(config)
20
- config[:database] ||= config[:dbfile]
26
+ database = config[:database] # NOTE: "jdbc:sqlite::memory:" syntax is supported
27
+ config[:url] ||= "jdbc:sqlite:#{database == ':memory:' ? '' : database}"
28
+ config[:connection_alive_sql] ||= 'SELECT 1'
21
29
 
22
- # Allow database path relative to RAILS_ROOT, but only if
23
- # the database path is not the special path that tells
24
- # Sqlite to build a database only in memory.
25
- rails_root_defined = defined?(Rails.root) || Object.const_defined?(:RAILS_ROOT)
26
- if rails_root_defined && ':memory:' != config[:database]
27
- rails_root = defined?(Rails.root) ? Rails.root : RAILS_ROOT
28
- config[:database] = File.expand_path(config[:database], rails_root)
29
- end
30
+ timeout = config[:timeout]
31
+ if timeout && timeout.to_s !~ /\A\d+\Z/
32
+ raise TypeError.new "Timeout must be nil or a number (got: #{timeout})."
30
33
  end
31
34
 
32
- alias_method :jdbcsqlite3_connection, :sqlite3_connection
35
+ options = ( config[:properties] ||= {} )
36
+ options['busy_timeout'] ||= timeout unless timeout.nil?
37
+
38
+ jdbc_connection(config)
39
+ # rescue ActiveRecord::JDBCError => error
40
+ # if error.message =~ /path to .*? does not exist/ # path to '/foo/xxx/bar.db': '/foo/xxx' does not exist
41
+ # raise ActiveRecord::NoDatabaseError
42
+ # else
43
+ # raise
44
+ # end
33
45
  end
46
+ alias_method :jdbcsqlite3_connection, :sqlite3_connection
47
+
48
+ private
49
+
50
+ def parse_sqlite3_config!(config)
51
+ database = ( config[:database] ||= config[:dbfile] )
52
+ if ':memory:' != database
53
+ config[:database] = File.expand_path(database, Rails.root) if defined?(Rails.root)
54
+ dirname = File.dirname(database)
55
+ Dir.mkdir(dirname) unless File.directory?(dirname)
56
+ end
57
+ end
58
+
34
59
  end
@@ -1,2 +1,2 @@
1
- require 'arjdbc/jdbc'
2
- require 'arjdbc/sybase/adapter.rb'
1
+ require 'arjdbc'
2
+ require 'arjdbc/sybase/adapter'
@@ -31,12 +31,13 @@ module ArJdbc
31
31
  !@limit.nil? && @limit == 0
32
32
  end
33
33
 
34
- def modify_types(tp) #:nodoc:
35
- tp[:primary_key] = "NUMERIC(22,0) IDENTITY PRIMARY KEY"
36
- tp[:integer][:limit] = nil
37
- tp[:boolean] = {:name => "bit"}
38
- tp[:binary] = {:name => "image"}
39
- tp
34
+ def modify_types(types) # :nodoc:
35
+ super(types)
36
+ types[:primary_key] = "NUMERIC(22,0) IDENTITY PRIMARY KEY"
37
+ types[:integer][:limit] = nil
38
+ types[:boolean] = {:name => "bit"}
39
+ types[:binary] = {:name => "image"}
40
+ types
40
41
  end
41
42
 
42
43
  def remove_index(table_name, options = {})
@@ -0,0 +1,13 @@
1
+ if defined?(Rake.application) && Rake.application
2
+ skip = ENV["SKIP_AR_JDBC_RAKE_REDEFINES"] # jruby -J-Darjdbc.tasks.skip=true -S rake ...
3
+ if !(Java::JavaLang::Boolean.getBoolean('arjdbc.tasks.skip') || ( skip && skip != 'false' ))
4
+ databases_rake = File.expand_path('tasks/databases.rake', File.dirname(__FILE__))
5
+ if Rake.application.lookup("db:create")
6
+ load databases_rake # load the override tasks now
7
+ else # rails tasks not loaded yet; load as an import
8
+ Rake.application.add_import(databases_rake)
9
+ end
10
+ end
11
+ else
12
+ warn "ArJdbc: could not load rake tasks - rake not loaded ..."
13
+ end
@@ -0,0 +1,52 @@
1
+ module ArJdbc
2
+ module Tasks
3
+
4
+ if defined? ActiveRecord::Tasks::DatabaseTasks # AR-4.x
5
+
6
+ def self.register_tasks(pattern, task)
7
+ ActiveRecord::Tasks::DatabaseTasks.register_task(pattern, task)
8
+ end
9
+
10
+ # support adapter: mariadb (as if it were mysql)
11
+ register_tasks(/mariadb/, ActiveRecord::Tasks::MySQLDatabaseTasks)
12
+
13
+ else
14
+
15
+ @@tasks = {}
16
+
17
+ def self.register_tasks(pattern, task)
18
+ @@tasks[pattern] = task
19
+ end
20
+
21
+ def self.tasks_instance(config)
22
+ adapter = config['adapter']
23
+ key = @@tasks.keys.detect { |pattern| adapter[pattern] }
24
+ ( @@tasks[key] || JdbcDatabaseTasks ).new(config)
25
+ end
26
+
27
+ end
28
+
29
+ require 'arjdbc/tasks/jdbc_database_tasks'
30
+ require 'arjdbc/tasks/db2_database_tasks'
31
+ require 'arjdbc/tasks/derby_database_tasks'
32
+ require 'arjdbc/tasks/h2_database_tasks'
33
+ require 'arjdbc/tasks/hsqldb_database_tasks'
34
+ require 'arjdbc/tasks/mssql_database_tasks'
35
+
36
+ # re-invent built-in (but deprecated on 4.0) tasks :
37
+ register_tasks(/sqlserver/, MSSQLDatabaseTasks)
38
+ register_tasks(/mssql/, MSSQLDatabaseTasks) # (built-in) alias
39
+ # tasks for custom (JDBC) adapters :
40
+ register_tasks(/db2/, DB2DatabaseTasks)
41
+ register_tasks(/derby/, DerbyDatabaseTasks)
42
+ register_tasks(/h2/, H2DatabaseTasks)
43
+ register_tasks(/hsqldb/, HSQLDBDatabaseTasks)
44
+ # (default) generic JDBC task :
45
+ register_tasks(/^jdbc$/, JdbcDatabaseTasks)
46
+
47
+ # NOTE: no need to register "built-in" adapters such as MySQL
48
+ # - on 4.0 these are registered and will be instantiated
49
+ # - while on 2.3/3.x we keep the AR built-in task behavior
50
+
51
+ end
52
+ end
@@ -0,0 +1,91 @@
1
+ raise "ArJdbc needs rake 0.9.x or newer" unless Rake.const_defined?(:VERSION)
2
+
3
+ Rake::DSL.module_eval do
4
+
5
+ def redefine_task(*args, &block)
6
+ if Hash === args.first
7
+ task_name = args.first.keys[0]
8
+ old_prereqs = false # leave as specified
9
+ else
10
+ task_name = args.first; old_prereqs = []
11
+ # args[0] = { task_name => old_prereqs }
12
+ end
13
+
14
+ full_name = Rake::Task.scope_name(Rake.application.current_scope, task_name)
15
+
16
+ if old_task = Rake.application.lookup(task_name)
17
+ old_comment = old_task.full_comment
18
+ old_prereqs = old_task.prerequisites.dup if old_prereqs
19
+ old_actions = old_task.actions.dup
20
+ old_actions.shift # remove the main 'action' block - we're redefining it
21
+ # old_task.clear_prerequisites if old_prereqs
22
+ # old_task.clear_actions
23
+ # remove the (old) task instance from the application :
24
+ Rake.application.send(:instance_variable_get, :@tasks)[full_name.to_s] = nil
25
+ else
26
+ # raise "could not find rake task with (full) name '#{full_name}'"
27
+ end
28
+
29
+ new_task = task(*args, &block)
30
+ new_task.comment = old_comment if old_comment
31
+ new_task.actions.concat(old_actions) if old_actions
32
+ new_task.prerequisites.concat(old_prereqs) if old_prereqs
33
+ new_task
34
+ end
35
+
36
+ end
37
+
38
+ namespace :db do
39
+
40
+ def rails_env
41
+ defined?(Rails.env) ? Rails.env : ( RAILS_ENV || 'development' )
42
+ end
43
+
44
+ if defined? adapt_jdbc_config
45
+ ArJdbc.warn "double loading #{__FILE__} please delete lib/tasks/jdbc.rake if present!"
46
+ end
47
+
48
+ def adapt_jdbc_config(config)
49
+ return config unless config['adapter']
50
+ config.merge 'adapter' => config['adapter'].sub(/^jdbc/, '')
51
+ end
52
+
53
+ if defined? ActiveRecord::Tasks::DatabaseTasks # 4.0
54
+
55
+ def current_config(options = {})
56
+ ActiveRecord::Tasks::DatabaseTasks.current_config(options)
57
+ end
58
+
59
+ else # 3.x / 2.3
60
+
61
+ def current_config(options = {}) # not on 2.3
62
+ options = { :env => rails_env }.merge! options
63
+ if options[:config]
64
+ @current_config = options[:config]
65
+ else
66
+ @current_config ||= ENV['DATABASE_URL'] ?
67
+ database_url_config : ActiveRecord::Base.configurations[options[:env]]
68
+ end
69
+ end
70
+
71
+ def database_url_config(url = ENV['DATABASE_URL'])
72
+ # NOTE: ActiveRecord::ConnectionAdapters::ConnectionSpecification::Resolver
73
+ # since AR 4.0 that is handled by DatabaseTasks - only care about 2.3/3.x :
74
+ unless defined? ActiveRecord::Base::ConnectionSpecification::Resolver
75
+ raise "DATABASE_URL not supported on ActiveRecord #{ActiveRecord::VERSION::STRING}"
76
+ end
77
+ resolver = ActiveRecord::Base::ConnectionSpecification::Resolver.new(url, {})
78
+ resolver.spec.config.stringify_keys
79
+ end
80
+
81
+ end
82
+
83
+ end
84
+
85
+ require 'arjdbc/tasks/database_tasks'
86
+
87
+ if defined? ActiveRecord::Tasks::DatabaseTasks # 4.0
88
+ load File.expand_path('databases4.rake', File.dirname(__FILE__))
89
+ else # 3.x / 2.3
90
+ load File.expand_path('databases3.rake', File.dirname(__FILE__))
91
+ end
@@ -0,0 +1,215 @@
1
+ module ArJdbc
2
+ module Tasks
3
+ class << self
4
+
5
+ # API similar to ActiveRecord::Tasks::DatabaseTasks on AR 4.0
6
+
7
+ def create(config)
8
+ tasks_instance(config).create
9
+ end
10
+
11
+ def drop(config)
12
+ tasks_instance(config).drop
13
+ end
14
+
15
+ def purge(config)
16
+ tasks_instance(config).purge
17
+ end
18
+
19
+ def charset(config)
20
+ tasks_instance(config).charset
21
+ end
22
+
23
+ def collation(config)
24
+ tasks_instance(config).collation
25
+ end
26
+
27
+ def structure_dump(config, filename)
28
+ tasks_instance(config).structure_dump(filename)
29
+ end
30
+
31
+ def structure_load(config, filename)
32
+ tasks_instance(config).structure_load(filename)
33
+ end
34
+
35
+ end
36
+ end
37
+ end
38
+
39
+ namespace :db do
40
+
41
+ class << self
42
+ alias_method :_rails_create_database, :create_database
43
+ alias_method :_rails_drop_database, :drop_database
44
+ end
45
+
46
+ def create_database(config)
47
+ case config['adapter']
48
+ when /mysql2/
49
+ unless defined? Mysql2::Error
50
+ # NOTE: fake it for create_database(config)
51
+ Object.const_set :Mysql2, Module.new
52
+ Mysql2.const_set :Error, ActiveRecord::JDBCError
53
+ ActiveRecord::JDBCError.class_eval do
54
+ def error; self end # Mysql2::Error#error
55
+ end
56
+ end
57
+ _rails_create_database adapt_jdbc_config(config)
58
+ when /mysql/
59
+ unless defined? Mysql::Error
60
+ # NOTE: fake it for create_database(config)
61
+ Object.const_set :Mysql, Module.new
62
+ Mysql.const_set :Error, ActiveRecord::JDBCError
63
+ ActiveRecord::JDBCError.class_eval do
64
+ def error; self end # Mysql::Error#error
65
+ end
66
+ end
67
+ _rails_create_database adapt_jdbc_config(config)
68
+ when /postgresql|sqlite/
69
+ _rails_create_database adapt_jdbc_config(config)
70
+ else
71
+ ArJdbc::Tasks.create(config)
72
+ end
73
+ end
74
+
75
+ def drop_database(config)
76
+ case config['adapter']
77
+ when /mysql|postgresql|sqlite/
78
+ _rails_drop_database adapt_jdbc_config(config)
79
+ else
80
+ ArJdbc::Tasks.drop(config)
81
+ end
82
+ end
83
+
84
+ redefine_task :charset do # available on 2.3
85
+ ArJdbc::Tasks.charset ActiveRecord::Base.configurations[rails_env]
86
+ end
87
+
88
+ redefine_task :collation do # available on 2.3
89
+ ArJdbc::Tasks.collation ActiveRecord::Base.configurations[rails_env]
90
+ end
91
+
92
+ namespace :structure do
93
+
94
+ redefine_task :dump do
95
+ config = ActiveRecord::Base.configurations[rails_env] # current_config
96
+ filename = structure_sql
97
+
98
+ case config['adapter']
99
+ when /mysql/
100
+ ActiveRecord::Base.establish_connection(config)
101
+ File.open(filename, 'w:utf-8') { |f| f << ActiveRecord::Base.connection.structure_dump }
102
+ when /postgresql/
103
+ ActiveRecord::Base.establish_connection(config)
104
+
105
+ ENV['PGHOST'] = config['host'] if config['host']
106
+ ENV['PGPORT'] = config['port'].to_s if config['port']
107
+ ENV['PGPASSWORD'] = config['password'].to_s if config['password']
108
+ ENV['PGUSER'] = config['username'].to_s if config['username']
109
+
110
+ require 'shellwords'
111
+ search_path = config['schema_search_path']
112
+ unless search_path.blank?
113
+ search_path = search_path.split(",").map{ |part| "--schema=#{Shellwords.escape(part.strip)}" }.join(" ")
114
+ end
115
+ sh "pg_dump -i -s -x -O -f #{Shellwords.escape(filename)} #{search_path} #{Shellwords.escape(config['database'])}"
116
+
117
+ File.open(filename, 'a') { |f| f << "SET search_path TO #{ActiveRecord::Base.connection.schema_search_path};\n\n" }
118
+ when /sqlite/
119
+ dbfile = config['database']
120
+ sh "sqlite3 #{dbfile} .schema > #{filename}"
121
+ else
122
+ ActiveRecord::Base.establish_connection(config)
123
+ ArJdbc::Tasks.structure_dump(config, filename)
124
+ end
125
+
126
+ if ActiveRecord::Base.connection.supports_migrations?
127
+ File.open(filename, 'a') { |f| f << ActiveRecord::Base.connection.dump_schema_information }
128
+ end
129
+
130
+ end
131
+
132
+ redefine_task :load do
133
+ config = current_config
134
+ filename = structure_sql
135
+
136
+ case config['adapter']
137
+ when /mysql/
138
+ ActiveRecord::Base.establish_connection(config)
139
+ ActiveRecord::Base.connection.execute('SET foreign_key_checks = 0')
140
+ IO.read(filename).split("\n\n").each do |table|
141
+ ActiveRecord::Base.connection.execute(table)
142
+ end
143
+ when /postgresql/
144
+ ENV['PGHOST'] = config['host'] if config['host']
145
+ ENV['PGPORT'] = config['port'].to_s if config['port']
146
+ ENV['PGPASSWORD'] = config['password'].to_s if config['password']
147
+ ENV['PGUSER'] = config['username'].to_s if config['username']
148
+
149
+ `psql -f "#{filename}" #{config['database']}`
150
+ when /sqlite/
151
+ dbfile = config['database']
152
+ `sqlite3 #{dbfile} < "#{filename}"`
153
+ else
154
+ ArJdbc::Tasks.structure_load(config, filename)
155
+ end
156
+ end
157
+
158
+ def structure_sql
159
+ ENV['DB_STRUCTURE'] ||= begin
160
+ root = defined?(Rails.root) ? Rails.root : ( RAILS_ROOT rescue nil )
161
+ if ActiveRecord::VERSION::STRING > '3.2'
162
+ root ? File.join(root, "db", "structure.sql") : File.join("db", "structure.sql")
163
+ else
164
+ root ? File.join(root, "db/#{rails_env}_structure.sql") : "db/#{rails_env}_structure.sql"
165
+ end
166
+ end
167
+ end
168
+
169
+ end
170
+
171
+ namespace :test do
172
+
173
+ # desc "Recreate the test database from an existent structure.sql file"
174
+ redefine_task :load_structure => 'db:test:purge' do # not on 2.3
175
+ begin
176
+ current_config(:config => ActiveRecord::Base.configurations['test'])
177
+ Rake::Task["db:structure:load"].invoke
178
+ ensure
179
+ current_config(:config => nil)
180
+ end
181
+ end
182
+
183
+ # desc "Recreate the test database from a fresh structure.sql file"
184
+ redefine_task :clone_structure => [ "db:structure:dump", "db:test:load_structure" ]
185
+ # same as on 3.2 - but this task gets changed on 2.3 by depending on :load_structure
186
+
187
+ # desc "Empty the test database"
188
+ redefine_task :purge do
189
+ config = ActiveRecord::Base.configurations['test']
190
+ case config['adapter']
191
+ when /mysql/
192
+ ActiveRecord::Base.establish_connection(:test)
193
+ options = mysql_creation_options(config) rescue config
194
+ ActiveRecord::Base.connection.recreate_database(config['database'], options)
195
+ when /postgresql/
196
+ ActiveRecord::Base.clear_active_connections!
197
+ # drop_database(config) :
198
+ ActiveRecord::Base.establish_connection(config.merge('database' => 'postgres', 'schema_search_path' => 'public'))
199
+ ActiveRecord::Base.connection.drop_database config['database']
200
+ # create_database(config) :
201
+ encoding = config[:encoding] || ENV['CHARSET'] || 'utf8'
202
+ ActiveRecord::Base.connection.create_database(config['database'], config.merge('encoding' => encoding))
203
+ when /sqlite/
204
+ dbfile = config['database']
205
+ File.delete(dbfile) if File.exist?(dbfile)
206
+ else
207
+ ArJdbc::Tasks.purge(config)
208
+ end
209
+ end
210
+ # only does (:purge => :environment) on AR < 3.2
211
+ task :purge => :load_config if Rake::Task.task_defined?(:load_config)
212
+
213
+ end
214
+
215
+ end