activerecord-jdbc-adapter 5.0.pre1 → 51.0
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 +5 -5
- data/.gitignore +1 -2
- data/.travis.yml +15 -416
- data/Gemfile +35 -37
- data/README.md +23 -118
- data/RUNNING_TESTS.md +31 -26
- data/Rakefile +2 -3
- data/activerecord-jdbc-adapter.gemspec +1 -2
- data/lib/arjdbc/abstract/connection_management.rb +21 -0
- data/lib/arjdbc/abstract/core.rb +62 -0
- data/lib/arjdbc/abstract/database_statements.rb +46 -0
- data/lib/arjdbc/abstract/statement_cache.rb +58 -0
- data/lib/arjdbc/abstract/transaction_support.rb +86 -0
- data/lib/arjdbc/derby/adapter.rb +6 -1
- data/lib/arjdbc/discover.rb +0 -7
- data/lib/arjdbc/firebird/adapter.rb +2 -2
- data/lib/arjdbc/jdbc/adapter.rb +10 -252
- data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
- data/lib/arjdbc/jdbc/connection.rb +6 -0
- data/lib/arjdbc/jdbc.rb +2 -2
- data/lib/arjdbc/mysql/adapter.rb +87 -944
- data/lib/arjdbc/mysql/connection_methods.rb +4 -2
- data/lib/arjdbc/postgresql/adapter.rb +288 -1023
- data/lib/arjdbc/postgresql/base/array_decoder.rb +26 -0
- data/lib/arjdbc/postgresql/base/array_encoder.rb +25 -0
- data/lib/arjdbc/postgresql/base/pgconn.rb +8 -5
- data/lib/arjdbc/postgresql/column.rb +10 -599
- data/lib/arjdbc/postgresql/connection_methods.rb +9 -0
- data/lib/arjdbc/postgresql/name.rb +24 -0
- data/lib/arjdbc/postgresql/oid_types.rb +25 -110
- data/lib/arjdbc/sqlite3/adapter.rb +171 -170
- data/lib/arjdbc/tasks/database_tasks.rb +1 -3
- data/lib/arjdbc/tasks/db2_database_tasks.rb +2 -2
- data/lib/arjdbc/version.rb +1 -1
- data/pom.xml +3 -3
- data/rakelib/02-test.rake +0 -12
- data/rakelib/compile.rake +1 -1
- data/rakelib/db.rake +7 -5
- data/rakelib/rails.rake +63 -64
- data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +1 -17
- data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +518 -1260
- data/src/java/arjdbc/mysql/MySQLModule.java +3 -3
- data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +53 -134
- data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +214 -240
- data/src/java/arjdbc/sqlite3/SQLite3Module.java +0 -20
- data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +85 -10
- metadata +20 -34
- data/Appraisals +0 -41
- data/lib/active_record/connection_adapters/oracle_adapter.rb +0 -1
- data/lib/arjdbc/common_jdbc_methods.rb +0 -89
- data/lib/arjdbc/mysql/bulk_change_table.rb +0 -150
- data/lib/arjdbc/mysql/column.rb +0 -162
- data/lib/arjdbc/mysql/explain_support.rb +0 -82
- data/lib/arjdbc/mysql/schema_creation.rb +0 -58
- data/lib/arjdbc/oracle/adapter.rb +0 -952
- data/lib/arjdbc/oracle/column.rb +0 -126
- data/lib/arjdbc/oracle/connection_methods.rb +0 -21
- data/lib/arjdbc/oracle.rb +0 -4
- data/lib/arjdbc/postgresql/_bc_time_cast_patch.rb +0 -21
- data/lib/arjdbc/postgresql/base/oid.rb +0 -412
- data/lib/arjdbc/postgresql/base/schema_definitions.rb +0 -131
- data/lib/arjdbc/postgresql/explain_support.rb +0 -53
- data/lib/arjdbc/postgresql/oid/bytea.rb +0 -2
- data/lib/arjdbc/postgresql/schema_creation.rb +0 -60
- data/lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb +0 -297
- data/lib/arjdbc/tasks/oracle_database_tasks.rb +0 -65
- data/src/java/arjdbc/oracle/OracleModule.java +0 -75
- data/src/java/arjdbc/oracle/OracleRubyJdbcConnection.java +0 -465
@@ -42,7 +42,16 @@ ArJdbc::ConnectionMethods.module_eval do
|
|
42
42
|
properties['tcpKeepAlive'] ||= config[:keepalives] if config.key?(:keepalives)
|
43
43
|
properties['kerberosServerName'] ||= config[:krbsrvname] if config[:krbsrvname]
|
44
44
|
|
45
|
+
# If prepared statements are off, lets make sure they are really *off*
|
46
|
+
properties['prepareThreshold'] = 0 unless config[:prepared_statements]
|
47
|
+
|
45
48
|
jdbc_connection(config)
|
49
|
+
rescue ActiveRecord::JDBCError => e
|
50
|
+
if e.message.include?('does not exist')
|
51
|
+
raise ActiveRecord::NoDatabaseError, e.message
|
52
|
+
else
|
53
|
+
raise
|
54
|
+
end
|
46
55
|
end
|
47
56
|
alias_method :jdbcpostgresql_connection, :postgresql_connection
|
48
57
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# This patches the Name class so that it doesn't use pg gem specific quoting
|
2
|
+
module ActiveRecord
|
3
|
+
module ConnectionAdapters
|
4
|
+
module PostgreSQL
|
5
|
+
class Name
|
6
|
+
|
7
|
+
def quoted
|
8
|
+
if schema
|
9
|
+
"#{quote_identifier(schema)}#{SEPARATOR}#{quote_identifier(identifier)}"
|
10
|
+
else
|
11
|
+
quote_identifier(identifier)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def quote_identifier(name)
|
18
|
+
%("#{name.to_s.gsub("\"", "\"\"")}")
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -3,13 +3,7 @@ require 'thread'
|
|
3
3
|
module ArJdbc
|
4
4
|
module PostgreSQL
|
5
5
|
|
6
|
-
|
7
|
-
require 'active_record/connection_adapters/postgresql/oid'
|
8
|
-
require 'arjdbc/postgresql/oid/bytea.rb'
|
9
|
-
else
|
10
|
-
require 'arjdbc/postgresql/base/oid'
|
11
|
-
end
|
12
|
-
|
6
|
+
require 'active_record/connection_adapters/postgresql/oid'
|
13
7
|
require 'arjdbc/postgresql/base/pgconn'
|
14
8
|
|
15
9
|
def self.unescape_bytea(escaped)
|
@@ -22,6 +16,13 @@ module ArJdbc
|
|
22
16
|
# @private
|
23
17
|
module OIDTypes
|
24
18
|
|
19
|
+
# Support arrays/ranges for defining attributes that don't exist in the db
|
20
|
+
Type.add_modifier({ array: true }, OID::Array, adapter: :postgresql)
|
21
|
+
Type.add_modifier({ range: true }, OID::Range, adapter: :postgresql)
|
22
|
+
Type.register(:enum, OID::Enum, adapter: :postgresql)
|
23
|
+
Type.register(:point, OID::Point, adapter: :postgresql)
|
24
|
+
Type.register(:legacy_point, OID::LegacyPoint, adapter: :postgresql)
|
25
|
+
|
25
26
|
# @override
|
26
27
|
def enable_extension(name)
|
27
28
|
result = super(name)
|
@@ -47,14 +48,7 @@ module ArJdbc
|
|
47
48
|
def lookup_cast_type(sql_type)
|
48
49
|
oid = execute("SELECT #{quote(sql_type)}::regtype::oid", "SCHEMA")
|
49
50
|
super oid.first['oid'].to_i
|
50
|
-
end
|
51
|
-
|
52
|
-
def get_oid_type(oid, fmod, column_name)
|
53
|
-
type_map.fetch(oid, fmod) {
|
54
|
-
warn "unknown OID #{oid}: failed to recognize type of '#{column_name}'. It will be treated as String."
|
55
|
-
type_map[oid] = OID::Identity.new
|
56
|
-
}
|
57
|
-
end unless AR42
|
51
|
+
end
|
58
52
|
|
59
53
|
def get_oid_type(oid, fmod, column_name, sql_type = '')
|
60
54
|
if !type_map.key?(oid)
|
@@ -67,40 +61,10 @@ module ArJdbc
|
|
67
61
|
type_map.register_type(oid, cast_type)
|
68
62
|
end
|
69
63
|
}
|
70
|
-
end if AR42
|
71
|
-
|
72
|
-
@@type_map_cache = {}
|
73
|
-
@@type_map_cache_lock = Mutex.new
|
74
|
-
|
75
|
-
if AR42
|
76
|
-
TypeMap = ActiveRecord::Type::HashLookupTypeMap
|
77
|
-
else
|
78
|
-
TypeMap = OID::TypeMap
|
79
|
-
end
|
80
|
-
|
81
|
-
# @see #type_map
|
82
|
-
# @private
|
83
|
-
TypeMap.class_eval do
|
84
|
-
def dup
|
85
|
-
dup = super # make sure @mapping is not shared
|
86
|
-
dup.instance_variable_set(:@mapping, @mapping.dup)
|
87
|
-
dup
|
88
|
-
end
|
89
64
|
end
|
90
65
|
|
91
66
|
def type_map
|
92
|
-
|
93
|
-
# ... since it's only used for `adapter.accessor`
|
94
|
-
@type_map ||= begin
|
95
|
-
if type_map = @@type_map_cache[ type_cache_key ]
|
96
|
-
type_map.dup
|
97
|
-
else
|
98
|
-
type_map = TypeMap.new
|
99
|
-
initialize_type_map(type_map)
|
100
|
-
cache_type_map(type_map)
|
101
|
-
type_map
|
102
|
-
end
|
103
|
-
end
|
67
|
+
@type_map
|
104
68
|
end
|
105
69
|
|
106
70
|
def reload_type_map
|
@@ -112,62 +76,11 @@ module ArJdbc
|
|
112
76
|
|
113
77
|
private
|
114
78
|
|
115
|
-
def cache_type_map(type_map)
|
116
|
-
@@type_map_cache_lock.synchronize do
|
117
|
-
@@type_map_cache[ type_cache_key ] = type_map
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
def type_cache_key
|
122
|
-
config.hash + ( 7 * extensions.hash )
|
123
|
-
end
|
124
|
-
|
125
|
-
def add_oid(row, records_by_oid, type_map)
|
126
|
-
return type_map if type_map.key? row['type_elem'].to_i
|
127
|
-
|
128
|
-
if OID.registered_type? typname = row['typname']
|
129
|
-
# this composite type is explicitly registered
|
130
|
-
vector = OID::NAMES[ typname ]
|
131
|
-
else
|
132
|
-
# use the default for composite types
|
133
|
-
unless type_map.key? typelem = row['typelem'].to_i
|
134
|
-
add_oid records_by_oid[ row['typelem'] ], records_by_oid, type_map
|
135
|
-
end
|
136
|
-
|
137
|
-
vector = OID::Vector.new row['typdelim'], type_map[typelem]
|
138
|
-
end
|
139
|
-
|
140
|
-
type_map[ row['oid'].to_i ] = vector
|
141
|
-
type_map
|
142
|
-
end
|
143
|
-
|
144
|
-
def initialize_type_map(type_map)
|
145
|
-
result = execute('SELECT oid, typname, typelem, typdelim, typinput FROM pg_type', 'SCHEMA')
|
146
|
-
leaves, nodes = result.partition { |row| row['typelem'].to_s == '0' }
|
147
|
-
# populate the leaf nodes
|
148
|
-
leaves.find_all { |row| OID.registered_type? row['typname'] }.each do |row|
|
149
|
-
type_map[ row['oid'].to_i ] = OID::NAMES[ row['typname'] ]
|
150
|
-
end
|
151
|
-
|
152
|
-
records_by_oid = result.group_by { |row| row['oid'] }
|
153
|
-
|
154
|
-
arrays, nodes = nodes.partition { |row| row['typinput'] == 'array_in' }
|
155
|
-
|
156
|
-
# populate composite types
|
157
|
-
nodes.each { |row| add_oid row, records_by_oid, type_map }
|
158
|
-
|
159
|
-
# populate array types
|
160
|
-
arrays.find_all { |row| type_map.key? row['typelem'].to_i }.each do |row|
|
161
|
-
array = OID::Array.new type_map[ row['typelem'].to_i ]
|
162
|
-
type_map[ row['oid'].to_i ] = array
|
163
|
-
end
|
164
|
-
end unless AR42
|
165
|
-
|
166
79
|
def initialize_type_map(m)
|
167
80
|
register_class_with_limit m, 'int2', Type::Integer
|
168
81
|
register_class_with_limit m, 'int4', Type::Integer
|
169
82
|
register_class_with_limit m, 'int8', Type::Integer
|
170
|
-
m.
|
83
|
+
m.register_type 'oid', OID::Oid.new
|
171
84
|
m.register_type 'float4', Type::Float.new
|
172
85
|
m.alias_type 'float8', 'float4'
|
173
86
|
m.register_type 'text', Type::Text.new
|
@@ -192,19 +105,21 @@ module ArJdbc
|
|
192
105
|
m.register_type 'inet', OID::Inet.new
|
193
106
|
m.register_type 'uuid', OID::Uuid.new
|
194
107
|
m.register_type 'xml', OID::Xml.new
|
195
|
-
m.register_type '
|
196
|
-
m.register_type '
|
108
|
+
m.register_type 'box', OID::SpecializedString.new(:box)
|
109
|
+
m.register_type 'circle', OID::SpecializedString.new(:circle)
|
197
110
|
m.register_type 'citext', OID::SpecializedString.new(:citext)
|
111
|
+
m.register_type 'line', OID::SpecializedString.new(:line)
|
112
|
+
m.register_type 'lseg', OID::SpecializedString.new(:lseg)
|
198
113
|
m.register_type 'ltree', OID::SpecializedString.new(:ltree)
|
114
|
+
m.register_type 'macaddr', OID::SpecializedString.new(:macaddr)
|
115
|
+
m.register_type 'path', OID::SpecializedString.new(:path)
|
116
|
+
m.register_type 'polygon', OID::SpecializedString.new(:polygon)
|
117
|
+
m.register_type 'tsvector', OID::SpecializedString.new(:tsvector)
|
199
118
|
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
m.alias_type 'polygon', 'varchar'
|
205
|
-
m.alias_type 'circle', 'varchar'
|
206
|
-
m.alias_type 'lseg', 'varchar'
|
207
|
-
m.alias_type 'box', 'varchar'
|
119
|
+
m.register_type 'interval' do |_, _, sql_type|
|
120
|
+
precision = extract_precision(sql_type)
|
121
|
+
OID::SpecializedString.new(:interval, precision: precision)
|
122
|
+
end
|
208
123
|
|
209
124
|
m.register_type 'timestamp' do |_, _, sql_type|
|
210
125
|
precision = extract_precision(sql_type)
|
@@ -232,7 +147,7 @@ module ArJdbc
|
|
232
147
|
end
|
233
148
|
|
234
149
|
load_additional_types(m)
|
235
|
-
end
|
150
|
+
end
|
236
151
|
|
237
152
|
def load_additional_types(type_map, oids = nil)
|
238
153
|
if supports_ranges?
|
@@ -261,7 +176,7 @@ module ArJdbc
|
|
261
176
|
|
262
177
|
records = execute(query, 'SCHEMA')
|
263
178
|
initializer.run(records)
|
264
|
-
end
|
179
|
+
end
|
265
180
|
|
266
181
|
end
|
267
182
|
end
|