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.
- checksums.yaml +7 -0
- data/.gitignore +33 -0
- data/.travis.yml +79 -0
- data/.yardopts +4 -0
- data/CONTRIBUTING.md +50 -0
- data/Gemfile +91 -0
- data/History.md +1191 -0
- data/LICENSE.txt +22 -17
- data/README.md +169 -0
- data/RUNNING_TESTS.md +127 -0
- data/Rakefile +294 -5
- data/Rakefile.jdbc +20 -0
- data/activerecord-jdbc-adapter.gemspec +55 -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/firebird_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/mariadb_adapter.rb +1 -0
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +1 -0
- data/lib/activerecord-jdbc-adapter.rb +0 -5
- data/lib/arel/visitors/compat.rb +60 -0
- data/lib/arel/visitors/db2.rb +128 -6
- data/lib/arel/visitors/derby.rb +103 -10
- data/lib/arel/visitors/firebird.rb +79 -0
- data/lib/arel/visitors/h2.rb +25 -0
- data/lib/arel/visitors/hsqldb.rb +18 -10
- 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 +11 -21
- data/lib/arjdbc/abstract/connection_management.rb +35 -0
- data/lib/arjdbc/abstract/core.rb +64 -0
- data/lib/arjdbc/abstract/database_statements.rb +64 -0
- data/lib/arjdbc/abstract/statement_cache.rb +58 -0
- data/lib/arjdbc/abstract/transaction_support.rb +86 -0
- data/lib/arjdbc/db2.rb +3 -1
- data/lib/arjdbc/db2/adapter.rb +630 -250
- data/lib/arjdbc/db2/as400.rb +130 -0
- data/lib/arjdbc/db2/column.rb +167 -0
- data/lib/arjdbc/db2/connection_methods.rb +44 -0
- data/lib/arjdbc/derby.rb +1 -5
- data/lib/arjdbc/derby/active_record_patch.rb +13 -0
- data/lib/arjdbc/derby/adapter.rb +409 -217
- data/lib/arjdbc/derby/connection_methods.rb +16 -14
- data/lib/arjdbc/derby/schema_creation.rb +15 -0
- data/lib/arjdbc/discover.rb +62 -50
- data/lib/arjdbc/firebird.rb +3 -1
- data/lib/arjdbc/firebird/adapter.rb +365 -62
- data/lib/arjdbc/firebird/connection_methods.rb +23 -0
- data/lib/arjdbc/h2.rb +2 -3
- data/lib/arjdbc/h2/adapter.rb +273 -6
- data/lib/arjdbc/h2/connection_methods.rb +23 -8
- data/lib/arjdbc/hsqldb.rb +2 -3
- data/lib/arjdbc/hsqldb/adapter.rb +204 -77
- data/lib/arjdbc/hsqldb/connection_methods.rb +24 -10
- data/lib/arjdbc/hsqldb/explain_support.rb +35 -0
- data/lib/arjdbc/hsqldb/schema_creation.rb +11 -0
- data/lib/arjdbc/informix.rb +4 -2
- data/lib/arjdbc/informix/adapter.rb +78 -54
- data/lib/arjdbc/informix/connection_methods.rb +8 -9
- data/lib/arjdbc/jdbc.rb +59 -2
- data/lib/arjdbc/jdbc/adapter.rb +356 -166
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/adapter_require.rb +46 -0
- data/lib/arjdbc/jdbc/base_ext.rb +15 -0
- data/lib/arjdbc/jdbc/callbacks.rb +27 -18
- data/lib/arjdbc/jdbc/column.rb +79 -20
- data/lib/arjdbc/jdbc/connection.rb +5 -119
- data/lib/arjdbc/jdbc/connection_methods.rb +32 -4
- data/lib/arjdbc/jdbc/error.rb +65 -0
- data/lib/arjdbc/jdbc/extension.rb +41 -29
- data/lib/arjdbc/jdbc/java.rb +5 -6
- data/lib/arjdbc/jdbc/jdbc.rake +3 -126
- data/lib/arjdbc/jdbc/railtie.rb +2 -9
- data/lib/arjdbc/jdbc/rake_tasks.rb +3 -10
- data/lib/arjdbc/jdbc/serialized_attributes_helper.rb +3 -0
- data/lib/arjdbc/jdbc/type_cast.rb +166 -0
- data/lib/arjdbc/jdbc/type_converter.rb +35 -19
- data/lib/arjdbc/mssql.rb +6 -3
- data/lib/arjdbc/mssql/adapter.rb +630 -298
- data/lib/arjdbc/mssql/column.rb +200 -0
- data/lib/arjdbc/mssql/connection_methods.rb +66 -17
- data/lib/arjdbc/mssql/explain_support.rb +99 -0
- data/lib/arjdbc/mssql/limit_helpers.rb +189 -50
- 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 +2 -3
- data/lib/arjdbc/mysql/adapter.rb +86 -356
- data/lib/arjdbc/mysql/connection_methods.rb +159 -23
- data/lib/arjdbc/oracle/adapter.rb +714 -263
- data/lib/arjdbc/postgresql.rb +2 -3
- data/lib/arjdbc/postgresql/_bc_time_cast_patch.rb +24 -0
- data/lib/arjdbc/postgresql/adapter.rb +570 -400
- data/lib/arjdbc/postgresql/base/array_decoder.rb +26 -0
- data/lib/arjdbc/postgresql/base/array_encoder.rb +25 -0
- data/lib/arjdbc/postgresql/base/array_parser.rb +95 -0
- data/lib/arjdbc/postgresql/base/pgconn.rb +11 -0
- data/lib/arjdbc/postgresql/column.rb +51 -0
- data/lib/arjdbc/postgresql/connection_methods.rb +57 -18
- data/lib/arjdbc/postgresql/name.rb +24 -0
- data/lib/arjdbc/postgresql/oid_types.rb +192 -0
- data/lib/arjdbc/railtie.rb +11 -0
- data/lib/arjdbc/sqlite3.rb +2 -3
- data/lib/arjdbc/sqlite3/adapter.rb +518 -198
- data/lib/arjdbc/sqlite3/connection_methods.rb +49 -24
- data/lib/arjdbc/sybase.rb +2 -2
- data/lib/arjdbc/sybase/adapter.rb +7 -6
- data/lib/arjdbc/tasks.rb +13 -0
- data/lib/arjdbc/tasks/database_tasks.rb +52 -0
- data/lib/arjdbc/tasks/databases.rake +91 -0
- data/lib/arjdbc/tasks/databases3.rake +215 -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/util/quoted_cache.rb +60 -0
- data/lib/arjdbc/util/serialized_attributes.rb +98 -0
- data/lib/arjdbc/util/table_copier.rb +110 -0
- data/lib/arjdbc/version.rb +1 -6
- data/lib/generators/jdbc/USAGE +9 -0
- data/lib/generators/jdbc/jdbc_generator.rb +8 -0
- data/lib/jdbc_adapter.rb +1 -1
- data/lib/jdbc_adapter/rake_tasks.rb +3 -2
- data/lib/jdbc_adapter/version.rb +2 -1
- data/pom.xml +114 -0
- data/rails_generators/jdbc_generator.rb +1 -1
- data/rails_generators/templates/config/initializers/jdbc.rb +8 -5
- data/rails_generators/templates/lib/tasks/jdbc.rake +7 -4
- data/rakelib/01-tomcat.rake +51 -0
- data/rakelib/02-test.rake +132 -0
- data/rakelib/bundler_ext.rb +11 -0
- data/rakelib/compile.rake +67 -22
- data/rakelib/db.rake +61 -0
- data/rakelib/rails.rake +204 -29
- data/src/java/arjdbc/ArJdbcModule.java +286 -0
- data/src/java/arjdbc/db2/DB2Module.java +76 -0
- data/src/java/arjdbc/db2/DB2RubyJdbcConnection.java +126 -0
- data/src/java/arjdbc/derby/DerbyModule.java +99 -243
- data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +152 -0
- data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +174 -0
- data/src/java/arjdbc/{jdbc/JdbcConnectionFactory.java → h2/H2Module.java} +20 -6
- data/src/java/arjdbc/h2/H2RubyJdbcConnection.java +27 -12
- data/src/java/arjdbc/hsqldb/HSQLDBModule.java +73 -0
- data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +7 -6
- data/src/java/arjdbc/jdbc/AdapterJavaService.java +7 -29
- data/src/java/arjdbc/jdbc/Callable.java +44 -0
- data/src/java/arjdbc/jdbc/ConnectionFactory.java +132 -0
- data/src/java/arjdbc/jdbc/DataSourceConnectionFactory.java +157 -0
- data/src/java/arjdbc/jdbc/DriverConnectionFactory.java +63 -0
- data/src/java/arjdbc/jdbc/DriverWrapper.java +119 -0
- data/src/java/arjdbc/jdbc/JdbcResult.java +130 -0
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +3622 -948
- data/src/java/arjdbc/mssql/MSSQLModule.java +90 -0
- data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +181 -0
- data/src/java/arjdbc/mysql/MySQLModule.java +99 -81
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +294 -0
- data/src/java/arjdbc/oracle/OracleModule.java +80 -0
- data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +387 -17
- data/src/java/arjdbc/postgresql/ByteaUtils.java +157 -0
- data/src/java/arjdbc/postgresql/PgResultSetMetaDataWrapper.java +23 -0
- data/src/java/arjdbc/postgresql/PostgreSQLModule.java +77 -0
- data/src/java/arjdbc/postgresql/PostgreSQLResult.java +184 -0
- data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +952 -0
- data/src/java/arjdbc/sqlite3/SQLite3Module.java +73 -0
- data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +525 -0
- data/src/java/arjdbc/util/CallResultSet.java +826 -0
- data/src/java/arjdbc/util/DateTimeUtils.java +580 -0
- data/src/java/arjdbc/util/ObjectSupport.java +65 -0
- data/src/java/arjdbc/util/QuotingUtils.java +138 -0
- data/src/java/arjdbc/util/StringCache.java +63 -0
- data/src/java/arjdbc/util/StringHelper.java +159 -0
- metadata +245 -268
- data/History.txt +0 -369
- data/Manifest.txt +0 -180
- data/README.txt +0 -181
- data/lib/active_record/connection_adapters/oracle_adapter.rb +0 -1
- data/lib/arel/engines/sql/compilers/db2_compiler.rb +0 -9
- data/lib/arel/engines/sql/compilers/derby_compiler.rb +0 -6
- data/lib/arel/engines/sql/compilers/h2_compiler.rb +0 -6
- data/lib/arel/engines/sql/compilers/hsqldb_compiler.rb +0 -15
- data/lib/arel/engines/sql/compilers/jdbc_compiler.rb +0 -6
- data/lib/arel/engines/sql/compilers/mssql_compiler.rb +0 -46
- data/lib/arel/visitors/mssql.rb +0 -44
- data/lib/arjdbc/jdbc/compatibility.rb +0 -51
- data/lib/arjdbc/jdbc/core_ext.rb +0 -24
- data/lib/arjdbc/jdbc/discover.rb +0 -18
- data/lib/arjdbc/jdbc/driver.rb +0 -44
- data/lib/arjdbc/jdbc/missing_functionality_helper.rb +0 -87
- data/lib/arjdbc/jdbc/quoted_primary_key.rb +0 -28
- data/lib/arjdbc/jdbc/require_driver.rb +0 -16
- data/lib/arjdbc/mimer.rb +0 -2
- data/lib/arjdbc/mimer/adapter.rb +0 -142
- data/lib/arjdbc/mssql/tsql_helper.rb +0 -61
- data/lib/arjdbc/oracle.rb +0 -3
- data/lib/arjdbc/oracle/connection_methods.rb +0 -11
- data/lib/pg.rb +0 -4
- data/rakelib/package.rake +0 -92
- data/rakelib/test.rake +0 -81
- data/src/java/arjdbc/jdbc/SQLBlock.java +0 -48
- data/src/java/arjdbc/mssql/MssqlRubyJdbcConnection.java +0 -127
- data/src/java/arjdbc/postgresql/PostgresqlRubyJdbcConnection.java +0 -57
- data/src/java/arjdbc/sqlite3/Sqlite3RubyJdbcConnection.java +0 -64
- data/test/abstract_db_create.rb +0 -117
- data/test/activerecord/connection_adapters/type_conversion_test.rb +0 -31
- data/test/activerecord/connections/native_jdbc_mysql/connection.rb +0 -25
- data/test/db/db2.rb +0 -11
- data/test/db/derby.rb +0 -12
- data/test/db/h2.rb +0 -11
- data/test/db/hsqldb.rb +0 -13
- data/test/db/informix.rb +0 -11
- data/test/db/jdbc.rb +0 -11
- data/test/db/jndi_config.rb +0 -40
- data/test/db/logger.rb +0 -3
- data/test/db/mssql.rb +0 -9
- data/test/db/mysql.rb +0 -10
- data/test/db/oracle.rb +0 -34
- data/test/db/postgres.rb +0 -9
- data/test/db/sqlite3.rb +0 -11
- data/test/db2_simple_test.rb +0 -66
- data/test/derby_migration_test.rb +0 -68
- data/test/derby_multibyte_test.rb +0 -12
- data/test/derby_simple_test.rb +0 -99
- data/test/generic_jdbc_connection_test.rb +0 -29
- data/test/h2_simple_test.rb +0 -41
- data/test/has_many_through.rb +0 -79
- data/test/helper.rb +0 -5
- data/test/hsqldb_simple_test.rb +0 -6
- data/test/informix_simple_test.rb +0 -48
- data/test/jdbc_common.rb +0 -25
- data/test/jndi_callbacks_test.rb +0 -40
- data/test/jndi_test.rb +0 -25
- data/test/manualTestDatabase.rb +0 -191
- data/test/models/add_not_null_column_to_table.rb +0 -12
- data/test/models/auto_id.rb +0 -18
- data/test/models/data_types.rb +0 -28
- data/test/models/entry.rb +0 -43
- data/test/models/mixed_case.rb +0 -25
- data/test/models/reserved_word.rb +0 -18
- data/test/models/string_id.rb +0 -18
- data/test/models/validates_uniqueness_of_string.rb +0 -19
- data/test/mssql_db_create_test.rb +0 -26
- data/test/mssql_identity_insert_test.rb +0 -19
- data/test/mssql_legacy_types_test.rb +0 -58
- data/test/mssql_limit_offset_test.rb +0 -136
- data/test/mssql_multibyte_test.rb +0 -18
- data/test/mssql_simple_test.rb +0 -55
- data/test/mysql_db_create_test.rb +0 -27
- data/test/mysql_info_test.rb +0 -113
- data/test/mysql_multibyte_test.rb +0 -10
- data/test/mysql_nonstandard_primary_key_test.rb +0 -42
- data/test/mysql_simple_test.rb +0 -49
- data/test/oracle_simple_test.rb +0 -18
- data/test/oracle_specific_test.rb +0 -83
- data/test/pick_rails_version.rb +0 -3
- data/test/postgres_db_create_test.rb +0 -32
- data/test/postgres_drop_db_test.rb +0 -16
- data/test/postgres_mixed_case_test.rb +0 -29
- data/test/postgres_nonseq_pkey_test.rb +0 -38
- data/test/postgres_reserved_test.rb +0 -22
- data/test/postgres_schema_search_path_test.rb +0 -44
- data/test/postgres_simple_test.rb +0 -51
- data/test/postgres_table_alias_length_test.rb +0 -15
- data/test/simple.rb +0 -546
- data/test/sqlite3_simple_test.rb +0 -233
- data/test/sybase_jtds_simple_test.rb +0 -28
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
ArJdbc::ConnectionMethods.module_eval do
|
|
2
|
+
def firebird_connection(config)
|
|
3
|
+
config[:adapter_spec] ||= ::ArJdbc::Firebird
|
|
4
|
+
|
|
5
|
+
return jndi_connection(config) if jndi_config?(config)
|
|
6
|
+
|
|
7
|
+
begin
|
|
8
|
+
require 'jdbc/firebird'
|
|
9
|
+
::Jdbc::Firebird.load_driver(:require)
|
|
10
|
+
rescue LoadError # assuming driver.jar is on the class-path
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
config[:host] ||= 'localhost'
|
|
14
|
+
config[:port] ||= 3050
|
|
15
|
+
config[:url] ||= begin
|
|
16
|
+
"jdbc:firebirdsql://#{config[:host]}:#{config[:port]}/#{config[:database]}"
|
|
17
|
+
end
|
|
18
|
+
config[:driver] ||= ::Jdbc::Firebird.driver_name
|
|
19
|
+
|
|
20
|
+
jdbc_connection(config)
|
|
21
|
+
end
|
|
22
|
+
# alias_method :jdbcfirebird_connection, :firebird_connection
|
|
23
|
+
end
|
data/lib/arjdbc/h2.rb
CHANGED
data/lib/arjdbc/h2/adapter.rb
CHANGED
|
@@ -1,36 +1,303 @@
|
|
|
1
|
+
ArJdbc.load_java_part :H2
|
|
1
2
|
require 'arjdbc/hsqldb/adapter'
|
|
3
|
+
require 'arel/visitors/h2'
|
|
2
4
|
|
|
3
5
|
module ArJdbc
|
|
4
6
|
module H2
|
|
5
7
|
include HSQLDB
|
|
6
8
|
|
|
9
|
+
# @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class
|
|
7
10
|
def self.jdbc_connection_class
|
|
8
11
|
::ActiveRecord::ConnectionAdapters::H2JdbcConnection
|
|
9
12
|
end
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
|
|
14
|
+
# @see ActiveRecord::ConnectionAdapters::JdbcColumn#column_types
|
|
15
|
+
def self.column_selector
|
|
16
|
+
[ /\.h2\./i, lambda { |config, column| column.extend(Column) } ]
|
|
13
17
|
end
|
|
14
18
|
|
|
15
|
-
|
|
16
|
-
|
|
19
|
+
# @see ActiveRecord::ConnectionAdapters::JdbcColumn
|
|
20
|
+
module Column
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def extract_limit(sql_type)
|
|
25
|
+
limit = super
|
|
26
|
+
case @sql_type = sql_type.downcase
|
|
27
|
+
# NOTE: JDBC driver f*cks sql_type up with limits (just like HSQLDB) :
|
|
28
|
+
when /^tinyint/i then @sql_type = 'tinyint'; limit = 1
|
|
29
|
+
when /^smallint|int2/i then @sql_type = 'smallint'; limit = 2
|
|
30
|
+
when /^bigint|int8/i then @sql_type = 'bigint'; limit = 8
|
|
31
|
+
when /^int|int4/i then @sql_type = 'int'; limit = 4
|
|
32
|
+
when /^double/i then @sql_type = 'double'; limit = 8
|
|
33
|
+
when /^real/i then @sql_type = 'real'; limit = 4
|
|
34
|
+
when /^date/i then @sql_type = 'date'; limit = nil
|
|
35
|
+
when /^timestamp/i then @sql_type = 'timestamp'; limit = nil
|
|
36
|
+
when /^time/i then @sql_type = 'time'; limit = nil
|
|
37
|
+
when /^boolean/i then @sql_type = 'boolean'; limit = nil
|
|
38
|
+
when /^binary|bytea/i; then @sql_type = 'binary'; limit = 2 * 1024 * 1024
|
|
39
|
+
when /blob|image|oid/i then @sql_type = 'blob'; limit = nil
|
|
40
|
+
when /clob|text/i then @sql_type = 'clob'; limit = nil
|
|
41
|
+
# NOTE: use lower-case due SchemaDumper not handling it's decimal/integer
|
|
42
|
+
# optimization case-insensitively due : column.type == :integer &&
|
|
43
|
+
# [/^numeric/, /^decimal/].any? { |e| e.match(column.sql_type) }
|
|
44
|
+
when /^decimal\(65535,32767\)/i
|
|
45
|
+
@sql_type = 'decimal'; nil
|
|
46
|
+
end
|
|
47
|
+
limit
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def simplified_type(field_type)
|
|
51
|
+
case field_type
|
|
52
|
+
when /^bit|bool/i then :boolean
|
|
53
|
+
when /^signed|year/i then :integer
|
|
54
|
+
when /^real|double/i then :float
|
|
55
|
+
when /^varchar/i then :string
|
|
56
|
+
when /^longvarchar/i then :text
|
|
57
|
+
when /^binary|raw|bytea/i then :binary
|
|
58
|
+
when /varbinary/i then :binary # longvarbinary, varbinary
|
|
59
|
+
when /^blob|image|oid/i then :binary
|
|
60
|
+
else
|
|
61
|
+
super
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Post process default value from JDBC into a Rails-friendly format (columns{-internal})
|
|
66
|
+
def default_value(value)
|
|
67
|
+
# H2 auto-generated key default value
|
|
68
|
+
return nil if value =~ /^\(NEXT VALUE FOR/i
|
|
69
|
+
# JDBC returns column default strings with actual single quotes around the value.
|
|
70
|
+
return $1 if value =~ /^'(.*)'$/
|
|
71
|
+
value
|
|
72
|
+
end
|
|
73
|
+
|
|
17
74
|
end
|
|
18
75
|
|
|
76
|
+
ADAPTER_NAME = 'H2'.freeze
|
|
77
|
+
|
|
78
|
+
# @override
|
|
79
|
+
def adapter_name
|
|
80
|
+
ADAPTER_NAME
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# @deprecated no longer used. only here for backwards compatibility with 1.2
|
|
19
84
|
def h2_adapter
|
|
20
85
|
true
|
|
21
86
|
end
|
|
22
87
|
|
|
88
|
+
NATIVE_DATABASE_TYPES = {
|
|
89
|
+
# "integer GENERATED BY DEFAULT AS IDENTITY(START WITH 0) PRIMARY KEY"
|
|
90
|
+
:primary_key => "bigint identity",
|
|
91
|
+
:boolean => { :name => "boolean" },
|
|
92
|
+
:tinyint => { :name => "tinyint", :limit => 1 },
|
|
93
|
+
:smallint => { :name => "smallint", :limit => 2 },
|
|
94
|
+
:bigint => { :name => "bigint", :limit => 8 },
|
|
95
|
+
:integer => { :name => "int", :limit => 4 },
|
|
96
|
+
:decimal => { :name => "decimal" }, # :limit => 2147483647
|
|
97
|
+
:numeric => { :name => "numeric" }, # :limit => 2147483647
|
|
98
|
+
:float => { :name => "float", :limit => 8 },
|
|
99
|
+
:double => { :name => "double", :limit => 8 },
|
|
100
|
+
:real => { :name => "real", :limit => 4 }, # :limit => 8
|
|
101
|
+
:date => { :name => "date" },
|
|
102
|
+
:time => { :name => "time" },
|
|
103
|
+
:timestamp => { :name => "timestamp" },
|
|
104
|
+
:datetime => { :name => "timestamp" },
|
|
105
|
+
:binary => { :name => "binary" },
|
|
106
|
+
:string => { :name => "varchar", :limit => 255 },
|
|
107
|
+
:char => { :name => "char" }, # :limit => 2147483647
|
|
108
|
+
:blob => { :name => "blob" },
|
|
109
|
+
:text => { :name => "clob" },
|
|
110
|
+
:clob => { :name => "clob" },
|
|
111
|
+
:uuid => { :name => "uuid" }, # :limit => 2147483647
|
|
112
|
+
:other => { :name => "other" }, # java.lang.Object
|
|
113
|
+
:array => { :name => "array" }, # java.lang.Object[]
|
|
114
|
+
# NOTE: would be great if AR allowed as to refactor as :
|
|
115
|
+
# t.column :string, :ignorecase => true
|
|
116
|
+
:varchar_casesensitive => { :name => 'varchar_casesensitive' },
|
|
117
|
+
:varchar_ignorecase => { :name => 'varchar_ignorecase' },
|
|
118
|
+
# :identity : { :name=>"identity", :limit => 19 }
|
|
119
|
+
# :result_set : { :name=>"result_set" }
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
# @override
|
|
123
|
+
def native_database_types
|
|
124
|
+
NATIVE_DATABASE_TYPES
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# @override
|
|
128
|
+
def type_to_sql(type, limit = nil, precision = nil, scale = nil)
|
|
129
|
+
case type.to_sym
|
|
130
|
+
when :integer
|
|
131
|
+
case limit
|
|
132
|
+
when 1; 'tinyint'
|
|
133
|
+
when 2; 'smallint'
|
|
134
|
+
when nil, 3, 4; 'int'
|
|
135
|
+
when 5..8; 'bigint'
|
|
136
|
+
else raise(ActiveRecordError, "No integer type has byte size #{limit}")
|
|
137
|
+
end
|
|
138
|
+
when :float
|
|
139
|
+
case limit
|
|
140
|
+
when 1..4; 'real'
|
|
141
|
+
when 5..8; 'double'
|
|
142
|
+
else raise(ActiveRecordError, "No float type has byte size #{limit}")
|
|
143
|
+
end
|
|
144
|
+
when :binary
|
|
145
|
+
if limit && limit < 2 * 1024 * 1024
|
|
146
|
+
'binary'
|
|
147
|
+
else
|
|
148
|
+
'blob'
|
|
149
|
+
end
|
|
150
|
+
else
|
|
151
|
+
super
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# @override
|
|
156
|
+
def empty_insert_statement_value
|
|
157
|
+
"VALUES ()"
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# @override
|
|
23
161
|
def tables
|
|
24
162
|
@connection.tables(nil, h2_schema)
|
|
25
163
|
end
|
|
26
164
|
|
|
27
|
-
|
|
28
|
-
|
|
165
|
+
# @override
|
|
166
|
+
def columns(table_name, name = nil)
|
|
167
|
+
@connection.columns_internal(table_name.to_s, nil, h2_schema)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# @override
|
|
171
|
+
def change_column(table_name, column_name, type, options = {})
|
|
172
|
+
execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} #{type_to_sql(type, options[:limit])}"
|
|
173
|
+
change_column_default(table_name, column_name, options[:default]) if options_include_default?(options)
|
|
174
|
+
change_column_null(table_name, column_name, options[:null], options[:default]) if options.key?(:null)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def current_schema
|
|
178
|
+
execute('CALL SCHEMA()')[0].values[0]
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# @override
|
|
182
|
+
def quote(value, column = nil)
|
|
183
|
+
case value
|
|
184
|
+
when String
|
|
185
|
+
if value.empty?
|
|
186
|
+
"''"
|
|
187
|
+
else
|
|
188
|
+
super
|
|
189
|
+
end
|
|
190
|
+
else
|
|
191
|
+
super
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# @override
|
|
196
|
+
def supports_views?; true end
|
|
197
|
+
|
|
198
|
+
# EXPLAIN support :
|
|
199
|
+
|
|
200
|
+
# @override
|
|
201
|
+
def supports_explain?; true end
|
|
202
|
+
|
|
203
|
+
# @override
|
|
204
|
+
def explain(arel, binds = [])
|
|
205
|
+
sql = "EXPLAIN #{to_sql(arel, binds)}"
|
|
206
|
+
raw_result = exec_query_raw(sql, "EXPLAIN", binds)
|
|
207
|
+
raw_result[0].values.join("\n") # [ "SELECT \n ..." ].to_s
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
# @override
|
|
211
|
+
def structure_dump
|
|
212
|
+
execute('SCRIPT SIMPLE').map do |result|
|
|
213
|
+
# [ { 'script' => SQL }, { 'script' ... }, ... ]
|
|
214
|
+
case sql = result.first[1] # ['script']
|
|
215
|
+
when /CREATE USER IF NOT EXISTS SA/i then nil
|
|
216
|
+
else sql
|
|
217
|
+
end
|
|
218
|
+
end.compact.join("\n\n")
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
# @see #structure_dump
|
|
222
|
+
def structure_load(dump)
|
|
223
|
+
dump.each_line("\n\n") { |ddl| execute(ddl) }
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def shutdown
|
|
227
|
+
execute 'SHUTDOWN COMPACT'
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# @private
|
|
231
|
+
def recreate_database(name = nil, options = {})
|
|
232
|
+
drop_database(name)
|
|
233
|
+
create_database(name, options)
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
# @private
|
|
237
|
+
def create_database(name = nil, options = {}); end
|
|
238
|
+
|
|
239
|
+
# @private
|
|
240
|
+
def drop_database(name = nil)
|
|
241
|
+
execute('DROP ALL OBJECTS')
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# @private
|
|
245
|
+
def database_path(base_only = false)
|
|
246
|
+
db_path = jdbc_connection(true).getSession.getDataHandler.getDatabasePath
|
|
247
|
+
return db_path if base_only
|
|
248
|
+
if File.exist?(mv_path = "#{db_path}.mv.db")
|
|
249
|
+
return mv_path
|
|
250
|
+
else
|
|
251
|
+
"#{db_path}.h2.db"
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
# @override
|
|
256
|
+
def jdbc_connection(unwrap = nil)
|
|
257
|
+
java_connection = raw_connection.connection
|
|
258
|
+
return java_connection unless unwrap
|
|
259
|
+
if java_connection.java_class.name == 'org.h2.jdbc.JdbcConnection'
|
|
260
|
+
return java_connection
|
|
261
|
+
end
|
|
262
|
+
connection_class = java.sql.Connection.java_class
|
|
263
|
+
if java_connection.wrapper_for?(connection_class)
|
|
264
|
+
java_connection.unwrap(connection_class) # java.sql.Wrapper.unwrap
|
|
265
|
+
elsif java_connection.respond_to?(:connection)
|
|
266
|
+
# e.g. org.apache.tomcat.jdbc.pool.PooledConnection
|
|
267
|
+
java_connection.connection # getConnection
|
|
268
|
+
else
|
|
269
|
+
java_connection
|
|
270
|
+
end
|
|
29
271
|
end
|
|
30
272
|
|
|
31
273
|
private
|
|
274
|
+
|
|
275
|
+
def change_column_null(table_name, column_name, null, default = nil)
|
|
276
|
+
if !null && !default.nil?
|
|
277
|
+
execute("UPDATE #{table_name} SET #{column_name}=#{quote(default)} WHERE #{column_name} IS NULL")
|
|
278
|
+
end
|
|
279
|
+
if null
|
|
280
|
+
execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET NULL"
|
|
281
|
+
else
|
|
282
|
+
execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET NOT NULL"
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
32
286
|
def h2_schema
|
|
33
287
|
@config[:schema] || ''
|
|
34
288
|
end
|
|
289
|
+
|
|
35
290
|
end
|
|
36
291
|
end
|
|
292
|
+
|
|
293
|
+
module ActiveRecord::ConnectionAdapters
|
|
294
|
+
|
|
295
|
+
class H2Adapter < JdbcAdapter
|
|
296
|
+
include ArJdbc::H2
|
|
297
|
+
|
|
298
|
+
def arel_visitor
|
|
299
|
+
Arel::Visitors::H2.new(self)
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
end
|
|
@@ -1,12 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
ArJdbc::ConnectionMethods.module_eval do
|
|
2
|
+
def h2_connection(config)
|
|
3
|
+
config[:adapter_spec] ||= ::ArJdbc::H2
|
|
4
|
+
config[:adapter_class] = ActiveRecord::ConnectionAdapters::H2Adapter unless config.key?(:adapter_class)
|
|
5
|
+
|
|
6
|
+
return jndi_connection(config) if jndi_config?(config)
|
|
7
|
+
|
|
8
|
+
begin
|
|
9
|
+
require 'jdbc/h2'
|
|
10
|
+
::Jdbc::H2.load_driver(:require) if defined?(::Jdbc::H2.load_driver)
|
|
11
|
+
rescue LoadError # assuming driver.jar is on the class-path
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
config[:url] ||= begin
|
|
15
|
+
db = config[:database]
|
|
16
|
+
if db[0, 4] == 'mem:' || db[0, 5] == 'file:' || db[0, 5] == 'hsql:'
|
|
17
|
+
"jdbc:h2:#{db}"
|
|
18
|
+
else
|
|
19
|
+
"jdbc:h2:file:#{File.expand_path(db)}"
|
|
8
20
|
end
|
|
9
|
-
alias_method :jdbch2_connection, :h2_connection
|
|
10
21
|
end
|
|
22
|
+
config[:driver] ||= defined?(::Jdbc::H2.driver_name) ? ::Jdbc::H2.driver_name : 'org.h2.Driver'
|
|
23
|
+
|
|
24
|
+
embedded_driver(config)
|
|
11
25
|
end
|
|
26
|
+
alias_method :jdbch2_connection, :h2_connection
|
|
12
27
|
end
|
data/lib/arjdbc/hsqldb.rb
CHANGED
|
@@ -1,88 +1,155 @@
|
|
|
1
|
-
|
|
1
|
+
ArJdbc.load_java_part :HSQLDB
|
|
2
|
+
require 'arjdbc/hsqldb/explain_support'
|
|
3
|
+
require 'arjdbc/hsqldb/schema_creation' # AR 4.x
|
|
4
|
+
require 'arel/visitors/hsqldb'
|
|
5
|
+
|
|
6
|
+
module ArJdbc
|
|
2
7
|
module HSQLDB
|
|
8
|
+
include ExplainSupport
|
|
9
|
+
|
|
10
|
+
# @see ActiveRecord::ConnectionAdapters::JdbcColumn#column_types
|
|
3
11
|
def self.column_selector
|
|
4
|
-
[/hsqldb
|
|
12
|
+
[ /hsqldb/i, lambda { |config, column| column.extend(Column) } ]
|
|
5
13
|
end
|
|
6
14
|
|
|
15
|
+
# @see ActiveRecord::ConnectionAdapters::JdbcColumn
|
|
7
16
|
module Column
|
|
17
|
+
|
|
8
18
|
private
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
when
|
|
14
|
-
|
|
15
|
-
when /
|
|
16
|
-
|
|
19
|
+
|
|
20
|
+
def extract_limit(sql_type)
|
|
21
|
+
limit = super
|
|
22
|
+
case @sql_type = sql_type.downcase
|
|
23
|
+
when /^tinyint/i then @sql_type = 'tinyint'; limit = 1
|
|
24
|
+
when /^smallint/i then @sql_type = 'smallint'; limit = 2
|
|
25
|
+
when /^bigint/i then @sql_type = 'bigint'; limit = 8
|
|
26
|
+
when /^double/i then @sql_type = 'double'; limit = 8
|
|
27
|
+
when /^real/i then @sql_type = 'real'; limit = 8
|
|
28
|
+
# NOTE: once again we get incorrect "limits" from HypesSQL's JDBC
|
|
29
|
+
# thus yet again we need to fix incorrectly detected limits :
|
|
30
|
+
when /^integer/i then @sql_type = 'integer'; limit = 4
|
|
31
|
+
when /^float/i then @sql_type = 'float'; limit = 8
|
|
32
|
+
when /^decimal/i then @sql_type = 'decimal';
|
|
33
|
+
when /^datetime/i then @sql_type = 'datetime'; limit = nil
|
|
34
|
+
when /^timestamp/i then @sql_type = 'timestamp'; limit = nil
|
|
35
|
+
when /^time/i then @sql_type = 'time'; limit = nil
|
|
36
|
+
when /^date/i then @sql_type = 'date'; limit = nil
|
|
17
37
|
else
|
|
18
|
-
|
|
38
|
+
# HSQLDB appears to return "LONGVARCHAR(0)" for :text columns,
|
|
39
|
+
# which for AR purposes should be interpreted as "no limit" :
|
|
40
|
+
limit = nil if sql_type =~ /\(0\)$/
|
|
19
41
|
end
|
|
42
|
+
limit
|
|
20
43
|
end
|
|
21
44
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
45
|
+
def simplified_type(field_type)
|
|
46
|
+
case field_type
|
|
47
|
+
when /^nvarchar/i then :string
|
|
48
|
+
when /^character/i then :string
|
|
49
|
+
when /^longvarchar/i then :text
|
|
50
|
+
when /int/i then :integer # TINYINT, SMALLINT, BIGINT, INT
|
|
51
|
+
when /real|double/i then :float
|
|
52
|
+
when /^bit/i then :boolean
|
|
53
|
+
when /binary/i then :binary # VARBINARY, LONGVARBINARY
|
|
54
|
+
else
|
|
55
|
+
super
|
|
56
|
+
end
|
|
28
57
|
end
|
|
29
58
|
|
|
30
59
|
# Post process default value from JDBC into a Rails-friendly format (columns{-internal})
|
|
31
60
|
def default_value(value)
|
|
32
|
-
#
|
|
61
|
+
# JDBC returns column default strings with actual single quotes around the value.
|
|
33
62
|
return $1 if value =~ /^'(.*)'$/
|
|
34
|
-
|
|
35
63
|
value
|
|
36
64
|
end
|
|
37
|
-
end
|
|
38
65
|
|
|
39
|
-
def adapter_name #:nodoc:
|
|
40
|
-
'Hsqldb'
|
|
41
66
|
end
|
|
42
67
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
68
|
+
ADAPTER_NAME = 'HSQLDB'.freeze
|
|
69
|
+
|
|
70
|
+
def adapter_name
|
|
71
|
+
ADAPTER_NAME
|
|
46
72
|
end
|
|
47
73
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
#
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
74
|
+
NATIVE_DATABASE_TYPES = {
|
|
75
|
+
:primary_key => "integer GENERATED BY DEFAULT AS IDENTITY(START WITH 0) PRIMARY KEY",
|
|
76
|
+
:string => { :name => "varchar", :limit => 255 }, # :limit => 2147483647
|
|
77
|
+
:text => { :name => "clob" },
|
|
78
|
+
:binary => { :name => "blob" },
|
|
79
|
+
:boolean => { :name => "boolean" }, # :name => "tinyint", :limit => 1
|
|
80
|
+
:bit => { :name=>"bit" }, # stored as 0/1 on HSQLDB 2.2 (translates true/false)
|
|
81
|
+
:integer => { :name => "integer", :limit => 4 },
|
|
82
|
+
:decimal => { :name => "decimal" }, # :limit => 2147483647
|
|
83
|
+
:numeric => { :name => "numeric" }, # :limit => 2147483647
|
|
84
|
+
# NOTE: fix incorrectly detected limits :
|
|
85
|
+
:tinyint => { :name => "tinyint", :limit => 1 },
|
|
86
|
+
:smallint => { :name => "smallint", :limit => 2 },
|
|
87
|
+
:bigint => { :name => "bigint", :limit => 8 },
|
|
88
|
+
:float => { :name => "float" },
|
|
89
|
+
:double => { :name => "double", :limit => 8 },
|
|
90
|
+
:real => { :name => "real", :limit => 8 },
|
|
91
|
+
:date => { :name=>"date" },
|
|
92
|
+
:time => { :name=>"time" },
|
|
93
|
+
:timestamp => { :name=>"timestamp" },
|
|
94
|
+
:datetime => { :name=>"timestamp" },
|
|
95
|
+
:other => { :name=>"other" },
|
|
96
|
+
# NOTE: would be great if AR allowed as to refactor as :
|
|
97
|
+
# t.column :string, :ignorecase => true
|
|
98
|
+
:character => { :name => "character" },
|
|
99
|
+
:varchar_ignorecase => { :name => "varchar_ignorecase" },
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# @override
|
|
103
|
+
def native_database_types
|
|
104
|
+
NATIVE_DATABASE_TYPES
|
|
63
105
|
end
|
|
64
106
|
|
|
65
|
-
|
|
107
|
+
# @override
|
|
108
|
+
def quote(value, column = nil)
|
|
66
109
|
return value.quoted_id if value.respond_to?(:quoted_id)
|
|
110
|
+
return value if sql_literal?(value)
|
|
67
111
|
|
|
68
112
|
case value
|
|
69
113
|
when String
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
column.respond_to?(:primary) && column.primary && column.klass != String)
|
|
114
|
+
column_type = column && column.type
|
|
115
|
+
if column_type == :binary
|
|
116
|
+
"X'#{value.unpack("H*")[0]}'"
|
|
117
|
+
elsif column_type == :integer ||
|
|
118
|
+
column.respond_to?(:primary) && column.primary && column.klass != String
|
|
76
119
|
value.to_i.to_s
|
|
77
120
|
else
|
|
78
121
|
"'#{quote_string(value)}'"
|
|
79
122
|
end
|
|
123
|
+
when Time
|
|
124
|
+
column_type = column && column.type
|
|
125
|
+
if column_type == :time
|
|
126
|
+
"'#{value.strftime("%H:%M:%S")}'"
|
|
127
|
+
#elsif column_type == :timestamp # || column_type == :datetime
|
|
128
|
+
#value = ::ActiveRecord::Base.default_timezone == :utc ? value.getutc : value.getlocal
|
|
129
|
+
#"'#{value.strftime("%Y-%m-%d %H:%M:%S")}.#{sprintf("%06d", value.usec)}'"
|
|
130
|
+
else
|
|
131
|
+
super
|
|
132
|
+
end
|
|
80
133
|
else
|
|
81
134
|
super
|
|
82
135
|
end
|
|
83
136
|
end
|
|
84
137
|
|
|
85
|
-
|
|
138
|
+
# Quote date/time values for use in SQL input.
|
|
139
|
+
# Includes microseconds if the value is a Time responding to usec.
|
|
140
|
+
# @override
|
|
141
|
+
def quoted_date(value)
|
|
142
|
+
if value.acts_like?(:time) && value.respond_to?(:usec)
|
|
143
|
+
usec = sprintf("%06d", value.usec)
|
|
144
|
+
value = ::ActiveRecord::Base.default_timezone == :utc ? value.getutc : value.getlocal
|
|
145
|
+
"#{value.strftime("%Y-%m-%d %H:%M:%S")}.#{usec}"
|
|
146
|
+
else
|
|
147
|
+
super
|
|
148
|
+
end
|
|
149
|
+
end if ::ActiveRecord::VERSION::MAJOR >= 3
|
|
150
|
+
|
|
151
|
+
# @override
|
|
152
|
+
def quote_column_name(name)
|
|
86
153
|
name = name.to_s
|
|
87
154
|
if name =~ /[-]/
|
|
88
155
|
%Q{"#{name.upcase}"}
|
|
@@ -91,25 +158,15 @@ module ::ArJdbc
|
|
|
91
158
|
end
|
|
92
159
|
end
|
|
93
160
|
|
|
94
|
-
|
|
95
|
-
str.gsub(/'/, "''")
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def quoted_true
|
|
99
|
-
'1'
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def quoted_false
|
|
103
|
-
'0'
|
|
104
|
-
end
|
|
105
|
-
|
|
161
|
+
# @override
|
|
106
162
|
def add_column(table_name, column_name, type, options = {})
|
|
107
163
|
add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
|
|
108
164
|
add_column_options!(add_column_sql, options)
|
|
109
165
|
execute(add_column_sql)
|
|
110
|
-
end
|
|
166
|
+
end unless const_defined? :SchemaCreation
|
|
111
167
|
|
|
112
|
-
|
|
168
|
+
# @override
|
|
169
|
+
def change_column(table_name, column_name, type, options = {})
|
|
113
170
|
execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} #{type_to_sql(type, options[:limit])}"
|
|
114
171
|
end
|
|
115
172
|
|
|
@@ -117,54 +174,124 @@ module ::ArJdbc
|
|
|
117
174
|
execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} SET DEFAULT #{quote(default)}"
|
|
118
175
|
end
|
|
119
176
|
|
|
177
|
+
# @override
|
|
120
178
|
def rename_column(table_name, column_name, new_column_name) #:nodoc:
|
|
121
179
|
execute "ALTER TABLE #{table_name} ALTER COLUMN #{column_name} RENAME TO #{new_column_name}"
|
|
122
180
|
end
|
|
123
181
|
|
|
124
|
-
#
|
|
182
|
+
# @override
|
|
125
183
|
def type_to_sql(type, limit = nil, precision = nil, scale = nil)
|
|
126
184
|
return super if defined?(::Jdbc::H2) || type.to_s != 'integer' || limit == nil
|
|
127
|
-
|
|
128
185
|
type
|
|
129
186
|
end
|
|
130
187
|
|
|
188
|
+
# @override
|
|
131
189
|
def rename_table(name, new_name)
|
|
132
190
|
execute "ALTER TABLE #{name} RENAME TO #{new_name}"
|
|
133
191
|
end
|
|
134
192
|
|
|
193
|
+
# @note AR API since 4.2
|
|
194
|
+
def truncate(table_name, name = nil)
|
|
195
|
+
execute "TRUNCATE TABLE #{quote_table_name(table_name)}", name
|
|
196
|
+
end
|
|
197
|
+
|
|
135
198
|
def last_insert_id
|
|
136
|
-
|
|
199
|
+
identity = select_value("CALL IDENTITY()")
|
|
200
|
+
Integer(identity.nil? ? 0 : identity)
|
|
137
201
|
end
|
|
138
202
|
|
|
203
|
+
# @private
|
|
139
204
|
def _execute(sql, name = nil)
|
|
140
205
|
result = super
|
|
141
|
-
|
|
206
|
+
self.class.insert?(sql) ? last_insert_id : result
|
|
142
207
|
end
|
|
208
|
+
private :_execute
|
|
143
209
|
|
|
144
|
-
|
|
210
|
+
# @note Only used with (non-AREL) ActiveRecord **2.3**.
|
|
211
|
+
# @see Arel::Visitors::HSQLDB#limit_offset
|
|
212
|
+
def add_limit_offset!(sql, options)
|
|
145
213
|
if sql =~ /^select/i
|
|
146
214
|
offset = options[:offset] || 0
|
|
147
|
-
bef = sql[7..-1]
|
|
148
215
|
if limit = options[:limit]
|
|
149
|
-
sql.replace "SELECT LIMIT #{offset} #{limit} #{
|
|
216
|
+
sql.replace "SELECT LIMIT #{offset} #{limit} #{sql[7..-1]}"
|
|
150
217
|
elsif offset > 0
|
|
151
|
-
sql.replace "SELECT LIMIT #{offset} 0 #{
|
|
218
|
+
sql.replace "SELECT LIMIT #{offset} 0 #{sql[7..-1]}"
|
|
152
219
|
end
|
|
153
220
|
end
|
|
221
|
+
end if ::ActiveRecord::VERSION::MAJOR < 3
|
|
222
|
+
|
|
223
|
+
# @override
|
|
224
|
+
def empty_insert_statement_value
|
|
225
|
+
# on HSQLDB only work with tables that have a default value for each
|
|
226
|
+
# and every column ... you'll need to avoid `Model.create!` on 4.0
|
|
227
|
+
'DEFAULT VALUES'
|
|
154
228
|
end
|
|
155
229
|
|
|
156
|
-
#
|
|
157
|
-
#
|
|
158
|
-
# now takes an optional block filter so we can screen out
|
|
159
|
-
# rows corresponding to system tables. HSQLDB names its
|
|
160
|
-
# system tables SYSTEM.*, but H2 seems to name them without
|
|
161
|
-
# any kind of convention
|
|
230
|
+
# We filter out HSQLDB's system tables (named "SYSTEM.*").
|
|
231
|
+
# @override
|
|
162
232
|
def tables
|
|
163
|
-
@connection.tables.select {|row| row.to_s !~ /^system_/i }
|
|
233
|
+
@connection.tables.select { |row| row.to_s !~ /^system_/i }
|
|
164
234
|
end
|
|
165
235
|
|
|
236
|
+
# @override
|
|
166
237
|
def remove_index(table_name, options = {})
|
|
167
238
|
execute "DROP INDEX #{quote_column_name(index_name(table_name, options))}"
|
|
168
239
|
end
|
|
240
|
+
|
|
241
|
+
# @override
|
|
242
|
+
def supports_views?; true end
|
|
243
|
+
|
|
244
|
+
# @override
|
|
245
|
+
def supports_foreign_keys?; true end
|
|
246
|
+
|
|
247
|
+
# @override
|
|
248
|
+
def structure_dump
|
|
249
|
+
execute('SCRIPT').map do |result|
|
|
250
|
+
# [ { 'command' => SQL }, { 'command' ... }, ... ]
|
|
251
|
+
case sql = result.first[1] # ['command']
|
|
252
|
+
when /CREATE USER SA PASSWORD DIGEST .*?/i then nil
|
|
253
|
+
when /CREATE SCHEMA PUBLIC AUTHORIZATION DBA/i then nil
|
|
254
|
+
when /GRANT DBA TO SA/i then nil
|
|
255
|
+
else sql
|
|
256
|
+
end
|
|
257
|
+
end.compact.join("\n\n")
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
# @see #structure_dump
|
|
261
|
+
def structure_load(dump)
|
|
262
|
+
dump.each_line("\n\n") { |ddl| execute(ddl) }
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def shutdown
|
|
266
|
+
execute 'SHUTDOWN'
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
# @private
|
|
270
|
+
def recreate_database(name = nil, options = {})
|
|
271
|
+
drop_database(name)
|
|
272
|
+
create_database(name, options)
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
# @private
|
|
276
|
+
def create_database(name = nil, options = {}); end
|
|
277
|
+
|
|
278
|
+
# @private
|
|
279
|
+
def drop_database(name = nil)
|
|
280
|
+
execute('DROP SCHEMA PUBLIC CASCADE')
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
module ActiveRecord::ConnectionAdapters
|
|
287
|
+
|
|
288
|
+
class HsqldbAdapter < JdbcAdapter
|
|
289
|
+
include ArJdbc::HSQLDB
|
|
290
|
+
|
|
291
|
+
def arel_visitor # :nodoc:
|
|
292
|
+
Arel::Visitors::HSQLDB
|
|
293
|
+
end
|
|
169
294
|
end
|
|
295
|
+
|
|
170
296
|
end
|
|
297
|
+
|