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.
Files changed (68) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -2
  3. data/.travis.yml +15 -416
  4. data/Gemfile +35 -37
  5. data/README.md +23 -118
  6. data/RUNNING_TESTS.md +31 -26
  7. data/Rakefile +2 -3
  8. data/activerecord-jdbc-adapter.gemspec +1 -2
  9. data/lib/arjdbc/abstract/connection_management.rb +21 -0
  10. data/lib/arjdbc/abstract/core.rb +62 -0
  11. data/lib/arjdbc/abstract/database_statements.rb +46 -0
  12. data/lib/arjdbc/abstract/statement_cache.rb +58 -0
  13. data/lib/arjdbc/abstract/transaction_support.rb +86 -0
  14. data/lib/arjdbc/derby/adapter.rb +6 -1
  15. data/lib/arjdbc/discover.rb +0 -7
  16. data/lib/arjdbc/firebird/adapter.rb +2 -2
  17. data/lib/arjdbc/jdbc/adapter.rb +10 -252
  18. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  19. data/lib/arjdbc/jdbc/connection.rb +6 -0
  20. data/lib/arjdbc/jdbc.rb +2 -2
  21. data/lib/arjdbc/mysql/adapter.rb +87 -944
  22. data/lib/arjdbc/mysql/connection_methods.rb +4 -2
  23. data/lib/arjdbc/postgresql/adapter.rb +288 -1023
  24. data/lib/arjdbc/postgresql/base/array_decoder.rb +26 -0
  25. data/lib/arjdbc/postgresql/base/array_encoder.rb +25 -0
  26. data/lib/arjdbc/postgresql/base/pgconn.rb +8 -5
  27. data/lib/arjdbc/postgresql/column.rb +10 -599
  28. data/lib/arjdbc/postgresql/connection_methods.rb +9 -0
  29. data/lib/arjdbc/postgresql/name.rb +24 -0
  30. data/lib/arjdbc/postgresql/oid_types.rb +25 -110
  31. data/lib/arjdbc/sqlite3/adapter.rb +171 -170
  32. data/lib/arjdbc/tasks/database_tasks.rb +1 -3
  33. data/lib/arjdbc/tasks/db2_database_tasks.rb +2 -2
  34. data/lib/arjdbc/version.rb +1 -1
  35. data/pom.xml +3 -3
  36. data/rakelib/02-test.rake +0 -12
  37. data/rakelib/compile.rake +1 -1
  38. data/rakelib/db.rake +7 -5
  39. data/rakelib/rails.rake +63 -64
  40. data/src/java/arjdbc/firebird/FirebirdRubyJdbcConnection.java +1 -17
  41. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +518 -1260
  42. data/src/java/arjdbc/mysql/MySQLModule.java +3 -3
  43. data/src/java/arjdbc/mysql/MySQLRubyJdbcConnection.java +53 -134
  44. data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +214 -240
  45. data/src/java/arjdbc/sqlite3/SQLite3Module.java +0 -20
  46. data/src/java/arjdbc/sqlite3/SQLite3RubyJdbcConnection.java +85 -10
  47. metadata +20 -34
  48. data/Appraisals +0 -41
  49. data/lib/active_record/connection_adapters/oracle_adapter.rb +0 -1
  50. data/lib/arjdbc/common_jdbc_methods.rb +0 -89
  51. data/lib/arjdbc/mysql/bulk_change_table.rb +0 -150
  52. data/lib/arjdbc/mysql/column.rb +0 -162
  53. data/lib/arjdbc/mysql/explain_support.rb +0 -82
  54. data/lib/arjdbc/mysql/schema_creation.rb +0 -58
  55. data/lib/arjdbc/oracle/adapter.rb +0 -952
  56. data/lib/arjdbc/oracle/column.rb +0 -126
  57. data/lib/arjdbc/oracle/connection_methods.rb +0 -21
  58. data/lib/arjdbc/oracle.rb +0 -4
  59. data/lib/arjdbc/postgresql/_bc_time_cast_patch.rb +0 -21
  60. data/lib/arjdbc/postgresql/base/oid.rb +0 -412
  61. data/lib/arjdbc/postgresql/base/schema_definitions.rb +0 -131
  62. data/lib/arjdbc/postgresql/explain_support.rb +0 -53
  63. data/lib/arjdbc/postgresql/oid/bytea.rb +0 -2
  64. data/lib/arjdbc/postgresql/schema_creation.rb +0 -60
  65. data/lib/arjdbc/tasks/oracle/enhanced_structure_dump.rb +0 -297
  66. data/lib/arjdbc/tasks/oracle_database_tasks.rb +0 -65
  67. data/src/java/arjdbc/oracle/OracleModule.java +0 -75
  68. 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
- if AR42
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 if AR42
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
- # NOTE: our type_map is lazy (on AR < 4.2)
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.alias_type 'oid', 'int2'
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 'tsvector', OID::SpecializedString.new(:tsvector)
196
- m.register_type 'macaddr', OID::SpecializedString.new(:macaddr)
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
- # FIXME: why are we keeping these types as strings?
201
- m.alias_type 'interval', 'varchar'
202
- m.alias_type 'path', 'varchar'
203
- m.alias_type 'line', 'varchar'
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 if AR42
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 if AR42
179
+ end
265
180
 
266
181
  end
267
182
  end