activerecord-jdbc-adapter 70.0-java → 70.1-java
Sign up to get free protection for your applications and to get access to all the features.
- 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'
|