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.
- checksums.yaml +7 -0
- data/.gitignore +35 -0
- data/.travis.yml +462 -0
- data/.yardopts +4 -0
- data/Appraisals +36 -0
- data/CONTRIBUTING.md +49 -0
- data/Gemfile +68 -0
- data/History.md +1191 -0
- data/LICENSE.txt +25 -0
- data/README.md +277 -0
- data/RUNNING_TESTS.md +88 -0
- data/Rakefile +298 -0
- data/Rakefile.jdbc +20 -0
- data/activerecord-jdbc-adapter.gemspec +63 -0
- data/lib/active_record/connection_adapters/as400_adapter.rb +2 -0
- data/lib/active_record/connection_adapters/db2_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/derby_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/firebird_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/h2_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/hsqldb_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/informix_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/jdbc_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/jndi_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/mariadb_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/mssql_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/mysql_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/oracle_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +1 -0
- data/lib/activerecord-jdbc-adapter.rb +1 -0
- data/lib/arel/visitors/compat.rb +64 -0
- data/lib/arel/visitors/db2.rb +137 -0
- data/lib/arel/visitors/derby.rb +112 -0
- data/lib/arel/visitors/firebird.rb +79 -0
- data/lib/arel/visitors/h2.rb +25 -0
- data/lib/arel/visitors/hsqldb.rb +32 -0
- data/lib/arel/visitors/postgresql_jdbc.rb +6 -0
- data/lib/arel/visitors/sql_server.rb +225 -0
- data/lib/arel/visitors/sql_server/ng42.rb +293 -0
- data/lib/arjdbc.rb +22 -0
- data/lib/arjdbc/db2.rb +4 -0
- data/lib/arjdbc/db2/adapter.rb +802 -0
- data/lib/arjdbc/db2/as400.rb +137 -0
- data/lib/arjdbc/db2/column.rb +177 -0
- data/lib/arjdbc/db2/connection_methods.rb +45 -0
- data/lib/arjdbc/derby.rb +3 -0
- data/lib/arjdbc/derby/active_record_patch.rb +13 -0
- data/lib/arjdbc/derby/adapter.rb +567 -0
- data/lib/arjdbc/derby/connection_methods.rb +16 -0
- data/lib/arjdbc/derby/schema_creation.rb +15 -0
- data/lib/arjdbc/discover.rb +104 -0
- data/lib/arjdbc/firebird.rb +4 -0
- data/lib/arjdbc/firebird/adapter.rb +468 -0
- data/lib/arjdbc/firebird/connection_methods.rb +20 -0
- data/lib/arjdbc/h2.rb +3 -0
- data/lib/arjdbc/h2/adapter.rb +335 -0
- data/lib/arjdbc/h2/connection_methods.rb +22 -0
- data/lib/arjdbc/hsqldb.rb +3 -0
- data/lib/arjdbc/hsqldb/adapter.rb +304 -0
- data/lib/arjdbc/hsqldb/connection_methods.rb +23 -0
- data/lib/arjdbc/hsqldb/explain_support.rb +35 -0
- data/lib/arjdbc/hsqldb/schema_creation.rb +11 -0
- data/lib/arjdbc/informix.rb +5 -0
- data/lib/arjdbc/informix/adapter.rb +160 -0
- data/lib/arjdbc/informix/connection_methods.rb +9 -0
- data/lib/arjdbc/jdbc.rb +62 -0
- data/lib/arjdbc/jdbc/adapter.rb +997 -0
- data/lib/arjdbc/jdbc/adapter_require.rb +46 -0
- data/lib/arjdbc/jdbc/arel_support.rb +149 -0
- data/lib/arjdbc/jdbc/base_ext.rb +34 -0
- data/lib/arjdbc/jdbc/callbacks.rb +52 -0
- data/lib/arjdbc/jdbc/column.rb +83 -0
- data/lib/arjdbc/jdbc/connection.rb +26 -0
- data/lib/arjdbc/jdbc/connection_methods.rb +59 -0
- data/lib/arjdbc/jdbc/driver.rb +44 -0
- data/lib/arjdbc/jdbc/error.rb +75 -0
- data/lib/arjdbc/jdbc/extension.rb +69 -0
- data/lib/arjdbc/jdbc/java.rb +13 -0
- data/lib/arjdbc/jdbc/type_cast.rb +154 -0
- data/lib/arjdbc/jdbc/type_converter.rb +142 -0
- data/lib/arjdbc/mssql.rb +7 -0
- data/lib/arjdbc/mssql/adapter.rb +822 -0
- data/lib/arjdbc/mssql/column.rb +207 -0
- data/lib/arjdbc/mssql/connection_methods.rb +72 -0
- data/lib/arjdbc/mssql/explain_support.rb +99 -0
- data/lib/arjdbc/mssql/limit_helpers.rb +231 -0
- data/lib/arjdbc/mssql/lock_methods.rb +77 -0
- data/lib/arjdbc/mssql/types.rb +343 -0
- data/lib/arjdbc/mssql/utils.rb +82 -0
- data/lib/arjdbc/mysql.rb +3 -0
- data/lib/arjdbc/mysql/adapter.rb +998 -0
- data/lib/arjdbc/mysql/bulk_change_table.rb +150 -0
- data/lib/arjdbc/mysql/column.rb +167 -0
- data/lib/arjdbc/mysql/connection_methods.rb +137 -0
- data/lib/arjdbc/mysql/explain_support.rb +82 -0
- data/lib/arjdbc/mysql/schema_creation.rb +58 -0
- data/lib/arjdbc/oracle.rb +4 -0
- data/lib/arjdbc/oracle/adapter.rb +968 -0
- data/lib/arjdbc/oracle/column.rb +136 -0
- data/lib/arjdbc/oracle/connection_methods.rb +21 -0
- data/lib/arjdbc/postgresql.rb +3 -0
- data/lib/arjdbc/postgresql/_bc_time_cast_patch.rb +21 -0
- data/lib/arjdbc/postgresql/adapter.rb +1498 -0
- data/lib/arjdbc/postgresql/base/array_parser.rb +95 -0
- data/lib/arjdbc/postgresql/base/oid.rb +412 -0
- data/lib/arjdbc/postgresql/base/pgconn.rb +8 -0
- data/lib/arjdbc/postgresql/base/schema_definitions.rb +132 -0
- data/lib/arjdbc/postgresql/column.rb +640 -0
- data/lib/arjdbc/postgresql/connection_methods.rb +44 -0
- data/lib/arjdbc/postgresql/explain_support.rb +53 -0
- data/lib/arjdbc/postgresql/oid/bytea.rb +3 -0
- data/lib/arjdbc/postgresql/oid_types.rb +265 -0
- data/lib/arjdbc/postgresql/schema_creation.rb +60 -0
- data/lib/arjdbc/railtie.rb +11 -0
- data/lib/arjdbc/sqlite3.rb +3 -0
- data/lib/arjdbc/sqlite3/adapter.rb +654 -0
- data/lib/arjdbc/sqlite3/connection_methods.rb +36 -0
- data/lib/arjdbc/sqlite3/explain_support.rb +29 -0
- data/lib/arjdbc/sybase.rb +2 -0
- data/lib/arjdbc/sybase/adapter.rb +47 -0
- data/lib/arjdbc/tasks.rb +13 -0
- data/lib/arjdbc/tasks/database_tasks.rb +66 -0
- data/lib/arjdbc/tasks/databases.rake +91 -0
- data/lib/arjdbc/tasks/databases3.rake +239 -0
- data/lib/arjdbc/tasks/databases4.rake +39 -0
- data/lib/arjdbc/tasks/db2_database_tasks.rb +104 -0
- data/lib/arjdbc/tasks/derby_database_tasks.rb +95 -0
- data/lib/arjdbc/tasks/h2_database_tasks.rb +31 -0
- data/lib/arjdbc/tasks/hsqldb_database_tasks.rb +70 -0
- data/lib/arjdbc/tasks/jdbc_database_tasks.rb +169 -0
- data/lib/arjdbc/tasks/mssql_database_tasks.rb +46 -0
- data/lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb +297 -0
- data/lib/arjdbc/tasks/oracle_database_tasks.rb +65 -0
- data/lib/arjdbc/util/quoted_cache.rb +60 -0
- data/lib/arjdbc/util/serialized_attributes.rb +98 -0
- data/lib/arjdbc/util/table_copier.rb +108 -0
- data/lib/arjdbc/version.rb +8 -0
- data/lib/generators/jdbc/USAGE +9 -0
- data/lib/generators/jdbc/jdbc_generator.rb +17 -0
- data/pom.xml +285 -0
- data/rails_generators/jdbc_generator.rb +15 -0
- data/rails_generators/templates/config/initializers/jdbc.rb +10 -0
- data/rails_generators/templates/lib/tasks/jdbc.rake +11 -0
- data/rakelib/01-tomcat.rake +51 -0
- data/rakelib/02-test.rake +151 -0
- data/rakelib/bundler_ext.rb +11 -0
- data/rakelib/db.rake +58 -0
- data/rakelib/rails.rake +77 -0
- data/src/java/arjdbc/ArJdbcModule.java +288 -0
- data/src/java/arjdbc/db2/DB2Module.java +77 -0
- data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +128 -0
- data/src/java/arjdbc/derby/DerbyModule.java +180 -0
- data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +153 -0
- data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +190 -0
- data/src/java/arjdbc/h2/H2Module.java +50 -0
- data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +86 -0
- data/src/java/arjdbc/hsqldb/HSQLDBModule.java +74 -0
- data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +76 -0
- data/src/java/arjdbc/jdbc/AdapterJavaService.java +43 -0
- data/src/java/arjdbc/jdbc/Callable.java +44 -0
- data/src/java/arjdbc/jdbc/ConnectionFactory.java +77 -0
- data/src/java/arjdbc/jdbc/DataSourceConnectionFactory.java +156 -0
- data/src/java/arjdbc/jdbc/DriverConnectionFactory.java +63 -0
- data/src/java/arjdbc/jdbc/DriverWrapper.java +128 -0
- data/src/java/arjdbc/jdbc/JdbcConnectionFactory.java +32 -0
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +4541 -0
- data/src/java/arjdbc/jdbc/SQLBlock.java +54 -0
- data/src/java/arjdbc/jdbc/WithResultSet.java +37 -0
- data/src/java/arjdbc/mssql/MSSQLModule.java +91 -0
- data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +193 -0
- data/src/java/arjdbc/mysql/MySQLModule.java +140 -0
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +456 -0
- data/src/java/arjdbc/oracle/OracleModule.java +81 -0
- data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +477 -0
- data/src/java/arjdbc/postgresql/ByteaUtils.java +171 -0
- data/src/java/arjdbc/postgresql/DriverImplementation.java +78 -0
- data/src/java/arjdbc/postgresql/PGDriverImplementation.java +535 -0
- data/src/java/arjdbc/postgresql/PostgreSQLModule.java +189 -0
- data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +489 -0
- data/src/java/arjdbc/sqlite3/SQLite3Module.java +93 -0
- data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +405 -0
- data/src/java/arjdbc/util/CallResultSet.java +826 -0
- data/src/java/arjdbc/util/DateTimeUtils.java +517 -0
- data/src/java/arjdbc/util/NumberUtils.java +50 -0
- data/src/java/arjdbc/util/ObjectSupport.java +65 -0
- data/src/java/arjdbc/util/QuotingUtils.java +139 -0
- data/src/java/arjdbc/util/StringCache.java +60 -0
- data/src/java/arjdbc/util/StringHelper.java +155 -0
- 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
|