activerecord-jdbc-alt-adapter 50.7.0-java → 51.3.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -3
  3. data/.travis.yml +24 -28
  4. data/Gemfile +5 -2
  5. data/README.md +26 -20
  6. data/Rakefile +4 -30
  7. data/activerecord-jdbc-adapter.gemspec +2 -2
  8. data/activerecord-jdbc-alt-adapter.gemspec +4 -3
  9. data/lib/arel/visitors/sqlserver.rb +17 -3
  10. data/lib/arjdbc/abstract/core.rb +4 -2
  11. data/lib/arjdbc/abstract/database_statements.rb +2 -8
  12. data/lib/arjdbc/abstract/transaction_support.rb +2 -9
  13. data/lib/arjdbc/db2/adapter.rb +2 -52
  14. data/lib/arjdbc/jdbc/adapter_java.jar +0 -0
  15. data/lib/arjdbc/jdbc/column.rb +11 -5
  16. data/lib/arjdbc/jdbc/error.rb +1 -1
  17. data/lib/arjdbc/jdbc.rb +4 -0
  18. data/lib/arjdbc/mssql/adapter.rb +33 -39
  19. data/lib/arjdbc/mssql/connection_methods.rb +0 -5
  20. data/lib/arjdbc/mssql/database_statements.rb +1 -1
  21. data/lib/arjdbc/mssql/explain_support.rb +1 -1
  22. data/lib/arjdbc/mssql/{extensions.rb → extensions/attribute_methods.rb} +0 -0
  23. data/lib/arjdbc/mssql/extensions/calculations.rb +29 -0
  24. data/lib/arjdbc/mssql/schema_creation.rb +12 -0
  25. data/lib/arjdbc/mssql/schema_definitions.rb +17 -0
  26. data/lib/arjdbc/mssql/schema_dumper.rb +37 -0
  27. data/lib/arjdbc/mssql/schema_statements.rb +73 -44
  28. data/lib/arjdbc/mssql/types/date_and_time_types.rb +9 -9
  29. data/lib/arjdbc/mssql/utils.rb +1 -0
  30. data/lib/arjdbc/mssql.rb +1 -1
  31. data/lib/arjdbc/mysql/adapter.rb +12 -1
  32. data/lib/arjdbc/mysql/connection_methods.rb +7 -13
  33. data/lib/arjdbc/postgresql/adapter.rb +29 -12
  34. data/lib/arjdbc/postgresql/column.rb +3 -6
  35. data/lib/arjdbc/postgresql/connection_methods.rb +1 -3
  36. data/lib/arjdbc/postgresql/oid_types.rb +7 -12
  37. data/lib/arjdbc/sqlite3/adapter.rb +169 -139
  38. data/lib/arjdbc/sqlite3/connection_methods.rb +1 -2
  39. data/lib/arjdbc/version.rb +1 -1
  40. data/rakelib/01-tomcat.rake +2 -2
  41. data/rakelib/02-test.rake +2 -0
  42. data/rakelib/rails.rake +1 -1
  43. data/src/java/arjdbc/jdbc/RubyJdbcConnection.java +17 -68
  44. data/src/java/arjdbc/mssql/MSSQLRubyJdbcConnection.java +38 -282
  45. data/src/java/arjdbc/postgresql/ByteaUtils.java +1 -0
  46. data/src/java/arjdbc/postgresql/PostgreSQLRubyJdbcConnection.java +3 -3
  47. data/src/java/arjdbc/util/DateTimeUtils.java +5 -22
  48. metadata +20 -12
  49. data/lib/activerecord-jdbc-alt-adapter.rb +0 -1
@@ -7,6 +7,7 @@ require 'active_record/connection_adapters/postgresql/column'
7
7
  require 'active_record/connection_adapters/postgresql/explain_pretty_printer'
8
8
  require 'active_record/connection_adapters/postgresql/quoting'
