activerecord-jdbc-adapter 70.0-java → 70.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 +4 -4
- data/Rakefile +1 -1
- data/activerecord-jdbc-adapter.gemspec +1 -1
- 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/database_statements.rb +8 -0
- data/lib/arjdbc/discover.rb +0 -67
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/column.rb +1 -26
- data/lib/arjdbc/jdbc.rb +0 -7
- data/lib/arjdbc/oracle/adapter.rb +3 -22
- data/lib/arjdbc/postgresql/adapter.rb +152 -3
- data/lib/arjdbc/postgresql/oid_types.rb +155 -108
- data/lib/arjdbc/sqlite3/adapter.rb +27 -18
- data/lib/arjdbc/tasks/database_tasks.rb +0 -15
- data/lib/arjdbc/util/serialized_attributes.rb +0 -22
- data/lib/arjdbc/version.rb +1 -1
- data/rakelib/02-test.rake +3 -18
- data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +5 -0
- metadata +2 -35
- 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
@@ -1,5 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
2
|
require 'thread'
|
4
3
|
|
5
4
|
module ArJdbc
|
@@ -91,8 +90,23 @@ module ArJdbc
|
|
91
90
|
end
|
92
91
|
|
93
92
|
def get_oid_type(oid, fmod, column_name, sql_type = '') # :nodoc:
|
94
|
-
|
95
|
-
|
93
|
+
# Note: type_map is storing a bunch of oid type prefixed with a namespace even
|
94
|
+
# if they are not namespaced (e.g. ""."oidvector"). builtin types which are
|
95
|
+
# common seem to not be prefixed (e.g. "varchar"). OID numbers are also keys
|
96
|
+
# but JDBC never returns those. So the current scheme is to check with
|
97
|
+
# what we got and that covers number and plain strings and otherwise we will
|
98
|
+
# wrap with the namespace form.
|
99
|
+
found = type_map.key?(oid)
|
100
|
+
|
101
|
+
if !found
|
102
|
+
key = oid.kind_of?(String) && oid != "oid" ? "\"\".\"#{oid}\"" : oid
|
103
|
+
found = type_map.key?(key)
|
104
|
+
|
105
|
+
if !found
|
106
|
+
load_additional_types([oid])
|
107
|
+
else
|
108
|
+
oid = key
|
109
|
+
end
|
96
110
|
end
|
97
111
|
|
98
112
|
type_map.fetch(oid, fmod, sql_type) {
|
@@ -103,132 +117,165 @@ module ArJdbc
|
|
103
117
|
}
|
104
118
|
end
|
105
119
|
|
120
|
+
def reload_type_map
|
121
|
+
type_map.clear
|
122
|
+
initialize_type_map
|
123
|
+
end
|
124
|
+
|
125
|
+
def initialize_type_map_inner(m)
|
126
|
+
m.register_type "int2", Type::Integer.new(limit: 2)
|
127
|
+
m.register_type "int4", Type::Integer.new(limit: 4)
|
128
|
+
m.register_type "int8", Type::Integer.new(limit: 8)
|
129
|
+
m.register_type "oid", OID::Oid.new
|
130
|
+
m.register_type "float4", Type::Float.new
|
131
|
+
m.alias_type "float8", "float4"
|
132
|
+
m.register_type "text", Type::Text.new
|
133
|
+
register_class_with_limit m, "varchar", Type::String
|
134
|
+
m.alias_type "char", "varchar"
|
135
|
+
m.alias_type "name", "varchar"
|
136
|
+
m.alias_type "bpchar", "varchar"
|
137
|
+
m.register_type "bool", Type::Boolean.new
|
138
|
+
register_class_with_limit m, "bit", OID::Bit
|
139
|
+
register_class_with_limit m, "varbit", OID::BitVarying
|
140
|
+
m.register_type "date", OID::Date.new
|
141
|
+
|
142
|
+
m.register_type "money", OID::Money.new
|
143
|
+
m.register_type "bytea", OID::Bytea.new
|
144
|
+
m.register_type "point", OID::Point.new
|
145
|
+
m.register_type "hstore", OID::Hstore.new
|
146
|
+
m.register_type "json", Type::Json.new
|
147
|
+
m.register_type "jsonb", OID::Jsonb.new
|
148
|
+
m.register_type "cidr", OID::Cidr.new
|
149
|
+
m.register_type "inet", OID::Inet.new
|
150
|
+
m.register_type "uuid", OID::Uuid.new
|
151
|
+
m.register_type "xml", OID::Xml.new
|
152
|
+
m.register_type "tsvector", OID::SpecializedString.new(:tsvector)
|
153
|
+
m.register_type "macaddr", OID::Macaddr.new
|
154
|
+
m.register_type "citext", OID::SpecializedString.new(:citext)
|
155
|
+
m.register_type "ltree", OID::SpecializedString.new(:ltree)
|
156
|
+
m.register_type "line", OID::SpecializedString.new(:line)
|
157
|
+
m.register_type "lseg", OID::SpecializedString.new(:lseg)
|
158
|
+
m.register_type "box", OID::SpecializedString.new(:box)
|
159
|
+
m.register_type "path", OID::SpecializedString.new(:path)
|
160
|
+
m.register_type "polygon", OID::SpecializedString.new(:polygon)
|
161
|
+
m.register_type "circle", OID::SpecializedString.new(:circle)
|
162
|
+
m.register_type "regproc", OID::Enum.new
|
163
|
+
# FIXME: adding this vector type leads to quoting not handlign Array data in quoting.
|
164
|
+
#m.register_type "_int4", OID::Vector.new(",", m.lookup("int4"))
|
165
|
+
register_class_with_precision m, "time", Type::Time
|
166
|
+
register_class_with_precision m, "timestamp", OID::Timestamp
|
167
|
+
register_class_with_precision m, "timestamptz", OID::TimestampWithTimeZone
|
168
|
+
|
169
|
+
m.register_type "numeric" do |_, fmod, sql_type|
|
170
|
+
precision = extract_precision(sql_type)
|
171
|
+
scale = extract_scale(sql_type)
|
172
|
+
|
173
|
+
# The type for the numeric depends on the width of the field,
|
174
|
+
# so we'll do something special here.
|
175
|
+
#
|
176
|
+
# When dealing with decimal columns:
|
177
|
+
#
|
178
|
+
# places after decimal = fmod - 4 & 0xffff
|
179
|
+
# places before decimal = (fmod - 4) >> 16 & 0xffff
|
180
|
+
if fmod && (fmod - 4 & 0xffff).zero?
|
181
|
+
# FIXME: Remove this class, and the second argument to
|
182
|
+
# lookups on PG
|
183
|
+
Type::DecimalWithoutScale.new(precision: precision)
|
184
|
+
else
|
185
|
+
OID::Decimal.new(precision: precision, scale: scale)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
m.register_type "interval" do |*args, sql_type|
|
190
|
+
precision = extract_precision(sql_type)
|
191
|
+
OID::Interval.new(precision: precision)
|
192
|
+
end
|
193
|
+
|
194
|
+
# pgjdbc returns these if the column is auto-incrmenting
|
195
|
+
m.alias_type 'serial', 'int4'
|
196
|
+
m.alias_type 'bigserial', 'int8'
|
197
|
+
end
|
198
|
+
|
199
|
+
|
200
|
+
# We differ from AR here because we will initialize type_map when adapter initializes
|
106
201
|
def type_map
|
107
202
|
@type_map
|
108
203
|
end
|
109
204
|
|
110
|
-
def
|
111
|
-
|
112
|
-
|
113
|
-
initialize_type_map(@type_map)
|
114
|
-
end
|
205
|
+
def initialize_type_map(m = type_map)
|
206
|
+
initialize_type_map_inner(m)
|
207
|
+
load_additional_types
|
115
208
|
end
|
116
209
|
|
117
210
|
private
|
118
211
|
|
119
|
-
def
|
120
|
-
register_class_with_limit
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
register_class_with_limit m, 'varbit', OID::BitVarying
|
134
|
-
m.alias_type 'timestamptz', 'timestamp'
|
135
|
-
m.register_type 'date', OID::Date.new
|
136
|
-
|
137
|
-
m.register_type 'money', OID::Money.new
|
138
|
-
m.register_type 'bytea', OID::Bytea.new
|
139
|
-
m.register_type 'point', OID::Point.new
|
140
|
-
m.register_type 'hstore', OID::Hstore.new
|
141
|
-
m.register_type 'json', Type::Json.new
|
142
|
-
m.register_type 'jsonb', OID::Jsonb.new
|
143
|
-
m.register_type 'cidr', OID::Cidr.new
|
144
|
-
m.register_type 'inet', OID::Inet.new
|
145
|
-
m.register_type 'uuid', OID::Uuid.new
|
146
|
-
m.register_type 'xml', OID::Xml.new
|
147
|
-
m.register_type 'tsvector', OID::SpecializedString.new(:tsvector)
|
148
|
-
m.register_type 'macaddr', OID::Macaddr.new
|
149
|
-
m.register_type 'citext', OID::SpecializedString.new(:citext)
|
150
|
-
m.register_type 'ltree', OID::SpecializedString.new(:ltree)
|
151
|
-
m.register_type 'line', OID::SpecializedString.new(:line)
|
152
|
-
m.register_type 'lseg', OID::SpecializedString.new(:lseg)
|
153
|
-
m.register_type 'box', OID::SpecializedString.new(:box)
|
154
|
-
m.register_type 'path', OID::SpecializedString.new(:path)
|
155
|
-
m.register_type 'polygon', OID::SpecializedString.new(:polygon)
|
156
|
-
m.register_type 'circle', OID::SpecializedString.new(:circle)
|
157
|
-
|
158
|
-
m.register_type 'interval' do |*args, sql_type|
|
159
|
-
precision = extract_precision(sql_type)
|
160
|
-
OID::Interval.new(precision: precision)
|
212
|
+
def register_class_with_limit(...)
|
213
|
+
::ActiveRecord::ConnectionAdapters::AbstractAdapter.send(:register_class_with_limit, ...)
|
214
|
+
end
|
215
|
+
|
216
|
+
def register_class_with_precision(...)
|
217
|
+
::ActiveRecord::ConnectionAdapters::AbstractAdapter.send(:register_class_with_precision, ...)
|
218
|
+
end
|
219
|
+
|
220
|
+
def load_additional_types(oids = nil) # :nodoc:
|
221
|
+
initializer = ArjdbcTypeMapInitializer.new(type_map)
|
222
|
+
load_types_queries(initializer, oids) do |query|
|
223
|
+
execute_and_clear(query, "SCHEMA", []) do |records|
|
224
|
+
initializer.run(records)
|
225
|
+
end
|
161
226
|
end
|
227
|
+
end
|
162
228
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
#
|
173
|
-
# When dealing with decimal columns:
|
174
|
-
#
|
175
|
-
# places after decimal = fmod - 4 & 0xffff
|
176
|
-
# places before decimal = (fmod - 4) >> 16 & 0xffff
|
177
|
-
if fmod && (fmod - 4 & 0xffff).zero?
|
178
|
-
# FIXME: Remove this class, and the second argument to
|
179
|
-
# lookups on PG
|
180
|
-
Type::DecimalWithoutScale.new(precision: precision)
|
229
|
+
def load_types_queries(initializer, oids)
|
230
|
+
query = <<~SQL
|
231
|
+
SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype
|
232
|
+
FROM pg_type as t
|
233
|
+
LEFT JOIN pg_range as r ON oid = rngtypid
|
234
|
+
SQL
|
235
|
+
if oids
|
236
|
+
if oids.all? { |e| e.kind_of? Numeric }
|
237
|
+
yield query + "WHERE t.oid IN (%s)" % oids.join(", ")
|
181
238
|
else
|
182
|
-
|
239
|
+
in_list = oids.map { |e| %Q{'#{e}'} }.join(", ")
|
240
|
+
yield query + "WHERE t.typname IN (%s)" % in_list
|
183
241
|
end
|
242
|
+
else
|
243
|
+
yield query + initializer.query_conditions_for_known_type_names
|
244
|
+
yield query + initializer.query_conditions_for_known_type_types
|
245
|
+
yield query + initializer.query_conditions_for_array_types
|
184
246
|
end
|
185
|
-
|
186
|
-
load_additional_types(m)
|
187
|
-
|
188
|
-
# pgjdbc returns these if the column is auto-incrmenting
|
189
|
-
m.alias_type 'serial', 'int4'
|
190
|
-
m.alias_type 'bigserial', 'int8'
|
191
247
|
end
|
192
248
|
|
193
|
-
def
|
194
|
-
|
249
|
+
def update_typemap_for_default_timezone
|
250
|
+
if @default_timezone != ActiveRecord.default_timezone && @timestamp_decoder
|
251
|
+
decoder_class = ActiveRecord.default_timezone == :utc ?
|
252
|
+
PG::TextDecoder::TimestampUtc :
|
253
|
+
PG::TextDecoder::TimestampWithoutTimeZone
|
195
254
|
|
196
|
-
|
197
|
-
|
198
|
-
SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, r.rngsubtype, t.typtype, t.typbasetype,
|
199
|
-
ns.nspname, ns.nspname = ANY(current_schemas(true)) in_ns
|
200
|
-
FROM pg_type as t
|
201
|
-
LEFT JOIN pg_range as r ON oid = rngtypid
|
202
|
-
JOIN pg_namespace AS ns ON t.typnamespace = ns.oid
|
203
|
-
SQL
|
204
|
-
else
|
205
|
-
query = <<-SQL
|
206
|
-
SELECT t.oid, t.typname, t.typelem, t.typdelim, t.typinput, t.typtype, t.typbasetype,
|
207
|
-
ns.nspname, ns.nspname = ANY(current_schemas(true)) in_ns
|
208
|
-
FROM pg_type as t
|
209
|
-
JOIN pg_namespace AS ns ON t.typnamespace = ns.oid
|
210
|
-
SQL
|
211
|
-
end
|
255
|
+
@timestamp_decoder = decoder_class.new(@timestamp_decoder.to_h)
|
256
|
+
@connection.type_map_for_results.add_coder(@timestamp_decoder)
|
212
257
|
|
213
|
-
|
214
|
-
if oid.is_a? Numeric || oid.match(/^\d+$/)
|
215
|
-
# numeric OID
|
216
|
-
query += "WHERE t.oid = %s" % oid
|
258
|
+
@default_timezone = ActiveRecord.default_timezone
|
217
259
|
|
218
|
-
|
219
|
-
|
220
|
-
|
260
|
+
# if default timezone has changed, we need to reconfigure the connection
|
261
|
+
# (specifically, the session time zone)
|
262
|
+
configure_connection
|
263
|
+
end
|
264
|
+
end
|
221
265
|
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
else
|
227
|
-
query += initializer.query_conditions_for_initial_load
|
266
|
+
def extract_scale(sql_type)
|
267
|
+
case sql_type
|
268
|
+
when /\((\d+)\)/ then 0
|
269
|
+
when /\((\d+)(,(\d+))\)/ then $3.to_i
|
228
270
|
end
|
271
|
+
end
|
272
|
+
|
273
|
+
def extract_precision(sql_type)
|
274
|
+
$1.to_i if sql_type =~ /\((\d+)(,\d+)?\)/
|
275
|
+
end
|
229
276
|
|
230
|
-
|
231
|
-
|
277
|
+
def extract_limit(sql_type)
|
278
|
+
$1.to_i if sql_type =~ /\((.*)\)/
|
232
279
|
end
|
233
280
|
|
234
281
|
# Support arrays/ranges for defining attributes that don't exist in the db
|
@@ -756,6 +756,29 @@ module ActiveRecord::ConnectionAdapters
|
|
756
756
|
# Note: This is not an override of ours but a moved line from AR Sqlite3Adapter to register ours vs our copied module (which would be their class).
|
757
757
|
# ActiveSupport.run_load_hooks(:active_record_sqlite3adapter, SQLite3Adapter)
|
758
758
|
|
759
|
+
# DIFFERENCE: FQN
|
760
|
+
class SQLite3Integer < ::ActiveRecord::Type::Integer # :nodoc:
|
761
|
+
private
|
762
|
+
def _limit
|
763
|
+
# INTEGER storage class can be stored 8 bytes value.
|
764
|
+
# See https://www.sqlite.org/datatype3.html#storage_classes_and_datatypes
|
765
|
+
limit || 8
|
766
|
+
end
|
767
|
+
end
|
768
|
+
|
769
|
+
# DIFFERENCE: FQN
|
770
|
+
::ActiveRecord::Type.register(:integer, SQLite3Integer, adapter: :sqlite3)
|
771
|
+
|
772
|
+
class << self
|
773
|
+
private
|
774
|
+
def initialize_type_map(m)
|
775
|
+
super
|
776
|
+
register_class_with_limit m, %r(int)i, SQLite3Integer
|
777
|
+
end
|
778
|
+
end
|
779
|
+
|
780
|
+
TYPE_MAP = ActiveRecord::Type::TypeMap.new.tap { |m| initialize_type_map(m) }
|
781
|
+
|
759
782
|
private
|
760
783
|
|
761
784
|
# because the JDBC driver doesn't like multiple SQL statements in one JDBC statement
|
@@ -763,6 +786,10 @@ module ActiveRecord::ConnectionAdapters
|
|
763
786
|
total_sql
|
764
787
|
end
|
765
788
|
|
789
|
+
def type_map
|
790
|
+
TYPE_MAP
|
791
|
+
end
|
792
|
+
|
766
793
|
# combine
|
767
794
|
def write_query?(sql) # :nodoc:
|
768
795
|
return sql.any? { |stmt| super(stmt) } if sql.kind_of? Array
|
@@ -770,23 +797,5 @@ module ActiveRecord::ConnectionAdapters
|
|
770
797
|
rescue ArgumentError # Invalid encoding
|
771
798
|
!READ_QUERY.match?(sql.b)
|
772
799
|
end
|
773
|
-
|
774
|
-
def initialize_type_map(m = type_map)
|
775
|
-
super
|
776
|
-
register_class_with_limit m, %r(int)i, SQLite3Integer
|
777
|
-
end
|
778
|
-
|
779
|
-
# DIFFERENCE: FQN
|
780
|
-
class SQLite3Integer < ::ActiveRecord::Type::Integer # :nodoc:
|
781
|
-
private
|
782
|
-
def _limit
|
783
|
-
# INTEGER storage class can be stored 8 bytes value.
|
784
|
-
# See https://www.sqlite.org/datatype3.html#storage_classes_and_datatypes
|
785
|
-
limit || 8
|
786
|
-
end
|
787
|
-
end
|
788
|
-
|
789
|
-
# DIFFERENCE: FQN
|
790
|
-
::ActiveRecord::Type.register(:integer, SQLite3Integer, adapter: :sqlite3)
|
791
800
|
end
|
792
801
|
end
|
@@ -10,21 +10,6 @@ module ArJdbc
|
|
10
10
|
|
11
11
|
require 'arjdbc/tasks/jdbc_database_tasks'
|
12
12
|
require 'arjdbc/tasks/sqlite_database_tasks_patch'
|
13
|
-
#require 'arjdbc/tasks/db2_database_tasks'
|
14
|
-
#require 'arjdbc/tasks/derby_database_tasks'
|
15
|
-
#require 'arjdbc/tasks/h2_database_tasks'
|
16
|
-
#require 'arjdbc/tasks/hsqldb_database_tasks'
|
17
|
-
#require 'arjdbc/tasks/mssql_database_tasks'
|
18
|
-
|
19
|
-
# re-invent built-in (but deprecated on 4.0) tasks :
|
20
|
-
#register_tasks(/sqlserver/, MSSQLDatabaseTasks)
|
21
|
-
#register_tasks(/mssql/, MSSQLDatabaseTasks) # (built-in) alias
|
22
|
-
# tasks for custom (JDBC) adapters :
|
23
|
-
#register_tasks(/db2/, DB2DatabaseTasks)
|
24
|
-
#register_tasks(/derby/, DerbyDatabaseTasks)
|
25
|
-
#register_tasks(/h2/, H2DatabaseTasks)
|
26
|
-
#register_tasks(/hsqldb/, HSQLDBDatabaseTasks)
|
27
|
-
# (default) generic JDBC task :
|
28
13
|
register_tasks(/^jdbc$/, JdbcDatabaseTasks)
|
29
14
|
|
30
15
|
# NOTE: no need to register "built-in" adapters such as MySQL
|
@@ -31,33 +31,11 @@ module ArJdbc
|
|
31
31
|
SerializedAttributes.dump_column_value(self, column)
|
32
32
|
end
|
33
33
|
|
34
|
-
if defined? ActiveRecord::Type::Serialized # ArJdbc::AR42
|
35
|
-
|
36
34
|
def self.dump_column_value(record, column)
|
37
35
|
value = record[ column.name.to_s ]
|
38
36
|
column.cast_type.type_cast_for_database(value)
|
39
37
|
end
|
40
38
|
|
41
|
-
else
|
42
|
-
|
43
|
-
def self.dump_column_value(record, column)
|
44
|
-
value = record[ name = column.name.to_s ]
|
45
|
-
if record.class.respond_to?(:serialized_attributes)
|
46
|
-
if coder = record.class.serialized_attributes[name]
|
47
|
-
value = coder.respond_to?(:dump) ? coder.dump(value) : value.to_yaml
|
48
|
-
end
|
49
|
-
else
|
50
|
-
if record.respond_to?(:unserializable_attribute?)
|
51
|
-
value = value.to_yaml if record.unserializable_attribute?(name, column)
|
52
|
-
else
|
53
|
-
value = value.to_yaml if value.is_a?(Hash)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
value
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
39
|
def self.setup(lob_type = nil, after_save_alias = nil)
|
62
40
|
ActiveRecord::Base.send :include, self # include SerializedAttributes
|
63
41
|
ActiveRecord::Base.lob_type = lob_type unless lob_type.nil?
|
data/lib/arjdbc/version.rb
CHANGED
data/rakelib/02-test.rake
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
test_tasks = [ 'test_mysql', 'test_sqlite3', 'test_postgresql_with_hint' ]
|
3
3
|
if defined?(JRUBY_VERSION)
|
4
|
-
test_tasks.push :
|
4
|
+
test_tasks.push :test_hsqldb, :test_h2
|
5
5
|
test_tasks.push :test_jndi, :test_jdbc
|
6
6
|
end
|
7
7
|
|
@@ -55,7 +55,6 @@ def test_task_for(adapter, options = {})
|
|
55
55
|
test_task
|
56
56
|
end
|
57
57
|
|
58
|
-
test_task_for :Derby, :desc => 'Run tests against (embedded) DerbyDB'
|
59
58
|
test_task_for :H2, :desc => 'Run tests against H2 database engine'
|
60
59
|
test_task_for :HSQLDB, :desc => 'Run tests against HyperSQL (Java) database'
|
61
60
|
test_task_for :MySQL #, :prereqs => 'db:mysql'
|
@@ -64,29 +63,22 @@ test_task_for :PostgreSQL, :driver => ENV['JDBC_POSTGRES_VERSION'] || 'postgres'
|
|
64
63
|
task :test_postgres => :test_postgresql # alias
|
65
64
|
test_task_for :SQLite3, :driver => ENV['JDBC_SQLITE_VERSION']
|
66
65
|
task :test_sqlite => :test_sqlite3 # alias
|
67
|
-
test_task_for :Firebird
|
68
66
|
|
69
67
|
test_task_for :MariaDB, :files => FileList["test/db/mysql/*_test.rb"] do |test_task| #, :prereqs => 'db:mysql'
|
70
68
|
test_task.ruby_opts << '-rdb/mariadb_config'
|
71
69
|
end
|
72
70
|
|
73
71
|
# ensure driver for these DBs is on your class-path
|
74
|
-
[ :Oracle
|
72
|
+
[ :Oracle ].each do |adapter|
|
75
73
|
test_task_for adapter, :desc => "Run tests against #{adapter} (ensure driver is on class-path)"
|
76
74
|
end
|
77
75
|
|
78
|
-
test_task_for :AS400, :desc => "Run tests against AS400 (DB2) (ensure driver is on class-path)",
|
79
|
-
:files => FileList["test/db2*_test.rb"] + FileList["test/db/db2/*_test.rb"]
|
80
|
-
|
81
|
-
#task :test_jdbc => [ :test_jdbc_mysql, :test_jdbc_derby ] if defined?(JRUBY_VERSION)
|
82
|
-
|
83
76
|
test_task_for 'JDBC', :desc => 'Run tests against plain JDBC adapter (uses MySQL and Derby)',
|
84
77
|
:prereqs => [ 'db:mysql' ], :files => FileList['test/*jdbc_*test.rb'] do |test_task|
|
85
|
-
test_task.libs << 'jdbc-mysql/lib'
|
78
|
+
test_task.libs << 'jdbc-mysql/lib'
|
86
79
|
end
|
87
80
|
|
88
81
|
# TODO since Derby AR 5.x support is not implemented we only run JNDI with MySQL :
|
89
|
-
#task :test_jndi => [ :test_jndi_mysql, :test_jndi_derby ] if defined?(JRUBY_VERSION)
|
90
82
|
task :test_jndi => [ :test_jndi_mysql ] if defined?(JRUBY_VERSION)
|
91
83
|
|
92
84
|
jndi_classpath = [ 'test/jars/tomcat-juli.jar', 'test/jars/tomcat-catalina.jar' ]
|
@@ -100,13 +92,6 @@ get_jndi_classpath_opt = lambda do
|
|
100
92
|
"-J-cp \"#{cp.join(File::PATH_SEPARATOR)}\""
|
101
93
|
end
|
102
94
|
|
103
|
-
test_task_for 'JNDI_Derby', :desc => 'Run tests against a Derby JNDI connection',
|
104
|
-
:prereqs => jndi_classpath, :files => FileList['test/*jndi_derby*test.rb'] do |test_task|
|
105
|
-
test_task.libs << 'jdbc-derby/lib'
|
106
|
-
test_task.ruby_opts << get_jndi_classpath_opt.call
|
107
|
-
#test_task.verbose = true
|
108
|
-
end
|
109
|
-
|
110
95
|
test_task_for 'JNDI_MySQL', :desc => 'Run tests against a MySQL JNDI connection',
|
111
96
|
:prereqs => [ 'db:mysql' ] + jndi_classpath, :files => FileList['test/*jndi_mysql*test.rb'] do |test_task|
|
112
97
|
test_task.libs << 'jdbc-mysql/lib'
|
@@ -214,6 +214,11 @@ public class PostgreSQLRubyJdbcConnection extends arjdbc.jdbc.RubyJdbcConnection
|
|
214
214
|
});
|
215
215
|
}
|
216
216
|
|
217
|
+
@JRubyMethod
|
218
|
+
public IRubyObject exec_params(ThreadContext context, IRubyObject sql, IRubyObject binds) {
|
219
|
+
return execute_prepared_query(context, sql, binds, null);
|
220
|
+
}
|
221
|
+
|
217
222
|
private transient RubyClass oidArray; // PostgreSQL::OID::Array
|
218
223
|
|
219
224
|
private RubyClass oidArray(final ThreadContext context) {
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-jdbc-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '70.
|
4
|
+
version: '70.1'
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Nick Sieger, Ola Bini, Karol Bucek and JRuby contributors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
@@ -48,13 +48,9 @@ files:
|
|
48
48
|
- Rakefile
|
49
49
|
- Rakefile.jdbc
|
50
50
|
- activerecord-jdbc-adapter.gemspec
|
51
|
-
- lib/active_record/connection_adapters/as400_adapter.rb
|
52
|
-
- lib/active_record/connection_adapters/db2_adapter.rb
|
53
|
-
- lib/active_record/connection_adapters/derby_adapter.rb
|
54
51
|
- lib/active_record/connection_adapters/firebird_adapter.rb
|
55
52
|
- lib/active_record/connection_adapters/h2_adapter.rb
|
56
53
|
- lib/active_record/connection_adapters/hsqldb_adapter.rb
|
57
|
-
- lib/active_record/connection_adapters/informix_adapter.rb
|
58
54
|
- lib/active_record/connection_adapters/jdbc_adapter.rb
|
59
55
|
- lib/active_record/connection_adapters/jndi_adapter.rb
|
60
56
|
- lib/active_record/connection_adapters/mariadb_adapter.rb
|
@@ -64,9 +60,6 @@ files:
|
|
64
60
|
- lib/active_record/connection_adapters/sqlite3_adapter.rb
|
65
61
|
- lib/activerecord-jdbc-adapter.rb
|
66
62
|
- lib/arel/visitors/compat.rb
|
67
|
-
- lib/arel/visitors/db2.rb
|
68
|
-
- lib/arel/visitors/derby.rb
|
69
|
-
- lib/arel/visitors/firebird.rb
|
70
63
|
- lib/arel/visitors/h2.rb
|
71
64
|
- lib/arel/visitors/hsqldb.rb
|
72
65
|
- lib/arel/visitors/postgresql_jdbc.rb
|
@@ -78,20 +71,7 @@ files:
|
|
78
71
|
- lib/arjdbc/abstract/database_statements.rb
|
79
72
|
- lib/arjdbc/abstract/statement_cache.rb
|
80
73
|
- lib/arjdbc/abstract/transaction_support.rb
|
81
|
-
- lib/arjdbc/db2.rb
|
82
|
-
- lib/arjdbc/db2/adapter.rb
|
83
|
-
- lib/arjdbc/db2/as400.rb
|
84
|
-
- lib/arjdbc/db2/column.rb
|
85
|
-
- lib/arjdbc/db2/connection_methods.rb
|
86
|
-
- lib/arjdbc/derby.rb
|
87
|
-
- lib/arjdbc/derby/active_record_patch.rb
|
88
|
-
- lib/arjdbc/derby/adapter.rb
|
89
|
-
- lib/arjdbc/derby/connection_methods.rb
|
90
|
-
- lib/arjdbc/derby/schema_creation.rb
|
91
74
|
- lib/arjdbc/discover.rb
|
92
|
-
- lib/arjdbc/firebird.rb
|
93
|
-
- lib/arjdbc/firebird/adapter.rb
|
94
|
-
- lib/arjdbc/firebird/connection_methods.rb
|
95
75
|
- lib/arjdbc/h2.rb
|
96
76
|
- lib/arjdbc/h2/adapter.rb
|
97
77
|
- lib/arjdbc/h2/connection_methods.rb
|
@@ -101,8 +81,6 @@ files:
|
|
101
81
|
- lib/arjdbc/hsqldb/explain_support.rb
|
102
82
|
- lib/arjdbc/hsqldb/schema_creation.rb
|
103
83
|
- lib/arjdbc/informix.rb
|
104
|
-
- lib/arjdbc/informix/adapter.rb
|
105
|
-
- lib/arjdbc/informix/connection_methods.rb
|
106
84
|
- lib/arjdbc/jdbc.rb
|
107
85
|
- lib/arjdbc/jdbc/adapter.rb
|
108
86
|
- lib/arjdbc/jdbc/adapter_java.jar
|
@@ -138,13 +116,9 @@ files:
|
|
138
116
|
- lib/arjdbc/sqlite3.rb
|
139
117
|
- lib/arjdbc/sqlite3/adapter.rb
|
140
118
|
- lib/arjdbc/sqlite3/connection_methods.rb
|
141
|
-
- lib/arjdbc/sybase.rb
|
142
|
-
- lib/arjdbc/sybase/adapter.rb
|
143
119
|
- lib/arjdbc/tasks.rb
|
144
120
|
- lib/arjdbc/tasks/database_tasks.rb
|
145
121
|
- lib/arjdbc/tasks/databases.rake
|
146
|
-
- lib/arjdbc/tasks/db2_database_tasks.rb
|
147
|
-
- lib/arjdbc/tasks/derby_database_tasks.rb
|
148
122
|
- lib/arjdbc/tasks/h2_database_tasks.rb
|
149
123
|
- lib/arjdbc/tasks/hsqldb_database_tasks.rb
|
150
124
|
- lib/arjdbc/tasks/jdbc_database_tasks.rb
|
@@ -171,13 +145,9 @@ files:
|
|
171
145
|
- src/java/arjdbc/ArJdbcModule.java
|
172
146
|
- src/java/arjdbc/db2/DB2Module.java
|
173
147
|
- src/java/arjdbc/db2/DB2RubyJdbcConnection.java
|
174
|
-
- src/java/arjdbc/derby/DerbyModule.java
|
175
|
-
- src/java/arjdbc/derby/DerbyRubyJdbcConnection.java
|
176
|
-
- src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java
|
177
148
|
- src/java/arjdbc/h2/H2Module.java
|
178
149
|
- src/java/arjdbc/h2/H2RubyJdbcConnection.java
|
179
150
|
- src/java/arjdbc/hsqldb/HSQLDBModule.java
|
180
|
-
- src/java/arjdbc/informix/InformixRubyJdbcConnection.java
|
181
151
|
- src/java/arjdbc/jdbc/AdapterJavaService.java
|
182
152
|
- src/java/arjdbc/jdbc/Callable.java
|
183
153
|
- src/java/arjdbc/jdbc/ConnectionFactory.java
|
@@ -215,9 +185,6 @@ post_install_message:
|
|
215
185
|
rdoc_options:
|
216
186
|
- "--main"
|
217
187
|
- README.md
|
218
|
-
- "-SHN"
|
219
|
-
- "-f"
|
220
|
-
- darkfish
|
221
188
|
require_paths:
|
222
189
|
- lib
|
223
190
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -1 +0,0 @@
|
|
1
|
-
require 'arjdbc/db2'
|
@@ -1 +0,0 @@
|
|
1
|
-
require 'arjdbc/derby'
|
@@ -1 +0,0 @@
|
|
1
|
-
require 'arjdbc/informix'
|