activerecord-jdbc-adapter-ficoh 1.3.21-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +35 -0
  3. data/.travis.yml +462 -0
  4. data/.yardopts +4 -0
  5. data/Appraisals +36 -0
  6. data/CONTRIBUTING.md +49 -0
  7. data/Gemfile +68 -0
  8. data/History.md +1191 -0
  9. data/LICENSE.txt +25 -0
  10. data/README.md +277 -0
  11. data/RUNNING_TESTS.md +88 -0
  12. data/Rakefile +298 -0
  13. data/Rakefile.jdbc +20 -0
  14. data/activerecord-jdbc-adapter.gemspec +63 -0
  15. data/lib/active_record/connection_adapters/as400_adapter.rb +2 -0
  16. data/lib/active_record/connection_adapters/db2_adapter.rb +1 -0
  17. data/lib/active_record/connection_adapters/derby_adapter.rb +1 -0
  18. data/lib/active_record/connection_adapters/firebird_adapter.rb +1 -0
  19. data/lib/active_record/connection_adapters/h2_adapter.rb +1 -0
  20. data/lib/active_record/connection_adapters/hsqldb_adapter.rb +1 -0
  21. data/lib/active_record/connection_adapters/informix_adapter.rb +1 -0
  22. data/lib/active_record/connection_adapters/jdbc_adapter.rb +1 -0
  23. data/lib/active_record/connection_adapters/jndi_adapter.rb +1 -0
  24. data/lib/active_record/connection_adapters/mariadb_adapter.rb +1 -0
  25. data/lib/active_record/connection_adapters/mssql_adapter.rb +1 -0
  26. data/lib/active_record/connection_adapters/mysql2_adapter.rb +1 -0
  27. data/lib/active_record/connection_adapters/mysql_adapter.rb +1 -0
  28. data/lib/active_record/connection_adapters/oracle_adapter.rb +1 -0
  29. data/lib/active_record/connection_adapters/postgresql_adapter.rb +1 -0
  30. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +1 -0
  31. data/lib/active_record/connection_adapters/sqlserver_adapter.rb +1 -0
  32. data/lib/activerecord-jdbc-adapter.rb +1 -0
  33. data/lib/arel/visitors/compat.rb +64 -0
  34. data/lib/arel/visitors/db2.rb +137 -0
  35. data/lib/arel/visitors/derby.rb +112 -0
  36. data/lib/arel/visitors/firebird.rb +79 -0
  37. data/lib/arel/visitors/h2.rb +25 -0
  38. data/lib/arel/visitors/hsqldb.rb +32 -0
  39. data/lib/arel/visitors/postgresql_jdbc.rb +6 -0
  40. data/lib/arel/visitors/sql_server.rb +225 -0
  41. data/lib/arel/visitors/sql_server/ng42.rb +293 -0
  42. data/lib/arjdbc.rb +22 -0
  43. data/lib/arjdbc/db2.rb +4 -0
  44. data/lib/arjdbc/db2/adapter.rb +802 -0
  45. data/lib/arjdbc/db2/as400.rb +137 -0
  46. data/lib/arjdbc/db2/column.rb +177 -0
  47. data/lib/arjdbc/db2/connection_methods.rb +45 -0
  48. data/lib/arjdbc/derby.rb +3 -0
  49. data/lib/arjdbc/derby/active_record_patch.rb +13 -0
  50. data/lib/arjdbc/derby/adapter.rb +567 -0
  51. data/lib/arjdbc/derby/connection_methods.rb +16 -0
  52. data/lib/arjdbc/derby/schema_creation.rb +15 -0
  53. data/lib/arjdbc/discover.rb +104 -0
  54. data/lib/arjdbc/firebird.rb +4 -0
  55. data/lib/arjdbc/firebird/adapter.rb +468 -0
  56. data/lib/arjdbc/firebird/connection_methods.rb +20 -0
  57. data/lib/arjdbc/h2.rb +3 -0
  58. data/lib/arjdbc/h2/adapter.rb +335 -0
  59. data/lib/arjdbc/h2/connection_methods.rb +22 -0
  60. data/lib/arjdbc/hsqldb.rb +3 -0
  61. data/lib/arjdbc/hsqldb/adapter.rb +304 -0
  62. data/lib/arjdbc/hsqldb/connection_methods.rb +23 -0
  63. data/lib/arjdbc/hsqldb/explain_support.rb +35 -0
  64. data/lib/arjdbc/hsqldb/schema_creation.rb +11 -0
  65. data/lib/arjdbc/informix.rb +5 -0
  66. data/lib/arjdbc/informix/adapter.rb +160 -0
  67. data/lib/arjdbc/informix/connection_methods.rb +9 -0
  68. data/lib/arjdbc/jdbc.rb +62 -0
  69. data/lib/arjdbc/jdbc/adapter.rb +997 -0
  70. data/lib/arjdbc/jdbc/adapter_require.rb +46 -0
  71. data/lib/arjdbc/jdbc/arel_support.rb +149 -0
  72. data/lib/arjdbc/jdbc/base_ext.rb +34 -0
  73. data/lib/arjdbc/jdbc/callbacks.rb +52 -0
  74. data/lib/arjdbc/jdbc/column.rb +83 -0
  75. data/lib/arjdbc/jdbc/connection.rb +26 -0
  76. data/lib/arjdbc/jdbc/connection_methods.rb +59 -0
  77. data/lib/arjdbc/jdbc/driver.rb +44 -0
  78. data/lib/arjdbc/jdbc/error.rb +75 -0
  79. data/lib/arjdbc/jdbc/extension.rb +69 -0
  80. data/lib/arjdbc/jdbc/java.rb +13 -0
  81. data/lib/arjdbc/jdbc/type_cast.rb +154 -0
  82. data/lib/arjdbc/jdbc/type_converter.rb +142 -0
  83. data/lib/arjdbc/mssql.rb +7 -0
  84. data/lib/arjdbc/mssql/adapter.rb +822 -0
  85. data/lib/arjdbc/mssql/column.rb +207 -0
  86. data/lib/arjdbc/mssql/connection_methods.rb +72 -0
  87. data/lib/arjdbc/mssql/explain_support.rb +99 -0
  88. data/lib/arjdbc/mssql/limit_helpers.rb +231 -0
  89. data/lib/arjdbc/mssql/lock_methods.rb +77 -0
  90. data/lib/arjdbc/mssql/types.rb +343 -0
  91. data/lib/arjdbc/mssql/utils.rb +82 -0
  92. data/lib/arjdbc/mysql.rb +3 -0
  93. data/lib/arjdbc/mysql/adapter.rb +998 -0
  94. data/lib/arjdbc/mysql/bulk_change_table.rb +150 -0
  95. data/lib/arjdbc/mysql/column.rb +167 -0
  96. data/lib/arjdbc/mysql/connection_methods.rb +137 -0
  97. data/lib/arjdbc/mysql/explain_support.rb +82 -0
  98. data/lib/arjdbc/mysql/schema_creation.rb +58 -0
  99. data/lib/arjdbc/oracle.rb +4 -0
  100. data/lib/arjdbc/oracle/adapter.rb +968 -0
  101. data/lib/arjdbc/oracle/column.rb +136 -0
  102. data/lib/arjdbc/oracle/connection_methods.rb +21 -0
  103. data/lib/arjdbc/postgresql.rb +3 -0
  104. data/lib/arjdbc/postgresql/_bc_time_cast_patch.rb +21 -0
  105. data/lib/arjdbc/postgresql/adapter.rb +1498 -0
  106. data/lib/arjdbc/postgresql/base/array_parser.rb +95 -0
  107. data/lib/arjdbc/postgresql/base/oid.rb +412 -0
  108. data/lib/arjdbc/postgresql/base/pgconn.rb +8 -0
  109. data/lib/arjdbc/postgresql/base/schema_definitions.rb +132 -0
  110. data/lib/arjdbc/postgresql/column.rb +640 -0
  111. data/lib/arjdbc/postgresql/connection_methods.rb +44 -0
  112. data/lib/arjdbc/postgresql/explain_support.rb +53 -0
  113. data/lib/arjdbc/postgresql/oid/bytea.rb +3 -0
  114. data/lib/arjdbc/postgresql/oid_types.rb +265 -0
  115. data/lib/arjdbc/postgresql/schema_creation.rb +60 -0
  116. data/lib/arjdbc/railtie.rb +11 -0
  117. data/lib/arjdbc/sqlite3.rb +3 -0
  118. data/lib/arjdbc/sqlite3/adapter.rb +654 -0
  119. data/lib/arjdbc/sqlite3/connection_methods.rb +36 -0
  120. data/lib/arjdbc/sqlite3/explain_support.rb +29 -0
  121. data/lib/arjdbc/sybase.rb +2 -0
  122. data/lib/arjdbc/sybase/adapter.rb +47 -0
  123. data/lib/arjdbc/tasks.rb +13 -0
  124. data/lib/arjdbc/tasks/database_tasks.rb +66 -0
  125. data/lib/arjdbc/tasks/databases.rake +91 -0
  126. data/lib/arjdbc/tasks/databases3.rake +239 -0
  127. data/lib/arjdbc/tasks/databases4.rake +39 -0
  128. data/lib/arjdbc/tasks/db2_database_tasks.rb +104 -0
  129. data/lib/arjdbc/tasks/derby_database_tasks.rb +95 -0
  130. data/lib/arjdbc/tasks/h2_database_tasks.rb +31 -0
  131. data/lib/arjdbc/tasks/hsqldb_database_tasks.rb +70 -0
  132. data/lib/arjdbc/tasks/jdbc_database_tasks.rb +169 -0
  133. data/lib/arjdbc/tasks/mssql_database_tasks.rb +46 -0
  134. data/lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb +297 -0
  135. data/lib/arjdbc/tasks/oracle_database_tasks.rb +65 -0
  136. data/lib/arjdbc/util/quoted_cache.rb +60 -0
  137. data/lib/arjdbc/util/serialized_attributes.rb +98 -0
  138. data/lib/arjdbc/util/table_copier.rb +108 -0
  139. data/lib/arjdbc/version.rb +8 -0
  140. data/lib/generators/jdbc/USAGE +9 -0
  141. data/lib/generators/jdbc/jdbc_generator.rb +17 -0
  142. data/pom.xml +285 -0
  143. data/rails_generators/jdbc_generator.rb +15 -0
  144. data/rails_generators/templates/config/initializers/jdbc.rb +10 -0
  145. data/rails_generators/templates/lib/tasks/jdbc.rake +11 -0
  146. data/rakelib/01-tomcat.rake +51 -0
  147. data/rakelib/02-test.rake +151 -0
  148. data/rakelib/bundler_ext.rb +11 -0
  149. data/rakelib/db.rake +58 -0
  150. data/rakelib/rails.rake +77 -0
  151. data/src/java/arjdbc/ArJdbcModule.java +288 -0
  152. data/src/java/arjdbc/db2/DB2Module.java +77 -0
  153. data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +128 -0
  154. data/src/java/arjdbc/derby/DerbyModule.java +180 -0
  155. data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +153 -0
  156. data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +190 -0
  157. data/src/java/arjdbc/h2/H2Module.java +50 -0
  158. data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +86 -0
  159. data/src/java/arjdbc/hsqldb/HSQLDBModule.java +74 -0
  160. data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +76 -0
  161. data/src/java/arjdbc/jdbc/AdapterJavaService.java +43 -0
  162. data/src/java/arjdbc/jdbc/Callable.java +44 -0
  163. data/src/java/arjdbc/jdbc/ConnectionFactory.java +77 -0
  164. data/src/java/arjdbc/jdbc/DataSourceConnectionFactory.java +156 -0
  165. data/src/java/arjdbc/jdbc/DriverConnectionFactory.java +63 -0
  166. data/src/java/arjdbc/jdbc/DriverWrapper.java +128 -0
  167. data/src/java/arjdbc/jdbc/JdbcConnectionFactory.java +32 -0
  168. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +4541 -0
  169. data/src/java/arjdbc/jdbc/SQLBlock.java +54 -0
  170. data/src/java/arjdbc/jdbc/WithResultSet.java +37 -0
  171. data/src/java/arjdbc/mssql/MSSQLModule.java +91 -0
  172. data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +193 -0
  173. data/src/java/arjdbc/mysql/MySQLModule.java +140 -0
  174. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +456 -0
  175. data/src/java/arjdbc/oracle/OracleModule.java +81 -0
  176. data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +477 -0
  177. data/src/java/arjdbc/postgresql/ByteaUtils.java +171 -0
  178. data/src/java/arjdbc/postgresql/DriverImplementation.java +78 -0
  179. data/src/java/arjdbc/postgresql/PGDriverImplementation.java +535 -0
  180. data/src/java/arjdbc/postgresql/PostgreSQLModule.java +189 -0
  181. data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +489 -0
  182. data/src/java/arjdbc/sqlite3/SQLite3Module.java +93 -0
  183. data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +405 -0
  184. data/src/java/arjdbc/util/CallResultSet.java +826 -0
  185. data/src/java/arjdbc/util/DateTimeUtils.java +517 -0
  186. data/src/java/arjdbc/util/NumberUtils.java +50 -0
  187. data/src/java/arjdbc/util/ObjectSupport.java +65 -0
  188. data/src/java/arjdbc/util/QuotingUtils.java +139 -0
  189. data/src/java/arjdbc/util/StringCache.java +60 -0
  190. data/src/java/arjdbc/util/StringHelper.java +155 -0
  191. metadata +288 -0