9
9
  require 'active_record/connection_adapters/postgresql/referential_integrity'
10
+ require 'active_record/connection_adapters/postgresql/schema_creation'
10
11
  require 'active_record/connection_adapters/postgresql/schema_dumper'
11
12
  require 'active_record/connection_adapters/postgresql/schema_statements'
12
13
  require 'active_record/connection_adapters/postgresql/type_metadata'
@@ -146,8 +147,7 @@ module ArJdbc
146
147
  ActiveRecordError = ::ActiveRecord::ActiveRecordError
147
148
 
148
149
  NATIVE_DATABASE_TYPES = {
149
- bigserial: 'bigserial',
150
- primary_key: 'serial primary key',
150
+ primary_key: 'bigserial primary key',
151
151
  bigint: { name: 'bigint' },
152
152
  binary: { name: 'bytea' },
153
153
  bit: { name: 'bit' },
@@ -178,10 +178,10 @@ module ArJdbc
178
178
  money: { name: 'money' },
179
179
  numeric: { name: 'numeric' },
180
180
  numrange: { name: 'numrange' },
181
+ oid: { name: 'oid' },
181
182
  path: { name: 'path' },
182
183
  point: { name: 'point' },
183
184
  polygon: { name: 'polygon' },
184
- serial: { name: 'serial' }, # auto-inc integer, bigserial, smallserial
185
185
  string: { name: 'character varying' },
186
186
  text: { name: 'text' },
187
187
  time: { name: 'time' },
@@ -249,15 +249,11 @@ module ArJdbc
249
249
 
250
250
  def supports_index_sort_order?; true end
251
251
 
252
- def supports_migrations?; true end
253
-
254
252
  def supports_partial_index?; true end
255
253
 
256
- def supports_primary_key?; true end # Supports finding primary key on non-Active Record tables
257
-
258
254
  def supports_savepoints?; true end
259
255
 
260
- def supports_transaction_isolation?(level = nil); true end
256
+ def supports_transaction_isolation?; true end
261
257
 
262
258
  def supports_views?; true end
263
259
 
@@ -287,6 +283,10 @@ module ArJdbc
287
283
  postgresql_version >= 80200
288
284
  end
289
285
 
286
+ def supports_pgcrypto_uuid?
287
+ postgresql_version >= 90400
288
+ end
289
+
290
290
  # Range data-types weren't introduced until PostgreSQL 9.2.
291
291
  def supports_ranges?
292
292
  postgresql_version >= 90200
@@ -296,6 +296,11 @@ module ArJdbc
296
296
  postgresql_version >= 90200
297
297
  end
298
298
 
299
+ # From AR 5.1 postgres_adapter.rb
300
+ def default_index_type?(index) # :nodoc:
301
+ index.using == :btree || super
302
+ end
303
+
299
304
  def enable_extension(name)
300
305
  execute("CREATE EXTENSION IF NOT EXISTS \"#{name}\"")
301
306
  end
@@ -347,7 +352,7 @@ module ArJdbc
347
352
  select_value("SELECT pg_advisory_unlock(#{lock_id})")
348
353
  end
349
354
 
350
- # Returns the configured supported identifier length supported by PostgreSQL
355
+ # Returns the max identifier length supported by PostgreSQL
351
356
  def max_identifier_length
352
357
  @max_identifier_length ||= select_one('SHOW max_identifier_length', 'SCHEMA'.freeze)['max_identifier_length'].to_i
353
358
  end
@@ -395,7 +400,8 @@ module ArJdbc
395
400
  # 'DISCARD ALL' fails if we are inside a transaction
396
401
  def clear_cache!
397
402
  super
398
- @connection.execute 'DEALLOCATE ALL' if supports_statement_cache? && @connection.active?
403
+ # Make sure all query plans are *really* gone
404
+ @connection.execute 'DEALLOCATE ALL' if active?
399
405
  end
400
406
 
401
407
  def reset!
@@ -511,7 +517,7 @@ module ArJdbc
511
517
  col_description(a.attrelid, a.attnum) AS comment
512
518
  FROM pg_attribute a
513
519
  LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
514
- WHERE a.attrelid = '#{quote_table_name(table_name)}'::regclass
520
+ WHERE a.attrelid = #{quote(quote_table_name(table_name))}::regclass
515
521
  AND a.attnum > 0 AND NOT a.attisdropped
516
522
  ORDER BY a.attnum
517
523
  end_sql
@@ -556,13 +562,24 @@ module ArJdbc
556
562
  end
557
563
 
558
564
  def translate_exception(exception, message)
565
+ return super unless exception.is_a?(ActiveRecord::JDBCError)
566
+
567
+ # TODO: Can we base these on an error code of some kind?
559
568
  case exception.message
560
569
  when /duplicate key value violates unique constraint/
561
570
  ::ActiveRecord::RecordNotUnique.new(message)
571
+ when /violates not-null constraint/
572
+ ::ActiveRecord::NotNullViolation.new(message)
562
573
  when /violates foreign key constraint/
563
574
  ::ActiveRecord::InvalidForeignKey.new(message)
564
575
  when /value too long/
565
576
  ::ActiveRecord::ValueTooLong.new(message)
577
+ when /out of range/
578
+ ::ActiveRecord::RangeError.new(message)
579
+ when /could not serialize/
580
+ ::ActiveRecord::SerializationFailure.new(message)
581
+ when /deadlock detected/
582
+ ::ActiveRecord::Deadlocked.new(message)
566
583
  else
567
584
  super
568
585
  end
@@ -637,6 +654,7 @@ module ActiveRecord::ConnectionAdapters
637
654
  def initialize(connection, logger = nil, connection_parameters = nil, config = {})
638
655
  # @local_tz is initialized as nil to avoid warnings when connect tries to use it
639
656
  @local_tz = nil
657
+ @max_identifier_length = nil
640
658
 
641
659
  super(connection, logger, config) # configure_connection happens in super
642
660
 
@@ -652,7 +670,6 @@ module ActiveRecord::ConnectionAdapters
652
670
 
653
671
  require 'active_record/connection_adapters/postgresql/schema_definitions'
654
672
 
655
- ColumnDefinition = ActiveRecord::ConnectionAdapters::PostgreSQL::ColumnDefinition
656
673
  ColumnMethods = ActiveRecord::ConnectionAdapters::PostgreSQL::ColumnMethods
657
674
  TableDefinition = ActiveRecord::ConnectionAdapters::PostgreSQL::TableDefinition
658
675
  Table = ActiveRecord::ConnectionAdapters::PostgreSQL::Table
@@ -15,7 +15,7 @@ module ArJdbc
15
15
  end
16
16
 
17
17
  # Extracts the value from a PostgreSQL column default definition.
18
- def extract_value_from_default(default)
18
+ def extract_value_from_default(default) # :nodoc:
19
19
  case default
20
20
  # Quoted types
21
21
  when /\A[\(B]?'(.*)'.*::"?([\w. ]+)"?(?:\[\])?\z/m
@@ -41,13 +41,10 @@ module ArJdbc
41
41
  end
42
42
  end
43
43
 
44
- def extract_default_function(default_value, default)
45
- default if has_default_function?(default_value, default)
44
+ def extract_default_function(default_value, default) # :nodoc:
45
+ default if ! default_value && ( %r{\w+\(.*\)|\(.*\)::\w+} === default )
46
46
  end
47
47
 
48
- def has_default_function?(default_value, default)
49
- !default_value && %r{\w+\(.*\)|\(.*\)::\w+|CURRENT_DATE|CURRENT_TIMESTAMP} === default
50
- end
51
48
  end
52
49
 
53
50
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  ArJdbc::ConnectionMethods.module_eval do
3
3
  def postgresql_connection(config)
4
- config = config.deep_dup
5
4
  # NOTE: this isn't "really" necessary but Rails (in tests) assumes being able to :
6
5
  # ActiveRecord::Base.postgresql_connection ActiveRecord::Base.configurations['arunit'].merge(:insert_returning => false)
7
6
  # ... while using symbols by default but than configurations returning string keys ;(
@@ -17,8 +16,7 @@ ArJdbc::ConnectionMethods.module_eval do
17
16
  ::Jdbc::Postgres.load_driver(:require) if defined?(::Jdbc::Postgres.load_driver)
18
17
  rescue LoadError # assuming driver.jar is on the class-path
19
18
  end
20
- driver = (config[:driver] ||=
21
- defined?(::Jdbc::Postgres.driver_name) ? ::Jdbc::Postgres.driver_name : 'org.postgresql.Driver')
19
+ driver = config[:driver] ||= 'org.postgresql.Driver'
22
20
 
23
21
  host = config[:host] ||= ( config[:hostaddr] || ENV['PGHOST'] || 'localhost' )
24
22
  port = config[:port] ||= ( ENV['PGPORT'] || 5432 )
@@ -124,7 +124,7 @@ module ArJdbc
124
124
  register_class_with_limit m, 'int2', Type::Integer
125
125
  register_class_with_limit m, 'int4', Type::Integer
126
126
  register_class_with_limit m, 'int8', Type::Integer
127
- m.alias_type 'oid', 'int2'
127
+ m.register_type 'oid', OID::Oid.new
128
128
  m.register_type 'float4', Type::Float.new
129
129
  m.alias_type 'float8', 'float4'
130
130
  m.register_type 'text', Type::Text.new
@@ -159,15 +159,10 @@ module ArJdbc
159
159
  m.register_type 'polygon', OID::SpecializedString.new(:polygon)
160
160
  m.register_type 'circle', OID::SpecializedString.new(:circle)
161
161
 
162
- #m.alias_type 'interval', 'varchar' # in Rails 5.0
163
- # This is how Rails 5.1 handles it.
164
- # In 5.0 SpecializedString doesn't take a precision option 5.0 actually leaves it as a regular String
165
- # but we need it specialized to support prepared statements
166
- # m.register_type 'interval' do |_, _, sql_type|
167
- # precision = extract_precision(sql_type)
168
- # OID::SpecializedString.new(:interval, precision: precision)
169
- # end
170
- m.register_type 'interval', OID::SpecializedString.new(:interval)
162
+ m.register_type 'interval' do |_, _, sql_type|
163
+ precision = extract_precision(sql_type)
164
+ OID::SpecializedString.new(:interval, precision: precision)
165
+ end
171
166
 
172
167
  register_class_with_precision m, 'time', Type::Time
173
168
  register_class_with_precision m, 'timestamp', OID::DateTime
@@ -255,8 +250,8 @@ module ArJdbc
255
250
  ActiveRecord::Type.register(:json, OID::Json, adapter: :postgresql)
256
251
  ActiveRecord::Type.register(:jsonb, OID::Jsonb, adapter: :postgresql)
257
252
  ActiveRecord::Type.register(:money, OID::Money, adapter: :postgresql)
258
- ActiveRecord::Type.register(:point, OID::Rails51Point, adapter: :postgresql)
259
- ActiveRecord::Type.register(:legacy_point, OID::Point, adapter: :postgresql)
253
+ ActiveRecord::Type.register(:point, OID::Point, adapter: :postgresql)
254
+ ActiveRecord::Type.register(:legacy_point, OID::LegacyPoint, adapter: :postgresql)
260
255
  ActiveRecord::Type.register(:uuid, OID::Uuid, adapter: :postgresql)
261
256
  ActiveRecord::Type.register(:vector, OID::Vector, adapter: :postgresql)
262
257
  ActiveRecord::Type.register(:xml, OID::Xml, adapter: :postgresql)