activerecord-jdbc-alt-adapter 61.1.0-java → 70.0.0.rc1-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 +4 -4
- data/.github/workflows/ruby.yml +273 -0
- data/.gitignore +1 -0
- data/.travis.yml +3 -4
- data/Gemfile +8 -6
- data/README.md +2 -1
- data/Rakefile +1 -1
- data/activerecord-jdbc-adapter.gemspec +2 -2
- data/activerecord-jdbc-alt-adapter.gemspec +2 -2
- data/lib/arel/visitors/compat.rb +5 -33
- data/lib/arel/visitors/h2.rb +1 -13
- data/lib/arel/visitors/hsqldb.rb +1 -21
- data/lib/arel/visitors/sql_server.rb +2 -103
- data/lib/arjdbc/abstract/core.rb +8 -9
- data/lib/arjdbc/abstract/database_statements.rb +4 -4
- data/lib/arjdbc/discover.rb +0 -67
- data/lib/arjdbc/hsqldb/adapter.rb +2 -2
- data/lib/arjdbc/jdbc/adapter.rb +3 -3
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/adapter_require.rb +3 -1
- data/lib/arjdbc/jdbc/column.rb +1 -26
- data/lib/arjdbc/jdbc/type_cast.rb +2 -2
- data/lib/arjdbc/jdbc.rb +0 -7
- data/lib/arjdbc/mssql/adapter.rb +134 -105
- data/lib/arjdbc/mssql/quoting.rb +26 -27
- data/lib/arjdbc/mssql/schema_creation.rb +1 -1
- data/lib/arjdbc/mssql/schema_definitions.rb +32 -17
- data/lib/arjdbc/mssql/schema_dumper.rb +13 -1
- data/lib/arjdbc/mssql/schema_statements.rb +61 -36
- data/lib/arjdbc/mssql/transaction.rb +2 -2
- data/lib/arjdbc/mssql/types/date_and_time_types.rb +6 -6
- data/lib/arjdbc/mssql/types/numeric_types.rb +2 -2
- data/lib/arjdbc/mssql.rb +1 -1
- data/lib/arjdbc/mysql/adapter.rb +2 -1
- data/lib/arjdbc/oracle/adapter.rb +4 -23
- data/lib/arjdbc/postgresql/adapter.rb +64 -1
- data/lib/arjdbc/postgresql/oid_types.rb +68 -47
- data/lib/arjdbc/sqlite3/adapter.rb +132 -88
- data/lib/arjdbc/tasks/database_tasks.rb +0 -12
- data/lib/arjdbc/util/serialized_attributes.rb +0 -22
- data/lib/arjdbc/util/table_copier.rb +2 -1
- data/lib/arjdbc/version.rb +1 -1
- data/rakelib/02-test.rake +3 -18
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +17 -2
- data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +33 -0
- metadata +8 -40
- data/lib/active_record/connection_adapters/as400_adapter.rb +0 -2
- data/lib/active_record/connection_adapters/db2_adapter.rb +0 -1
- data/lib/active_record/connection_adapters/derby_adapter.rb +0 -1
- data/lib/active_record/connection_adapters/informix_adapter.rb +0 -1
- data/lib/arel/visitors/db2.rb +0 -137
- data/lib/arel/visitors/derby.rb +0 -112
- data/lib/arel/visitors/firebird.rb +0 -79
- data/lib/arjdbc/db2/adapter.rb +0 -808
- data/lib/arjdbc/db2/as400.rb +0 -142
- data/lib/arjdbc/db2/column.rb +0 -131
- data/lib/arjdbc/db2/connection_methods.rb +0 -48
- data/lib/arjdbc/db2.rb +0 -4
- data/lib/arjdbc/derby/active_record_patch.rb +0 -13
- data/lib/arjdbc/derby/adapter.rb +0 -521
- data/lib/arjdbc/derby/connection_methods.rb +0 -20
- data/lib/arjdbc/derby/schema_creation.rb +0 -15
- data/lib/arjdbc/derby.rb +0 -3
- data/lib/arjdbc/firebird/adapter.rb +0 -413
- data/lib/arjdbc/firebird/connection_methods.rb +0 -23
- data/lib/arjdbc/firebird.rb +0 -4
- data/lib/arjdbc/informix/adapter.rb +0 -139
- data/lib/arjdbc/informix/connection_methods.rb +0 -9
- data/lib/arjdbc/sybase/adapter.rb +0 -47
- data/lib/arjdbc/sybase.rb +0 -2
- data/lib/arjdbc/tasks/db2_database_tasks.rb +0 -104
- data/lib/arjdbc/tasks/derby_database_tasks.rb +0 -95
- data/src/java/arjdbc/derby/DerbyModule.java +0 -178
- data/src/java/arjdbc/derby/DerbyRubyJdbcConnection.java +0 -152
- data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +0 -174
- data/src/java/arjdbc/informix/InformixRubyJdbcConnection.java +0 -75
data/lib/arjdbc/db2/as400.rb
DELETED
@@ -1,142 +0,0 @@
|
|
1
|
-
require 'arjdbc/db2/adapter'
|
2
|
-
|
3
|
-
module ArJdbc
|
4
|
-
module AS400
|
5
|
-
include DB2
|
6
|
-
|
7
|
-
module ActiveRecord::ConnectionAdapters
|
8
|
-
remove_const(:AS400Adapter) if const_defined?(:AS400Adapter)
|
9
|
-
class AS400Adapter < DB2Adapter
|
10
|
-
|
11
|
-
include ::ArJdbc::AS400
|
12
|
-
|
13
|
-
def jdbc_connection_class(spec)
|
14
|
-
ArJdbc::AS400.jdbc_connection_class
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
# @private
|
20
|
-
def self.extended(adapter); DB2.extended(adapter); end
|
21
|
-
|
22
|
-
# @private
|
23
|
-
def self.initialize!; DB2.initialize!; end
|
24
|
-
|
25
|
-
# @see ActiveRecord::ConnectionAdapters::JdbcAdapter#jdbc_connection_class
|
26
|
-
def self.jdbc_connection_class; DB2.jdbc_connection_class; end
|
27
|
-
|
28
|
-
def self.column_selector
|
29
|
-
[ /as400/i, lambda { |config, column| column.extend(Column) } ]
|
30
|
-
end
|
31
|
-
|
32
|
-
# Boolean emulation can be disabled using :
|
33
|
-
#
|
34
|
-
# ArJdbc::AS400.emulate_booleans = false
|
35
|
-
#
|
36
|
-
def self.emulate_booleans; DB2.emulate_booleans; end
|
37
|
-
def self.emulate_booleans=(emulate); DB2.emulate_booleans = emulate; end
|
38
|
-
|
39
|
-
ADAPTER_NAME = 'AS400'.freeze
|
40
|
-
|
41
|
-
def adapter_name
|
42
|
-
ADAPTER_NAME
|
43
|
-
end
|
44
|
-
|
45
|
-
# @override
|
46
|
-
def prefetch_primary_key?(table_name = nil)
|
47
|
-
# TRUE if the table has no identity column
|
48
|
-
names = table_name.upcase.split(".")
|
49
|
-
sql = "SELECT 1 FROM SYSIBM.SQLPRIMARYKEYS WHERE "
|
50
|
-
sql << "TABLE_SCHEM = '#{names.first}' AND " if names.size == 2
|
51
|
-
sql << "TABLE_NAME = '#{names.last}'"
|
52
|
-
select_one(sql).nil?
|
53
|
-
end
|
54
|
-
|
55
|
-
# @override
|
56
|
-
def rename_column(table_name, column_name, new_column_name)
|
57
|
-
raise NotImplementedError, "rename_column is not supported on IBM iSeries"
|
58
|
-
end
|
59
|
-
|
60
|
-
# @override
|
61
|
-
def execute_table_change(sql, table_name, name = nil)
|
62
|
-
execute_and_auto_confirm(sql, name)
|
63
|
-
end
|
64
|
-
|
65
|
-
# holy moly batman! all this to tell AS400 "yes i am sure"
|
66
|
-
def execute_and_auto_confirm(sql, name = nil)
|
67
|
-
|
68
|
-
begin
|
69
|
-
@connection.execute_update "call qsys.qcmdexc('QSYS/CHGJOB INQMSGRPY(*SYSRPYL)',0000000031.00000)"
|
70
|
-
@connection.execute_update "call qsys.qcmdexc('ADDRPYLE SEQNBR(9876) MSGID(CPA32B2) RPY(''I'')',0000000045.00000)"
|
71
|
-
rescue Exception => e
|
72
|
-
raise "Could not call CHGJOB INQMSGRPY(*SYSRPYL) and ADDRPYLE SEQNBR(9876) MSGID(CPA32B2) RPY('I').\n" +
|
73
|
-
"Do you have authority to do this?\n\n#{e.inspect}"
|
74
|
-
end
|
75
|
-
|
76
|
-
begin
|
77
|
-
result = execute(sql, name)
|
78
|
-
rescue Exception
|
79
|
-
raise
|
80
|
-
else
|
81
|
-
# Return if all work fine
|
82
|
-
result
|
83
|
-
ensure
|
84
|
-
|
85
|
-
# Ensure default configuration restoration
|
86
|
-
begin
|
87
|
-
@connection.execute_update "call qsys.qcmdexc('QSYS/CHGJOB INQMSGRPY(*DFT)',0000000027.00000)"
|
88
|
-
@connection.execute_update "call qsys.qcmdexc('RMVRPYLE SEQNBR(9876)',0000000021.00000)"
|
89
|
-
rescue Exception => e
|
90
|
-
raise "Could not call CHGJOB INQMSGRPY(*DFT) and RMVRPYLE SEQNBR(9876).\n" +
|
91
|
-
"Do you have authority to do this?\n\n#{e.inspect}"
|
92
|
-
end
|
93
|
-
|
94
|
-
end
|
95
|
-
end
|
96
|
-
private :execute_and_auto_confirm
|
97
|
-
|
98
|
-
# disable all schemas browsing when default schema is specified
|
99
|
-
def table_exists?(name)
|
100
|
-
return false unless name
|
101
|
-
schema ? @connection.table_exists?(name, schema) : @connection.table_exists?(name)
|
102
|
-
end
|
103
|
-
|
104
|
-
DRIVER_NAME = 'com.ibm.as400.access.AS400JDBCDriver'.freeze
|
105
|
-
|
106
|
-
# @private
|
107
|
-
# @deprecated no longer used
|
108
|
-
def as400?
|
109
|
-
true
|
110
|
-
end
|
111
|
-
|
112
|
-
private
|
113
|
-
|
114
|
-
# @override
|
115
|
-
def db2_schema
|
116
|
-
@db2_schema = false unless defined? @db2_schema
|
117
|
-
return @db2_schema if @db2_schema != false
|
118
|
-
@db2_schema =
|
119
|
-
if config[:schema].present?
|
120
|
-
config[:schema]
|
121
|
-
elsif config[:jndi].present?
|
122
|
-
# Only found method to set db2_schema from jndi
|
123
|
-
result = select_one("SELECT CURRENT_SCHEMA FROM SYSIBM.SYSDUMMY1")
|
124
|
-
schema = result['00001']
|
125
|
-
# If the connection uses the library list schema name will be nil
|
126
|
-
if schema == '*LIBL'
|
127
|
-
schema = nil
|
128
|
-
end
|
129
|
-
schema
|
130
|
-
else
|
131
|
-
# AS400 implementation takes schema from library name (last part of URL)
|
132
|
-
# jdbc:as400://localhost/schema;naming=system;libraries=lib1,lib2
|
133
|
-
schema = nil
|
134
|
-
split = config[:url].split('/')
|
135
|
-
# Return nil if schema isn't defined
|
136
|
-
schema = split.last.split(';').first.strip if split.size == 4
|
137
|
-
schema
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
end
|
142
|
-
end
|
data/lib/arjdbc/db2/column.rb
DELETED
@@ -1,131 +0,0 @@
|
|
1
|
-
module ArJdbc
|
2
|
-
module DB2
|
3
|
-
|
4
|
-
# @see ActiveRecord::ConnectionAdapters::JdbcColumn#column_types
|
5
|
-
def self.column_selector
|
6
|
-
[ /(db2|zos)/i, lambda { |config, column| column.extend(Column) } ]
|
7
|
-
end
|
8
|
-
|
9
|
-
# @see ActiveRecord::ConnectionAdapters::JdbcColumn
|
10
|
-
module Column
|
11
|
-
|
12
|
-
# @private
|
13
|
-
def self.included(base)
|
14
|
-
# NOTE: assumes a standalone DB2Column class
|
15
|
-
class << base; include Cast; end
|
16
|
-
end
|
17
|
-
|
18
|
-
# @deprecated use `self.class.string_to_time`
|
19
|
-
def self.cast_to_date_or_time(value)
|
20
|
-
return value if value.is_a? Date
|
21
|
-
return nil if value.blank?
|
22
|
-
# https://github.com/jruby/activerecord-jdbc-adapter/commit/c225126e025df2e98ba3386c67e2a5bc5e5a73e6
|
23
|
-
return Time.now if value =~ /^CURRENT/
|
24
|
-
guess_date_or_time((value.is_a? Time) ? value : cast_to_time(value))
|
25
|
-
rescue
|
26
|
-
value
|
27
|
-
end
|
28
|
-
|
29
|
-
# @deprecated use `self.class.string_to_time` or `self.class.string_to_dummy_time`
|
30
|
-
def self.cast_to_time(value)
|
31
|
-
return value if value.is_a? Time
|
32
|
-
# AS400 returns a 2 digit year, LUW returns a 4 digit year
|
33
|
-
time = DateTime.parse(value).to_time rescue nil
|
34
|
-
return nil unless time
|
35
|
-
time_array = [time.year, time.month, time.day, time.hour, time.min, time.sec]
|
36
|
-
time_array[0] ||= 2000; time_array[1] ||= 1; time_array[2] ||= 1;
|
37
|
-
Time.send(ActiveRecord::Base.default_timezone, *time_array) rescue nil
|
38
|
-
end
|
39
|
-
|
40
|
-
# @deprecated
|
41
|
-
# @private
|
42
|
-
def self.guess_date_or_time(value)
|
43
|
-
return value if value.is_a? Date
|
44
|
-
( value && value.hour == 0 && value.min == 0 && value.sec == 0 ) ?
|
45
|
-
Date.new(value.year, value.month, value.day) : value
|
46
|
-
end
|
47
|
-
|
48
|
-
# @override
|
49
|
-
def type_cast(value)
|
50
|
-
# AR5.2
|
51
|
-
return super unless respond_to?(:type)
|
52
|
-
|
53
|
-
return nil if value.nil? || value == 'NULL' || value =~ /^\s*NULL\s*$/i
|
54
|
-
case type
|
55
|
-
when :string then value
|
56
|
-
when :integer then value.respond_to?(:to_i) ? value.to_i : (value ? 1 : 0)
|
57
|
-
when :primary_key then value.respond_to?(:to_i) ? value.to_i : (value ? 1 : 0)
|
58
|
-
when :float then value.to_f
|
59
|
-
when :date then self.class.string_to_date(value)
|
60
|
-
when :datetime then self.class.string_to_time(value)
|
61
|
-
when :timestamp then self.class.string_to_time(value)
|
62
|
-
when :time then self.class.string_to_dummy_time(value)
|
63
|
-
# TODO AS400 stores binary strings in EBCDIC (CCSID 65535), need to convert back to ASCII
|
64
|
-
else
|
65
|
-
super
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
# @override
|
70
|
-
def type_cast_code(var_name)
|
71
|
-
case type
|
72
|
-
when :date then "#{self.class.name}.string_to_date(#{var_name})"
|
73
|
-
when :datetime then "#{self.class.name}.string_to_time(#{var_name})"
|
74
|
-
when :timestamp then "#{self.class.name}.string_to_time(#{var_name})"
|
75
|
-
when :time then "#{self.class.name}.string_to_dummy_time(#{var_name})"
|
76
|
-
else
|
77
|
-
super
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
private
|
82
|
-
|
83
|
-
# Post process default value from JDBC into a Rails-friendly format (columns{-internal})
|
84
|
-
def default_value(value)
|
85
|
-
# IBM i (AS400) will return an empty string instead of null for no default
|
86
|
-
return nil if value.blank?
|
87
|
-
|
88
|
-
# string defaults are surrounded by single quotes
|
89
|
-
return $1 if value =~ /^'(.*)'$/
|
90
|
-
|
91
|
-
value
|
92
|
-
end
|
93
|
-
|
94
|
-
module Cast
|
95
|
-
|
96
|
-
# @override
|
97
|
-
def string_to_date(value)
|
98
|
-
return nil unless value = current_date_time_parse(value)
|
99
|
-
|
100
|
-
super
|
101
|
-
end
|
102
|
-
|
103
|
-
# @override
|
104
|
-
def string_to_time(value)
|
105
|
-
return nil unless value = current_date_time_parse(value)
|
106
|
-
|
107
|
-
super
|
108
|
-
end
|
109
|
-
|
110
|
-
# @override
|
111
|
-
def string_to_dummy_time(value)
|
112
|
-
return nil unless value = current_date_time_parse(value)
|
113
|
-
|
114
|
-
super
|
115
|
-
end
|
116
|
-
|
117
|
-
private
|
118
|
-
|
119
|
-
def current_date_time_parse(value)
|
120
|
-
return value unless value.is_a?(String)
|
121
|
-
return nil if value.empty?
|
122
|
-
return Time.now if value.index('CURRENT') == 0
|
123
|
-
|
124
|
-
return value
|
125
|
-
end
|
126
|
-
|
127
|
-
end
|
128
|
-
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
ArJdbc::ConnectionMethods.module_eval do
|
2
|
-
# @note Assumes DB2 driver (*db2jcc.jar*) is on class-path.
|
3
|
-
def db2_connection(config)
|
4
|
-
config[:adapter_spec] ||= ::ArJdbc::DB2
|
5
|
-
|
6
|
-
return jndi_connection(config) if jndi_config?(config)
|
7
|
-
|
8
|
-
config[:url] ||= begin
|
9
|
-
if config[:host] # Type 4 URL: jdbc:db2://server:port/database
|
10
|
-
config[:port] ||= 50000
|
11
|
-
"jdbc:db2://#{config[:host]}:#{config[:port]}/#{config[:database]}"
|
12
|
-
else # Type 2 URL: jdbc:db2:database
|
13
|
-
"jdbc:db2:#{config[:database]}"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
config[:driver] ||= ::ArJdbc::DB2::DRIVER_NAME
|
17
|
-
config[:connection_alive_sql] ||= 'SELECT 1 FROM syscat.tables FETCH FIRST 1 ROWS ONLY'
|
18
|
-
config[:adapter_class] = ActiveRecord::ConnectionAdapters::DB2Adapter unless config.key?(:adapter_class)
|
19
|
-
|
20
|
-
jdbc_connection(config)
|
21
|
-
end
|
22
|
-
alias_method :jdbcdb2_connection, :db2_connection
|
23
|
-
|
24
|
-
# @note Assumes AS400 driver (*jt400.jar*) is on class-path.
|
25
|
-
def as400_connection(config)
|
26
|
-
config[:adapter_spec] ||= ::ArJdbc::AS400
|
27
|
-
|
28
|
-
return jndi_connection(config) if config[:jndi]
|
29
|
-
|
30
|
-
config[:url] ||= begin
|
31
|
-
# jdbc:as400://[host]
|
32
|
-
url = 'jdbc:as400://'
|
33
|
-
url << config[:host] if config[:host]
|
34
|
-
# jdbc:as400://myiSeries;database name=IASP1
|
35
|
-
url << ";database name=#{config[:database]}" if config[:database]
|
36
|
-
# jdbc:as400://[host];proxy server=HODServerName:proxyServerPort
|
37
|
-
url << ";proxy server=#{config[:proxy]}" if config[:proxy]
|
38
|
-
url
|
39
|
-
end
|
40
|
-
require 'arjdbc/db2/as400'
|
41
|
-
config[:driver] ||= ::ArJdbc::AS400::DRIVER_NAME
|
42
|
-
config[:connection_alive_sql] ||= 'SELECT 1 FROM sysibm.tables FETCH FIRST 1 ROWS ONLY'
|
43
|
-
config[:adapter_class] = ActiveRecord::ConnectionAdapters::AS400Adapter unless config.key?(:adapter_class)
|
44
|
-
|
45
|
-
jdbc_connection(config)
|
46
|
-
end
|
47
|
-
alias_method :jdbcas400_connection, :as400_connection
|
48
|
-
end
|
data/lib/arjdbc/db2.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
# Needed because Rails is broken wrt to quoting of some values.
|
2
|
-
# Most databases are nice about it, but not Derby.
|
3
|
-
# The real issue is that you can't compare a CHAR value to a NUMBER column.
|
4
|
-
ActiveRecord::Associations::ClassMethods.module_eval do
|
5
|
-
private
|
6
|
-
def select_limited_ids_list(options, join_dependency)
|
7
|
-
return super unless connection.is_a?(ArJdbc::Derby)
|
8
|
-
connection.select_all(
|
9
|
-
construct_finder_sql_for_association_limiting(options, join_dependency),
|
10
|
-
"#{name} Load IDs For Limited Eager Loading"
|
11
|
-
).collect { |row| connection.quote(row[primary_key], columns_hash[primary_key]) }.join(", ")
|
12
|
-
end
|
13
|
-
end
|