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,16 @@
|
|
1
|
+
ArJdbc::ConnectionMethods.module_eval do
|
2
|
+
def derby_connection(config)
|
3
|
+
config[:adapter_spec] ||= ::ArJdbc::Derby
|
4
|
+
config[:adapter_class] = ActiveRecord::ConnectionAdapters::DerbyAdapter unless config.key?(:adapter_class)
|
5
|
+
|
6
|
+
return jndi_connection(config) if jndi_config?(config)
|
7
|
+
|
8
|
+
ArJdbc.load_driver(:Derby) unless config[:load_driver] == false
|
9
|
+
config[:driver] ||= 'org.apache.derby.jdbc.EmbeddedDriver'
|
10
|
+
# `database: memory:dbName` for an in memory Derby DB
|
11
|
+
config[:url] ||= "jdbc:derby:#{config[:database]};create=true"
|
12
|
+
|
13
|
+
embedded_driver(config)
|
14
|
+
end
|
15
|
+
alias_method :jdbcderby_connection, :derby_connection
|
16
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module ArJdbc
|
2
|
+
module Derby
|
3
|
+
# @private
|
4
|
+
class SchemaCreation < ::ActiveRecord::ConnectionAdapters::AbstractAdapter::SchemaCreation
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def schema_creation
|
12
|
+
SchemaCreation.new self
|
13
|
+
end
|
14
|
+
|
15
|
+
end if ::ActiveRecord::ConnectionAdapters::AbstractAdapter.const_defined? :SchemaCreation
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# this file is discovered by the extension mechanism
|
2
|
+
# @see {ArJdbc#discover_extensions}
|
3
|
+
|
4
|
+
module ArJdbc
|
5
|
+
|
6
|
+
require 'arjdbc/jdbc/adapter_require'
|
7
|
+
|
8
|
+
# Adapters built-in to AR :
|
9
|
+
|
10
|
+
require 'arjdbc/mysql' if ENV_JAVA['arjdbc.mysql.eager_load'].eql? 'true'
|
11
|
+
require 'arjdbc/postgresql' if ENV_JAVA['arjdbc.postgresql.eager_load'].eql? 'true'
|
12
|
+
require 'arjdbc/sqlite3' if ENV_JAVA['arjdbc.sqlite3.eager_load'].eql? 'true'
|
13
|
+
|
14
|
+
extension :MySQL do |name|
|
15
|
+
require('arjdbc/mysql') || true if name =~ /mysql/i
|
16
|
+
end
|
17
|
+
|
18
|
+
extension :PostgreSQL do |name|
|
19
|
+
require('arjdbc/postgresql') || true if name =~ /postgre/i
|
20
|
+
end
|
21
|
+
|
22
|
+
extension :SQLite3 do |name|
|
23
|
+
require('arjdbc/sqlite3') || true if name =~ /sqlite/i
|
24
|
+
end
|
25
|
+
|
26
|
+
# Other supported adapters :
|
27
|
+
|
28
|
+
extension :Derby do |name, config|
|
29
|
+
if name =~ /derby/i
|
30
|
+
require 'arjdbc/derby'
|
31
|
+
|
32
|
+
if config && config[:username].nil? # set the database schema name (:username) :
|
33
|
+
begin
|
34
|
+
ArJdbc.with_meta_data_from_data_source_if_any(config) do
|
35
|
+
|meta_data| config[:username] = meta_data.getUserName
|
36
|
+
end
|
37
|
+
rescue => e
|
38
|
+
ArJdbc.warn("failed to set :username from (Derby) database meda-data: #{e}")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
extension :H2 do |name|
|
47
|
+
require('arjdbc/h2') || true if name =~ /\.h2\./i
|
48
|
+
end
|
49
|
+
|
50
|
+
extension :HSQLDB do |name|
|
51
|
+
require('arjdbc/hsqldb') || true if name =~ /hsqldb/i
|
52
|
+
end
|
53
|
+
|
54
|
+
extension :MSSQL do |name|
|
55
|
+
require('arjdbc/mssql') || true if name =~ /sqlserver|tds|Microsoft SQL/i
|
56
|
+
end
|
57
|
+
|
58
|
+
extension :DB2 do |name, config|
|
59
|
+
if name =~ /db2/i && name !~ /as\/?400/i && config[:url] !~ /^jdbc:derby:net:/
|
60
|
+
require 'arjdbc/db2'
|
61
|
+
true
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
extension :AS400 do |name, config|
|
66
|
+
# The native JDBC driver always returns "DB2 UDB for AS/400"
|
67
|
+
if name =~ /as\/?400/i
|
68
|
+
require 'arjdbc/db2'
|
69
|
+
require 'arjdbc/db2/as400'
|
70
|
+
true
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
extension :Oracle do |name|
|
75
|
+
if name =~ /oracle/i
|
76
|
+
require 'arjdbc/oracle'
|
77
|
+
true
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# NOTE: following ones are likely getting deprecated :
|
82
|
+
|
83
|
+
extension :FireBird do |name|
|
84
|
+
if name =~ /firebird/i
|
85
|
+
require 'arjdbc/firebird'
|
86
|
+
true
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
extension :Sybase do |name|
|
91
|
+
if name =~ /sybase|tds/i
|
92
|
+
require 'arjdbc/sybase'
|
93
|
+
true
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
extension :Informix do |name|
|
98
|
+
if name =~ /informix/i
|
99
|
+
require 'arjdbc/informix'
|
100
|
+
true
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
@@ -0,0 +1,468 @@
|
|
1
|
+
ArJdbc.load_java_part :Firebird
|
2
|
+
|
3
|
+
module ArJdbc
|
4
|
+
module Firebird
|
5
|
+
|
6
|
+
# @private
|
7
|
+
def self.extended(adapter); initialize!; end
|
8
|
+
|
9
|
+
# @private
|
10
|
+
@@_initialized = nil
|
11
|
+
|
12
|
+
# @private
|
13
|
+
def self.initialize!
|
14
|
+
return if @@_initialized; @@_initialized = true
|
15
|
+
|
16
|
+
require 'arjdbc/util/serialized_attributes'
|
17
|
+
Util::SerializedAttributes.setup /blob/i
|
18
|
+
end
|
19
|
+
|
20
|
+
# @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class
|
21
|
+
def self.jdbc_connection_class
|
22
|
+
::ActiveRecord::ConnectionAdapters::FirebirdJdbcConnection
|
23
|
+
end
|
24
|
+
|
25
|
+
# @see ActiveRecord::ConnectionAdapters::JdbcColumn#column_types
|
26
|
+
def self.column_selector
|
27
|
+
[ /firebird/i, lambda { |cfg, column| column.extend(ColumnMethods) } ]
|
28
|
+
end
|
29
|
+
|
30
|
+
def jdbc_column_class; ::ActiveRecord::ConnectionAdapters::FirebirdAdapter::Column end
|
31
|
+
|
32
|
+
# @private
|
33
|
+
# @see ActiveRecord::ConnectionAdapters::JdbcColumn
|
34
|
+
module ColumnMethods
|
35
|
+
|
36
|
+
def default_value(value)
|
37
|
+
return nil unless value
|
38
|
+
if value =~ /^\s*DEFAULT\s+(.*)\s*$/i
|
39
|
+
return $1 unless $1.upcase == 'NULL'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def simplified_type(field_type)
|
46
|
+
case field_type
|
47
|
+
when /timestamp/i then :datetime
|
48
|
+
when /^smallint/i then :integer
|
49
|
+
when /^bigint|int/i then :integer
|
50
|
+
when /^double/i then :float # double precision
|
51
|
+
when /^decimal/i then
|
52
|
+
extract_scale(field_type) == 0 ? :integer : :decimal
|
53
|
+
when /^char\(1\)$/i then Firebird.emulate_booleans? ? :boolean : :string
|
54
|
+
when /^char/i then :string
|
55
|
+
when /^blob\ssub_type\s(\d)/i
|
56
|
+
return :binary if $1 == '0'
|
57
|
+
return :text if $1 == '1'
|
58
|
+
else
|
59
|
+
super
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
# @see ArJdbc::ArelHelper::ClassMethods#arel_visitor_type
|
66
|
+
def self.arel_visitor_type(config = nil)
|
67
|
+
require 'arel/visitors/firebird'; ::Arel::Visitors::Firebird
|
68
|
+
end
|
69
|
+
|
70
|
+
# @deprecated no longer used
|
71
|
+
def self.arel2_visitors(config = nil)
|
72
|
+
{ 'firebird' => arel_visitor_type, 'firebirdsql' => arel_visitor_type }
|
73
|
+
end
|
74
|
+
|
75
|
+
# @private
|
76
|
+
@@emulate_booleans = true
|
77
|
+
|
78
|
+
# Boolean emulation can be disabled using :
|
79
|
+
#
|
80
|
+
# ArJdbc::Firebird.emulate_booleans = false
|
81
|
+
#
|
82
|
+
def self.emulate_booleans?; @@emulate_booleans; end
|
83
|
+
# @deprecated Use {#emulate_booleans?} instead.
|
84
|
+
def self.emulate_booleans; @@emulate_booleans; end
|
85
|
+
# @see #emulate_booleans?
|
86
|
+
def self.emulate_booleans=(emulate); @@emulate_booleans = emulate; end
|
87
|
+
|
88
|
+
|
89
|
+
@@update_lob_values = true
|
90
|
+
|
91
|
+
# Updating records with LOB values (binary/text columns) in a separate
|
92
|
+
# statement can be disabled using :
|
93
|
+
#
|
94
|
+
# ArJdbc::Firebird.update_lob_values = false
|
95
|
+
def self.update_lob_values?; @@update_lob_values; end
|
96
|
+
# @see #update_lob_values?
|
97
|
+
def self.update_lob_values=(update); @@update_lob_values = update; end
|
98
|
+
|
99
|
+
# @see #update_lob_values?
|
100
|
+
def update_lob_values?; Firebird.update_lob_values?; end
|
101
|
+
|
102
|
+
# @see #quote
|
103
|
+
# @private
|
104
|
+
BLOB_VALUE_MARKER = "''"
|
105
|
+
|
106
|
+
ADAPTER_NAME = 'Firebird'.freeze
|
107
|
+
|
108
|
+
def adapter_name
|
109
|
+
ADAPTER_NAME
|
110
|
+
end
|
111
|
+
|
112
|
+
NATIVE_DATABASE_TYPES = {
|
113
|
+
:primary_key => "integer not null primary key",
|
114
|
+
:string => { :name => "varchar", :limit => 255 },
|
115
|
+
:text => { :name => "blob sub_type text" },
|
116
|
+
:integer => { :name => "integer" },
|
117
|
+
:float => { :name => "float" },
|
118
|
+
:datetime => { :name => "timestamp" },
|
119
|
+
:timestamp => { :name => "timestamp" },
|
120
|
+
:time => { :name => "time" },
|
121
|
+
:date => { :name => "date" },
|
122
|
+
:binary => { :name => "blob" },
|
123
|
+
:boolean => { :name => 'char', :limit => 1 },
|
124
|
+
:numeric => { :name => "numeric" },
|
125
|
+
:decimal => { :name => "decimal" },
|
126
|
+
:char => { :name => "char" },
|
127
|
+
}
|
128
|
+
|
129
|
+
def native_database_types
|
130
|
+
NATIVE_DATABASE_TYPES
|
131
|
+
end
|
132
|
+
|
133
|
+
def initialize_type_map(m)
|
134
|
+
register_class_with_limit m, %r(binary)i, ActiveRecord::Type::Binary
|
135
|
+
register_class_with_limit m, %r(text)i, ActiveRecord::Type::Text
|
136
|
+
|
137
|
+
register_class_with_limit m, %r(date(?:\(.*?\))?$)i, DateType
|
138
|
+
register_class_with_limit m, %r(time(?:\(.*?\))?$)i, ActiveRecord::Type::Time
|
139
|
+
|
140
|
+
register_class_with_limit m, %r(float)i, ActiveRecord::Type::Float
|
141
|
+
register_class_with_limit m, %r(int)i, ActiveRecord::Type::Integer
|
142
|
+
|
143
|
+
m.alias_type %r(blob)i, 'binary'
|
144
|
+
m.alias_type %r(clob)i, 'text'
|
145
|
+
m.alias_type %r(double)i, 'float'
|
146
|
+
|
147
|
+
m.register_type(%r(decimal)i) do |sql_type|
|
148
|
+
scale = extract_scale(sql_type)
|
149
|
+
precision = extract_precision(sql_type)
|
150
|
+
if scale == 0
|
151
|
+
ActiveRecord::Type::Integer.new(precision: precision)
|
152
|
+
else
|
153
|
+
ActiveRecord::Type::Decimal.new(precision: precision, scale: scale)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
m.alias_type %r(numeric)i, 'decimal'
|
157
|
+
|
158
|
+
register_class_with_limit m, %r(varchar)i, ActiveRecord::Type::String
|
159
|
+
|
160
|
+
m.register_type(%r(^char)i) do |sql_type|
|
161
|
+
precision = extract_precision(sql_type)
|
162
|
+
if Firebird.emulate_booleans? && precision == 1
|
163
|
+
ActiveRecord::Type::Boolean.new
|
164
|
+
else
|
165
|
+
ActiveRecord::Type::String.new(:precision => precision)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
register_class_with_limit m, %r(datetime)i, ActiveRecord::Type::DateTime
|
170
|
+
register_class_with_limit m, %r(timestamp)i, TimestampType
|
171
|
+
end if AR42
|
172
|
+
|
173
|
+
def clear_cache!
|
174
|
+
super
|
175
|
+
reload_type_map
|
176
|
+
end if AR42
|
177
|
+
|
178
|
+
# @private
|
179
|
+
class DateType < ActiveRecord::Type::Date
|
180
|
+
# NOTE: quote still gets called ...
|
181
|
+
#def type_cast_for_database(value)
|
182
|
+
# if value.acts_like?(:date)
|
183
|
+
# "'#{value.strftime("%Y-%m-%d")}'"
|
184
|
+
# else
|
185
|
+
# super
|
186
|
+
# end
|
187
|
+
#end
|
188
|
+
end if AR42
|
189
|
+
|
190
|
+
# @private
|
191
|
+
class TimestampType < ActiveRecord::Type::DateTime
|
192
|
+
def type; :timestamp end
|
193
|
+
end if AR42
|
194
|
+
|
195
|
+
def type_to_sql(type, limit = nil, precision = nil, scale = nil)
|
196
|
+
case type
|
197
|
+
when :integer
|
198
|
+
case limit
|
199
|
+
when nil then 'integer'
|
200
|
+
when 1..2 then 'smallint'
|
201
|
+
when 3..4 then 'integer'
|
202
|
+
when 5..8 then 'bigint'
|
203
|
+
else raise(ActiveRecordError, "No integer type has byte size #{limit}. "<<
|
204
|
+
"Use a NUMERIC with PRECISION 0 instead.")
|
205
|
+
end
|
206
|
+
when :float
|
207
|
+
if limit.nil? || limit <= 4
|
208
|
+
'float'
|
209
|
+
else
|
210
|
+
'double precision'
|
211
|
+
end
|
212
|
+
else super
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
# Does this adapter support migrations?
|
217
|
+
def supports_migrations?
|
218
|
+
true
|
219
|
+
end
|
220
|
+
|
221
|
+
# Can this adapter determine the primary key for tables not attached
|
222
|
+
# to an Active Record class, such as join tables?
|
223
|
+
def supports_primary_key?
|
224
|
+
true
|
225
|
+
end
|
226
|
+
|
227
|
+
# Does this adapter support using DISTINCT within COUNT?
|
228
|
+
def supports_count_distinct?
|
229
|
+
true
|
230
|
+
end
|
231
|
+
|
232
|
+
# Does this adapter support DDL rollbacks in transactions? That is, would
|
233
|
+
# CREATE TABLE or ALTER TABLE get rolled back by a transaction? PostgreSQL,
|
234
|
+
# SQL Server, and others support this. MySQL and others do not.
|
235
|
+
def supports_ddl_transactions?
|
236
|
+
false
|
237
|
+
end
|
238
|
+
|
239
|
+
# Does this adapter restrict the number of IDs you can use in a list.
|
240
|
+
# Oracle has a limit of 1000.
|
241
|
+
def ids_in_list_limit
|
242
|
+
1499
|
243
|
+
end
|
244
|
+
|
245
|
+
def insert(sql, name = nil, pk = nil, id_value = nil, sequence_name = nil, binds = [])
|
246
|
+
execute(sql, name, binds)
|
247
|
+
id_value
|
248
|
+
end
|
249
|
+
|
250
|
+
def add_limit_offset!(sql, options)
|
251
|
+
if limit = options[:limit]
|
252
|
+
insert_limit_offset!(sql, limit, options[:offset])
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
# @private
|
257
|
+
SELECT_RE = /\A(\s*SELECT\s)/i
|
258
|
+
|
259
|
+
def insert_limit_offset!(sql, limit, offset)
|
260
|
+
lim_off = ''
|
261
|
+
lim_off << "FIRST #{limit}" if limit
|
262
|
+
lim_off << " SKIP #{offset}" if offset
|
263
|
+
lim_off.strip!
|
264
|
+
|
265
|
+
sql.sub!(SELECT_RE, "\\&#{lim_off} ") unless lim_off.empty?
|
266
|
+
end
|
267
|
+
|
268
|
+
# Should primary key values be selected from their corresponding
|
269
|
+
# sequence before the insert statement?
|
270
|
+
# @see #next_sequence_value
|
271
|
+
# @override
|
272
|
+
def prefetch_primary_key?(table_name = nil)
|
273
|
+
return true if table_name.nil?
|
274
|
+
primary_keys(table_name.to_s).size == 1
|
275
|
+
# columns(table_name).count { |column| column.primary } == 1
|
276
|
+
end
|
277
|
+
|
278
|
+
IDENTIFIER_LENGTH = 31 # usual DB meta-identifier: 31 chars maximum
|
279
|
+
|
280
|
+
def table_alias_length; IDENTIFIER_LENGTH; end
|
281
|
+
def table_name_length; IDENTIFIER_LENGTH; end
|
282
|
+
def index_name_length; IDENTIFIER_LENGTH; end
|
283
|
+
def column_name_length; IDENTIFIER_LENGTH; end
|
284
|
+
|
285
|
+
def default_sequence_name(table_name, column = nil)
|
286
|
+
len = IDENTIFIER_LENGTH - 4
|
287
|
+
table_name.to_s.gsub (/(^|\.)([\w$-]{1,#{len}})([\w$-]*)$/), '\1\2_seq'
|
288
|
+
end
|
289
|
+
|
290
|
+
# Set the sequence to the max value of the table's column.
|
291
|
+
def reset_sequence!(table, column, sequence = nil)
|
292
|
+
max_id = select_value("SELECT max(#{column}) FROM #{table}")
|
293
|
+
execute("ALTER SEQUENCE #{default_sequence_name(table, column)} RESTART WITH #{max_id}")
|
294
|
+
end
|
295
|
+
|
296
|
+
def next_sequence_value(sequence_name)
|
297
|
+
select_one("SELECT GEN_ID(#{sequence_name}, 1 ) FROM RDB$DATABASE;")["gen_id"]
|
298
|
+
end
|
299
|
+
|
300
|
+
def create_table(name, options = {})
|
301
|
+
super(name, options)
|
302
|
+
execute "CREATE GENERATOR #{default_sequence_name(name)}"
|
303
|
+
end
|
304
|
+
|
305
|
+
def rename_table(name, new_name)
|
306
|
+
execute "RENAME #{name} TO #{new_name}"
|
307
|
+
name_seq, new_name_seq = default_sequence_name(name), default_sequence_name(new_name)
|
308
|
+
execute_quietly "UPDATE RDB$GENERATORS SET RDB$GENERATOR_NAME='#{new_name_seq}' WHERE RDB$GENERATOR_NAME='#{name_seq}'"
|
309
|
+
end
|
310
|
+
|
311
|
+
def drop_table(name, options = {})
|
312
|
+
super(name)
|
313
|
+
execute_quietly "DROP GENERATOR #{default_sequence_name(name)}"
|
314
|
+
end
|
315
|
+
|
316
|
+
def change_column(table_name, column_name, type, options = {})
|
317
|
+
execute "ALTER TABLE #{table_name} ALTER #{column_name} TYPE #{type_to_sql(type, options[:limit])}"
|
318
|
+
end
|
319
|
+
|
320
|
+
def rename_column(table_name, column_name, new_column_name)
|
321
|
+
execute "ALTER TABLE #{table_name} ALTER #{column_name} TO #{new_column_name}"
|
322
|
+
end
|
323
|
+
|
324
|
+
def remove_index(table_name, options)
|
325
|
+
execute "DROP INDEX #{index_name(table_name, options)}"
|
326
|
+
end
|
327
|
+
|
328
|
+
# @override
|
329
|
+
def quote(value, column = nil)
|
330
|
+
return value.quoted_id if value.respond_to?(:quoted_id)
|
331
|
+
return value if sql_literal?(value)
|
332
|
+
|
333
|
+
type = column && column.type
|
334
|
+
|
335
|
+
# BLOBs are updated separately by an after_save trigger.
|
336
|
+
if type == :binary || type == :text
|
337
|
+
if update_lob_values?
|
338
|
+
return value.nil? ? "NULL" : BLOB_VALUE_MARKER
|
339
|
+
else
|
340
|
+
return "'#{quote_string(value)}'"
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
case value
|
345
|
+
when String, ActiveSupport::Multibyte::Chars
|
346
|
+
value = value.to_s
|
347
|
+
if type == :integer
|
348
|
+
value.to_i.to_s
|
349
|
+
elsif type == :float
|
350
|
+
value.to_f.to_s
|
351
|
+
else
|
352
|
+
"'#{quote_string(value)}'"
|
353
|
+
end
|
354
|
+
when NilClass then 'NULL'
|
355
|
+
when TrueClass then (type == :integer ? '1' : quoted_true)
|
356
|
+
when FalseClass then (type == :integer ? '0' : quoted_false)
|
357
|
+
when Float, Fixnum, Bignum then value.to_s
|
358
|
+
# BigDecimals need to be output in a non-normalized form and quoted.
|
359
|
+
when BigDecimal then value.to_s('F')
|
360
|
+
when Symbol then "'#{quote_string(value.to_s)}'"
|
361
|
+
else
|
362
|
+
if type == :time && value.acts_like?(:time)
|
363
|
+
return "'#{get_time(value).strftime("%H:%M:%S")}'"
|
364
|
+
end
|
365
|
+
if type == :date && value.acts_like?(:date)
|
366
|
+
return "'#{value.strftime("%Y-%m-%d")}'"
|
367
|
+
end
|
368
|
+
super
|
369
|
+
end
|
370
|
+
end
|
371
|
+
|
372
|
+
# @override
|
373
|
+
def quoted_date(value)
|
374
|
+
if value.acts_like?(:time) && value.respond_to?(:usec)
|
375
|
+
usec = sprintf "%04d", (value.usec / 100.0).round
|
376
|
+
value = ::ActiveRecord::Base.default_timezone == :utc ? value.getutc : value.getlocal
|
377
|
+
"#{value.strftime("%Y-%m-%d %H:%M:%S")}.#{usec}"
|
378
|
+
else
|
379
|
+
super
|
380
|
+
end
|
381
|
+
end if ::ActiveRecord::VERSION::MAJOR >= 3
|
382
|
+
|
383
|
+
# @override
|
384
|
+
def quote_string(string)
|
385
|
+
string.gsub(/'/, "''")
|
386
|
+
end
|
387
|
+
|
388
|
+
# @override
|
389
|
+
def quoted_true
|
390
|
+
quote(1)
|
391
|
+
end
|
392
|
+
|
393
|
+
# @override
|
394
|
+
def quoted_false
|
395
|
+
quote(0)
|
396
|
+
end
|
397
|
+
|
398
|
+
# @override
|
399
|
+
def quote_table_name_for_assignment(table, attr)
|
400
|
+
quote_column_name(attr)
|
401
|
+
end if ::ActiveRecord::VERSION::MAJOR >= 4
|
402
|
+
|
403
|
+
# @override
|
404
|
+
def quote_column_name(column_name)
|
405
|
+
column_name = column_name.to_s
|
406
|
+
%Q("#{column_name =~ /[[:upper:]]/ ? column_name : column_name.upcase}")
|
407
|
+
end
|
408
|
+
|
409
|
+
def self.const_missing(name)
|
410
|
+
if name.to_sym == :Column
|
411
|
+
ArJdbc.deprecate("#{self.name}::Column will change to refer to the actual column class, please use ColumnMethods instead", :once)
|
412
|
+
return ColumnMethods
|
413
|
+
end
|
414
|
+
super
|
415
|
+
end
|
416
|
+
|
417
|
+
end
|
418
|
+
FireBird = Firebird
|
419
|
+
end
|
420
|
+
|
421
|
+
module ActiveRecord::ConnectionAdapters
|
422
|
+
remove_const(:FirebirdAdapter) if const_defined?(:FirebirdAdapter)
|
423
|
+
class FirebirdAdapter < JdbcAdapter
|
424
|
+
include ::ArJdbc::Firebird
|
425
|
+
|
426
|
+
class Column < JdbcColumn
|
427
|
+
include ::ArJdbc::Firebird::ColumnMethods
|
428
|
+
end
|
429
|
+
end
|
430
|
+
end
|
431
|
+
|
432
|
+
require 'arjdbc/util/quoted_cache'
|
433
|
+
|
434
|
+
module ActiveRecord::ConnectionAdapters
|
435
|
+
|
436
|
+
remove_const(:FirebirdAdapter) if const_defined?(:FirebirdAdapter)
|
437
|
+
|
438
|
+
class FirebirdAdapter < JdbcAdapter
|
439
|
+
include ::ArJdbc::Firebird
|
440
|
+
include ::ArJdbc::Util::QuotedCache
|
441
|
+
|
442
|
+
# By default, the FirebirdAdapter will consider all columns of type
|
443
|
+
# <tt>char(1)</tt> as boolean. If you wish to disable this :
|
444
|
+
#
|
445
|
+
# ActiveRecord::ConnectionAdapters::FirebirdAdapter.emulate_booleans = false
|
446
|
+
#
|
447
|
+
def self.emulate_booleans?; ::ArJdbc::Firebird.emulate_booleans?; end
|
448
|
+
def self.emulate_booleans; ::ArJdbc::Firebird.emulate_booleans?; end # oracle-enhanced
|
449
|
+
def self.emulate_booleans=(emulate); ::ArJdbc::Firebird.emulate_booleans = emulate; end
|
450
|
+
|
451
|
+
def initialize(*args)
|
452
|
+
::ArJdbc::Firebird.initialize!
|
453
|
+
super
|
454
|
+
end
|
455
|
+
|
456
|
+
end
|
457
|
+
|
458
|
+
class Column < JdbcColumn
|
459
|
+
include ::ArJdbc::Firebird::ColumnMethods
|
460
|
+
end
|
461
|
+
|
462
|
+
end
|
463
|
+
|
464
|
+
#module ArJdbc
|
465
|
+
# module Firebird
|
466
|
+
# Column = ::ActiveRecord::ConnectionAdapters::FirebirdColumn
|
467
|
+
# end
|
468
|
+
#end
|