@@ -0,0 +1,39 @@
1
+ module ActiveRecord::Tasks
2
+
3
+ DatabaseTasks.module_eval do
4
+
5
+ # patched to adapt jdbc configuration
6
+ def each_current_configuration(environment)
7
+ environments = [environment]
8
+ environments << 'test' if environment == 'development'
9
+
10
+ configurations = ActiveRecord::Base.configurations.values_at(*environments)
11
+ configurations.compact.each do |config|
12
+ yield adapt_jdbc_config(config) unless config['database'].blank?
13
+ end
14
+ end
15
+
16
+ # patched to adapt jdbc configuration
17
+ def each_local_configuration
18
+ ActiveRecord::Base.configurations.each_value do |config|
19
+ next unless config['database']
20
+
21
+ if local_database?(config)
22
+ yield adapt_jdbc_config(config)
23
+ else
24
+ $stderr.puts "This task only modifies local databases. #{config['database']} is on a remote host."
25
+ end
26
+ end
27
+ end
28
+
29
+ end
30
+
31
+ MySQLDatabaseTasks.class_eval do
32
+
33
+ def error_class
34
+ ActiveRecord::JDBCError
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -0,0 +1,104 @@
1
+ require 'arjdbc/tasks/jdbc_database_tasks'
2
+
3
+ module ArJdbc
4
+ module Tasks
5
+ class DB2DatabaseTasks < JdbcDatabaseTasks
6
+
7
+ def create
8
+ raise "AR-JDBC adapter 'DB2' does not support create_database"
9
+ end
10
+
11
+ def purge
12
+ establish_connection(config)
13
+ connection.recreate_database
14
+ end
15
+
16
+ # NOTE: does not work correctly (on non AS400) due driver meta data issue
17
+ #
18
+ # also try db2move e.g. `db2move SAMPLE EXPORT -sn db2inst`
19
+ # - where SAMPLE is the database name
20
+ # - and -sn specified schema name
21
+ #
22
+
23
+ def structure_dump(filename)
24
+ establish_connection(config)
25
+ dump = File.open(filename, "w:utf-8")
26
+
27
+ schema_name = connection.schema.upcase if connection.schema
28
+ meta_data = connection.jdbc_connection.meta_data
29
+ tables_rs = meta_data.getTables(nil, schema_name, nil, ["TABLE"].to_java(:String))
30
+
31
+ have_scale = ArJdbc::DB2::HAVE_SCALE
32
+ have_precision = ArJdbc::DB2::HAVE_LIMIT + ArJdbc::DB2::HAVE_LIMIT
33
+
34
+ while tables_rs.next
35
+ table_name = tables_rs.getString('TABLE_NAME')
36
+ dump << "CREATE TABLE #{connection.quote_table_name(table_name)} (\n"
37
+
38
+ cols_rs = meta_data.getColumns(nil, schema_name, table_name, nil)
39
+ begin
40
+ first_col = true
41
+ while cols_rs.next
42
+ column_name = cols_rs.getString(4)
43
+ default = cols_rs.getString(13)
44
+ default = default.empty? ? "" : " DEFAULT #{default}" if default
45
+ type = cols_rs.getString(6)
46
+ precision, scale = cols_rs.getString(7), cols_rs.getString(9)
47
+ column_size = ""
48
+ if scale && have_scale.include?(type)
49
+ column_size = "(#{precision},#{scale})"
50
+ elsif precision && have_precision.include?(type)
51
+ column_size = "(#{precision})"
52
+ end
53
+ nulling = ( cols_rs.getString(18) == 'NO' ? " NOT NULL" : nil )
54
+ autoinc = ( cols_rs.getString(23) == 'YES' ? " GENERATED ALWAYS AS IDENTITY" : nil )
55
+
56
+ create_column = connection.quote_column_name(column_name)
57
+ create_column << " #{type}"
58
+ create_column << column_size
59
+ create_column << nulling.to_s
60
+ create_column << default.to_s
61
+ create_column << autoinc.to_s
62
+
63
+ create_column = first_col ? " #{create_column}" : ",\n #{create_column}"
64
+ dump << create_column
65
+
66
+ first_col = false
67
+ end
68
+ ensure
69
+ cols_rs.close
70
+ end
71
+
72
+ dump << "\n);\n\n"
73
+
74
+ pk_rs = meta_data.getPrimaryKeys(nil, schema_name, table_name)
75
+ primary_keys = {}
76
+ begin
77
+ while pk_rs.next
78
+ name = pk_rs.getString(6)
79
+ primary_keys[name] ||= []
80
+ primary_keys[name] << pk_rs.getString(4)
81
+ end
82
+ ensure
83
+ pk_rs.close
84
+ end
85
+ primary_keys.each do |name, cols|
86
+ dump << "ALTER TABLE #{connection.quote_table_name(table_name)}\n"
87
+ dump << " ADD CONSTRAINT #{name}\n"
88
+ dump << " PRIMARY KEY (#{cols.join(', ')});\n\n"
89
+ end
90
+ end
91
+
92
+ dump.close
93
+ end
94
+
95
+ def structure_load(filename)
96
+ establish_connection(config)
97
+ IO.read(filename).split(/;\n*/m).each do |ddl|
98
+ connection.execute ddl.sub(/;$/, '')
99
+ end
100
+ end
101
+
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,95 @@
1
+ require 'arjdbc/tasks/jdbc_database_tasks'
2
+
3
+ module ArJdbc
4
+ module Tasks
5
+ class DerbyDatabaseTasks < JdbcDatabaseTasks
6
+
7
+ def create
8
+ establish_connection(config)
9
+ ActiveRecord::Base.connection
10
+ end
11
+
12
+ def drop
13
+ db_dir = expand_path resolve_database(config, true)
14
+ if File.exist?(db_dir)
15
+ FileUtils.rm_r(db_dir)
16
+ FileUtils.rmdir(db_dir) rescue nil
17
+ end
18
+ end
19
+
20
+ SIZEABLE = %w( VARCHAR CLOB BLOB )
21
+
22
+ def structure_dump(filename)
23
+ establish_connection(config)
24
+ dump = File.open(filename, "w:utf-8")
25
+
26
+ meta_data = connection.jdbc_connection.meta_data
27
+ tables_rs = meta_data.getTables(nil, nil, nil, ["TABLE"].to_java(:String))
28
+
29
+ while tables_rs.next
30
+ table_name = tables_rs.getString('TABLE_NAME') # getString(3)
31
+ dump << "CREATE TABLE #{connection.quote_table_name(table_name)} (\n"
32
+
33
+ columns_rs = meta_data.getColumns(nil, nil, table_name, nil)
34
+ first_col = true
35
+ while columns_rs.next
36
+ column_name = columns_rs.getString(4)
37
+ default = columns_rs.getString(13)
38
+ if default =~ /^GENERATED_/
39
+ default = column_auto_increment_def(table_name, column_name)
40
+ elsif default
41
+ default = " DEFAULT #{default}"
42
+ end
43
+ type = columns_rs.getString(6)
44
+ column_size = columns_rs.getString(7)
45
+ nulling = ( columns_rs.getString(18) == 'NO' ? " NOT NULL" : nil )
46
+
47
+ create_column = connection.quote_column_name(column_name)
48
+ create_column << " #{type}"
49
+ create_column << ( SIZEABLE.include?(type) ? "(#{column_size})" : "" )
50
+ create_column << nulling.to_s
51
+ create_column << default.to_s
52
+
53
+ create_column = first_col ? " #{create_column}" : ",\n #{create_column}"
54
+ dump << create_column
55
+
56
+ first_col = false
57
+ end
58
+ dump << "\n);\n\n"
59
+ end
60
+
61
+ dump.close
62
+ end
63
+
64
+ def structure_load(filename)
65
+ establish_connection(config)
66
+ IO.read(filename).split(/;\n*/m).each { |ddl| connection.execute(ddl) }
67
+ end
68
+
69
+ private
70
+
71
+ AUTO_INCREMENT_SQL = '' <<
72
+ "SELECT AUTOINCREMENTSTART, AUTOINCREMENTINC, COLUMNNAME, REFERENCEID, COLUMNDEFAULT " <<
73
+ "FROM SYS.SYSCOLUMNS WHERE REFERENCEID = " <<
74
+ "(SELECT T.TABLEID FROM SYS.SYSTABLES T WHERE T.TABLENAME = '%s') AND COLUMNNAME = '%s'"
75
+
76
+ def column_auto_increment_def(table_name, column_name)
77
+ sql = AUTO_INCREMENT_SQL % [ table_name, column_name ]
78
+ if data = connection.execute(sql).first
79
+ if start = data['autoincrementstart']
80
+ ai_def = ' GENERATED '
81
+ ai_def << ( data['columndefault'].nil? ? "ALWAYS" : "BY DEFAULT " )
82
+ ai_def << "AS IDENTITY (START WITH "
83
+ ai_def << start.to_s
84
+ ai_def << ", INCREMENT BY "
85
+ ai_def << data['autoincrementinc'].to_s
86
+ ai_def << ")"
87
+ return ai_def
88
+ end
89
+ end
90
+ ''
91
+ end
92
+
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,31 @@
1
+ require 'arjdbc/tasks/hsqldb_database_tasks'
2
+
3
+ module ArJdbc
4
+ module Tasks
5
+ class H2DatabaseTasks < HSQLDBDatabaseTasks
6
+
7
+ protected
8
+
9
+ # @override
10
+ def do_drop_database(config)
11
+ # ActiveRecord::JDBCError: org.h2.jdbc.JdbcSQLException:
12
+ # Database is already closed (to disable automatic closing at VM
13
+ # shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-170]:
14
+ # SHUTDOWN COMPACT
15
+ #
16
+ # connection.shutdown
17
+ connection.drop_database resolve_database(config)
18
+ end
19
+
20
+ # @override
21
+ def delete_database_files(config)
22
+ return unless db_base = database_base_name(config)
23
+ for suffix in [ '.h2,db', '.mv.db', '.lock.db', '.trace.db' ]
24
+ db_file = "#{db_base}#{suffix}"
25
+ File.delete(db_file) if File.exist?(db_file)
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,70 @@
1
+ require 'arjdbc/tasks/jdbc_database_tasks'
2
+
3
+ module ArJdbc
4
+ module Tasks
5
+ class HSQLDBDatabaseTasks < JdbcDatabaseTasks
6
+
7
+ def create
8
+ establish_connection(config)
9
+ ActiveRecord::Base.connection
10
+ end
11
+
12
+ def drop
13
+ error = nil
14
+ begin
15
+ establish_connection(config)
16
+ do_drop_database(config)
17
+ rescue => e
18
+ error = e
19
+ raise error
20
+ ensure
21
+ begin
22
+ keep_db_files = ENV['KEEP_DB_FILES'] && ENV['KEEP_DB_FILES'] != 'false'
23
+ delete_database_files(config) unless keep_db_files
24
+ rescue => e
25
+ raise e unless error
26
+ end
27
+ end
28
+ end
29
+ alias :purge :drop
30
+
31
+ protected
32
+
33
+ def do_drop_database(config)
34
+ connection.drop_database resolve_database(config)
35
+ connection.shutdown
36
+ end
37
+
38
+ def delete_database_files(config)
39
+ return unless db_base = database_base_name(config)
40
+ Dir.glob("#{db_base}.*").each do |file|
41
+ # test.hsqldb.tmp (dir)
42
+ # test.hsqldb.lck
43
+ # test.hsqldb.lobs
44
+ # test.hsqldb.script
45
+ # test.hsqldb.properties
46
+ if File.directory?(file)
47
+ FileUtils.rm_r(file)
48
+ FileUtils.rmdir(file)
49
+ else
50
+ FileUtils.rm(file)
51
+ end
52
+ end
53
+ if File.exist?(db_base)
54
+ FileUtils.rm_r(db_base)
55
+ FileUtils.rmdir(db_base)
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ def database_base_name(config)
62
+ db = resolve_database(config, true)
63
+ db[0, 4] == 'mem:' ? nil : begin
64
+ expand_path db[0, 5] == 'file:' ? db[5..-1] : db
65
+ end
66
+ end
67
+
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,169 @@
1
+ module ArJdbc
2
+ module Tasks
3
+ # Sharing task related code between AR 3.x and 4.x
4
+ #
5
+ # @note this class needs to conform to the API available since AR 4.0
6
+ # mostly to be usable with ActiveRecord::Tasks::DatabaseTasks module
7
+ class JdbcDatabaseTasks
8
+
9
+ attr_reader :configuration
10
+ alias_method :config, :configuration
11
+
12
+ def initialize(configuration)
13
+ @configuration = configuration
14
+ end
15
+
16
+ delegate :connection, :establish_connection, :to => ActiveRecord::Base
17
+
18
+ def create
19
+ begin
20
+ establish_connection(config)
21
+ ActiveRecord::Base.connection
22
+ if defined? ActiveRecord::Tasks::DatabaseAlreadyExists
23
+ raise ActiveRecord::Tasks::DatabaseAlreadyExists # AR-4.x
24
+ end # silence on AR < 4.0
25
+ rescue #=> error # database does not exists :
26
+ url = config['url']
27
+ url = $1 if url && url =~ /^(.*(?<!\/)\/)(?=\w)/
28
+
29
+ establish_connection(config.merge('database' => nil, 'url' => url))
30
+
31
+ unless connection.respond_to?(:create_database)
32
+ raise "AR-JDBC adapter '#{adapter_with_spec}' does not support create_database"
33
+ end
34
+ connection.create_database(resolve_database(config), config)
35
+
36
+ establish_connection(config)
37
+ end
38
+ end
39
+
40
+ def drop
41
+ establish_connection(config)
42
+ unless ActiveRecord::Base.connection.respond_to?(:drop_database)
43
+ raise "AR-JDBC adapter '#{adapter_with_spec}' does not support drop_database"
44
+ end
45
+ connection.drop_database resolve_database(config)
46
+ end
47
+
48
+ def purge
49
+ establish_connection(config) # :test
50
+ unless ActiveRecord::Base.connection.respond_to?(:recreate_database)
51
+ raise "AR-JDBC adapter '#{adapter_with_spec}' does not support recreate_database (purge)"
52
+ end
53
+ db_name = ActiveRecord::Base.connection.database_name
54
+ ActiveRecord::Base.connection.recreate_database(db_name, config)
55
+ end
56
+
57
+ def charset
58
+ establish_connection(config)
59
+ if connection.respond_to?(:charset)
60
+ puts connection.charset
61
+ elsif connection.respond_to?(:encoding)
62
+ puts connection.encoding
63
+ else
64
+ raise "AR-JDBC adapter '#{adapter_with_spec}' does not support charset/encoding"
65
+ end
66
+ end
67
+
68
+ def collation
69
+ establish_connection(config)
70
+ if connection.respond_to?(:collation)
71
+ puts connection.collation
72
+ else
73
+ raise "AR-JDBC adapter '#{adapter_with_spec}' does not support collation"
74
+ end
75
+ end
76
+
77
+ def structure_dump(filename)
78
+ establish_connection(config)
79
+ if connection.respond_to?(:structure_dump)
80
+ File.open(filename, "w:utf-8") { |f| f << connection.structure_dump }
81
+ else
82
+ raise "AR-JDBC adapter '#{adapter_with_spec}' does not support structure_dump"
83
+ end
84
+ end
85
+
86
+ def structure_load(filename)
87
+ establish_connection(config)
88
+ if connection.respond_to?(:structure_load)
89
+ connection.structure_load IO.read(filename)
90
+ else
91
+ #IO.read(filename).split(/;\n*/m).each do |ddl|
92
+ # connection.execute(ddl)
93
+ #end
94
+ raise "AR-JDBC adapter '#{adapter_with_spec}' does not support structure_load"
95
+ end
96
+ end
97
+
98
+ protected
99
+
100
+ def expand_path(path)
101
+ require 'pathname'
102
+ path = Pathname.new path
103
+ return path.to_s if path.absolute?
104
+ rails_root ? File.join(rails_root, path) : File.expand_path(path)
105
+ end
106
+
107
+ def resolve_database(config, file_paths = false)
108
+ config['database'] || resolve_database_from_url(config['url'] || '', file_paths)
109
+ end
110
+
111
+ def resolve_database_from_url(url, file_paths = false)
112
+ ( config = config_from_url(url, file_paths) ) ? config['database'] : nil
113
+ end
114
+
115
+ private
116
+
117
+ def config_from_url(url, file_paths = false)
118
+ match = url.match %r{
119
+ ^ jdbc:
120
+ ( [\w]+ ): # $1 protocol
121
+ (?: ([\w]+) : )? # $2 (sub-protocol)
122
+ (?://)?
123
+ (?: ([\w\-]*) (?: [/:] ([\w\-]*) )? @ (?://)? )? # user[:password]@ or user[/password]@ ($3 $4)
124
+ ( [\w\.\-]+ )? # $5 host (or database if there's nothing left)
125
+ (?: : (\d+) )? # $6 port if any
126
+ (?: :? (/?[\w\-\./~]+) [\?;]? )? ([^/]*?) $
127
+ # $7 database part (ends with '?' or ';') and $8 query string - properties
128
+ }x
129
+
130
+ return nil unless match
131
+
132
+ config = {}
133
+ config['_protocol'] = match[1]
134
+ config['_sub_protocol'] = match[2] if match[2]
135
+ config['username'] = match[3] if match[3]
136
+ config['password'] = match[4] if match[4]
137
+ host = match[5]; port = match[6]
138
+ database = match[7]
139
+ if database.nil? && port.nil?
140
+ config['database'] = database = host
141
+ else
142
+ config['host'] = host if host
143
+ config['port'] = port if port
144
+ config['database'] = database
145
+ end
146
+ if database && ! file_paths && database[0...1] == '/'
147
+ config['database'] = database[1..-1]
148
+ end
149
+ if query_string = match[8]
150
+ properties = query_string.split('&').inject({}) do |memo, pair|
151
+ pair = pair.split("="); memo[ pair[0] ] = pair[1]; memo
152
+ end
153
+ config['properties'] = properties
154
+ end
155
+ config
156
+ end
157
+
158
+ def adapter_with_spec
159
+ adapter, spec = config['adapter'], config['adapter_spec']
160
+ spec ? "#{adapter} (#{spec})" : adapter
161
+ end
162
+
163
+ def rails_root
164
+ defined?(Rails.root) ? Rails.root : ( RAILS_ROOT )
165
+ end
166
+
167
+ end
168
+ end
169
+ end