sequel 4.47.0 → 4.48.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 (177) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +134 -0
  3. data/Rakefile +1 -1
  4. data/doc/release_notes/4.48.0.txt +293 -0
  5. data/lib/sequel/adapters/ado/access.rb +2 -1
  6. data/lib/sequel/adapters/do/postgres.rb +5 -2
  7. data/lib/sequel/adapters/ibmdb.rb +24 -7
  8. data/lib/sequel/adapters/jdbc.rb +36 -22
  9. data/lib/sequel/adapters/jdbc/db2.rb +12 -3
  10. data/lib/sequel/adapters/jdbc/derby.rb +4 -5
  11. data/lib/sequel/adapters/jdbc/oracle.rb +16 -2
  12. data/lib/sequel/adapters/jdbc/postgresql.rb +43 -18
  13. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +9 -7
  14. data/lib/sequel/adapters/jdbc/sqlserver.rb +11 -4
  15. data/lib/sequel/adapters/mock.rb +24 -19
  16. data/lib/sequel/adapters/mysql.rb +17 -16
  17. data/lib/sequel/adapters/mysql2.rb +4 -5
  18. data/lib/sequel/adapters/oracle.rb +5 -9
  19. data/lib/sequel/adapters/postgres.rb +89 -102
  20. data/lib/sequel/adapters/shared/db2.rb +22 -6
  21. data/lib/sequel/adapters/shared/mssql.rb +5 -4
  22. data/lib/sequel/adapters/shared/mysql.rb +75 -24
  23. data/lib/sequel/adapters/shared/postgres.rb +196 -94
  24. data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
  25. data/lib/sequel/adapters/shared/sqlite.rb +72 -82
  26. data/lib/sequel/adapters/sqlanywhere.rb +4 -1
  27. data/lib/sequel/adapters/sqlite.rb +5 -3
  28. data/lib/sequel/adapters/swift/postgres.rb +5 -2
  29. data/lib/sequel/adapters/tinytds.rb +0 -5
  30. data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -1
  31. data/lib/sequel/adapters/utils/pg_types.rb +2 -76
  32. data/lib/sequel/core.rb +2 -2
  33. data/lib/sequel/database/connecting.rb +5 -5
  34. data/lib/sequel/database/dataset.rb +6 -3
  35. data/lib/sequel/database/misc.rb +1 -1
  36. data/lib/sequel/database/query.rb +3 -0
  37. data/lib/sequel/database/schema_methods.rb +1 -1
  38. data/lib/sequel/dataset/actions.rb +18 -10
  39. data/lib/sequel/dataset/graph.rb +1 -1
  40. data/lib/sequel/dataset/misc.rb +1 -0
  41. data/lib/sequel/dataset/prepared_statements.rb +3 -3
  42. data/lib/sequel/dataset/query.rb +19 -8
  43. data/lib/sequel/extensions/core_extensions.rb +4 -1
  44. data/lib/sequel/extensions/duplicate_columns_handler.rb +1 -1
  45. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +3 -0
  46. data/lib/sequel/extensions/filter_having.rb +2 -0
  47. data/lib/sequel/extensions/freeze_datasets.rb +2 -0
  48. data/lib/sequel/extensions/from_block.rb +1 -1
  49. data/lib/sequel/extensions/graph_each.rb +2 -2
  50. data/lib/sequel/extensions/hash_aliases.rb +2 -0
  51. data/lib/sequel/extensions/identifier_mangling.rb +0 -7
  52. data/lib/sequel/extensions/meta_def.rb +2 -0
  53. data/lib/sequel/extensions/migration.rb +6 -6
  54. data/lib/sequel/extensions/no_auto_literal_strings.rb +1 -1
  55. data/lib/sequel/extensions/pagination.rb +1 -1
  56. data/lib/sequel/extensions/pg_array.rb +207 -130
  57. data/lib/sequel/extensions/pg_hstore.rb +38 -20
  58. data/lib/sequel/extensions/pg_inet.rb +18 -6
  59. data/lib/sequel/extensions/pg_interval.rb +19 -12
  60. data/lib/sequel/extensions/pg_json.rb +25 -14
  61. data/lib/sequel/extensions/pg_json_ops.rb +2 -2
  62. data/lib/sequel/extensions/pg_range.rb +133 -100
  63. data/lib/sequel/extensions/pg_range_ops.rb +4 -3
  64. data/lib/sequel/extensions/pg_row.rb +68 -39
  65. data/lib/sequel/extensions/pg_row_ops.rb +11 -5
  66. data/lib/sequel/extensions/query_literals.rb +2 -0
  67. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +2 -0
  68. data/lib/sequel/extensions/s.rb +1 -1
  69. data/lib/sequel/extensions/schema_dumper.rb +24 -24
  70. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +3 -1
  71. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +83 -0
  72. data/lib/sequel/extensions/set_overrides.rb +2 -2
  73. data/lib/sequel/extensions/string_agg.rb +0 -1
  74. data/lib/sequel/extensions/symbol_aref.rb +0 -4
  75. data/lib/sequel/model.rb +25 -57
  76. data/lib/sequel/model/associations.rb +14 -5
  77. data/lib/sequel/model/base.rb +96 -32
  78. data/lib/sequel/plugins/association_pks.rb +73 -46
  79. data/lib/sequel/plugins/association_proxies.rb +1 -1
  80. data/lib/sequel/plugins/auto_validations.rb +6 -2
  81. data/lib/sequel/plugins/boolean_readers.rb +1 -1
  82. data/lib/sequel/plugins/caching.rb +19 -13
  83. data/lib/sequel/plugins/class_table_inheritance.rb +19 -10
  84. data/lib/sequel/plugins/column_conflicts.rb +7 -2
  85. data/lib/sequel/plugins/column_select.rb +1 -1
  86. data/lib/sequel/plugins/csv_serializer.rb +8 -8
  87. data/lib/sequel/plugins/defaults_setter.rb +10 -0
  88. data/lib/sequel/plugins/eager_each.rb +1 -1
  89. data/lib/sequel/plugins/force_encoding.rb +2 -2
  90. data/lib/sequel/plugins/hook_class_methods.rb +9 -12
  91. data/lib/sequel/plugins/identifier_columns.rb +2 -0
  92. data/lib/sequel/plugins/instance_filters.rb +3 -1
  93. data/lib/sequel/plugins/instance_hooks.rb +17 -9
  94. data/lib/sequel/plugins/json_serializer.rb +17 -10
  95. data/lib/sequel/plugins/lazy_attributes.rb +8 -7
  96. data/lib/sequel/plugins/modification_detection.rb +3 -0
  97. data/lib/sequel/plugins/nested_attributes.rb +5 -1
  98. data/lib/sequel/plugins/pg_array_associations.rb +5 -0
  99. data/lib/sequel/plugins/prepared_statements.rb +1 -0
  100. data/lib/sequel/plugins/rcte_tree.rb +4 -4
  101. data/lib/sequel/plugins/serialization.rb +3 -10
  102. data/lib/sequel/plugins/single_table_inheritance.rb +2 -2
  103. data/lib/sequel/plugins/split_values.rb +6 -5
  104. data/lib/sequel/plugins/static_cache.rb +31 -25
  105. data/lib/sequel/plugins/subset_conditions.rb +3 -1
  106. data/lib/sequel/plugins/table_select.rb +1 -1
  107. data/lib/sequel/plugins/touch.rb +2 -1
  108. data/lib/sequel/plugins/validation_class_methods.rb +5 -6
  109. data/lib/sequel/plugins/validation_helpers.rb +2 -4
  110. data/lib/sequel/plugins/xml_serializer.rb +4 -4
  111. data/lib/sequel/sql.rb +2 -2
  112. data/lib/sequel/version.rb +1 -1
  113. data/spec/adapters/db2_spec.rb +115 -14
  114. data/spec/adapters/mysql_spec.rb +78 -28
  115. data/spec/adapters/oracle_spec.rb +24 -24
  116. data/spec/adapters/postgres_spec.rb +38 -24
  117. data/spec/adapters/sqlanywhere_spec.rb +88 -86
  118. data/spec/adapters/sqlite_spec.rb +29 -24
  119. data/spec/core/connection_pool_spec.rb +17 -0
  120. data/spec/core/database_spec.rb +6 -0
  121. data/spec/core/dataset_spec.rb +46 -36
  122. data/spec/core/schema_spec.rb +16 -0
  123. data/spec/core/spec_helper.rb +1 -0
  124. data/spec/core_extensions_spec.rb +6 -2
  125. data/spec/extensions/active_model_spec.rb +1 -1
  126. data/spec/extensions/arbitrary_servers_spec.rb +1 -1
  127. data/spec/extensions/association_pks_spec.rb +34 -2
  128. data/spec/extensions/auto_literal_strings_spec.rb +5 -1
  129. data/spec/extensions/auto_validations_spec.rb +2 -0
  130. data/spec/extensions/boolean_readers_spec.rb +1 -1
  131. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  132. data/spec/extensions/class_table_inheritance_spec.rb +48 -2
  133. data/spec/extensions/column_conflicts_spec.rb +11 -0
  134. data/spec/extensions/connection_validator_spec.rb +1 -1
  135. data/spec/extensions/dataset_associations_spec.rb +8 -8
  136. data/spec/extensions/defaults_setter_spec.rb +1 -1
  137. data/spec/extensions/filter_having_spec.rb +5 -3
  138. data/spec/extensions/hash_aliases_spec.rb +3 -1
  139. data/spec/extensions/identifier_columns_spec.rb +3 -1
  140. data/spec/extensions/implicit_subquery_spec.rb +4 -2
  141. data/spec/extensions/json_serializer_spec.rb +18 -0
  142. data/spec/extensions/lazy_attributes_spec.rb +3 -3
  143. data/spec/extensions/meta_def_spec.rb +9 -0
  144. data/spec/extensions/migration_spec.rb +3 -3
  145. data/spec/extensions/nested_attributes_spec.rb +14 -3
  146. data/spec/extensions/no_auto_literal_strings_spec.rb +8 -4
  147. data/spec/extensions/pg_array_associations_spec.rb +29 -18
  148. data/spec/extensions/pg_array_spec.rb +44 -25
  149. data/spec/extensions/pg_hstore_spec.rb +10 -0
  150. data/spec/extensions/pg_inet_spec.rb +26 -0
  151. data/spec/extensions/pg_interval_spec.rb +20 -0
  152. data/spec/extensions/pg_json_spec.rb +24 -0
  153. data/spec/extensions/pg_range_spec.rb +98 -14
  154. data/spec/extensions/pg_row_spec.rb +14 -4
  155. data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
  156. data/spec/extensions/query_literals_spec.rb +3 -1
  157. data/spec/extensions/schema_dumper_spec.rb +96 -98
  158. data/spec/extensions/sequel_3_dataset_methods_spec.rb +10 -6
  159. data/spec/extensions/sequel_4_dataset_methods_spec.rb +121 -0
  160. data/spec/extensions/single_table_inheritance_spec.rb +1 -1
  161. data/spec/extensions/spec_helper.rb +7 -1
  162. data/spec/extensions/static_cache_spec.rb +75 -24
  163. data/spec/extensions/string_agg_spec.rb +1 -1
  164. data/spec/extensions/touch_spec.rb +9 -0
  165. data/spec/extensions/validation_helpers_spec.rb +9 -3
  166. data/spec/extensions/whitelist_security_spec.rb +26 -0
  167. data/spec/integration/dataset_test.rb +45 -44
  168. data/spec/integration/plugin_test.rb +20 -0
  169. data/spec/integration/prepared_statement_test.rb +3 -0
  170. data/spec/integration/schema_test.rb +21 -1
  171. data/spec/integration/transaction_test.rb +40 -40
  172. data/spec/model/class_dataset_methods_spec.rb +14 -4
  173. data/spec/model/dataset_methods_spec.rb +12 -3
  174. data/spec/model/model_spec.rb +8 -0
  175. metadata +6 -4
  176. data/spec/adapters/firebird_spec.rb +0 -405
  177. data/spec/adapters/informix_spec.rb +0 -100
@@ -299,7 +299,8 @@ module Sequel
299
299
 
300
300
  def fetch_ado_schema(type, criteria=[])
301
301
  execute_open_ado_schema(type, criteria) do |s|
302
- cols = s.Fields.extend(Enumerable).map(&:Name)
302
+ cols = []
303
+ s.Fields.each{|f| cols << f.Name}
303
304
  s.getRows.transpose.each do |r|
304
305
  row = {}
305
306
  cols.each{|c| row[c] = r.shift}
@@ -4,8 +4,6 @@ Sequel::DataObjects.load_driver 'do_postgres'
4
4
  Sequel.require 'adapters/shared/postgres'
5
5
 
6
6
  module Sequel
7
- Postgres::CONVERTED_EXCEPTIONS << ::DataObjects::Error
8
-
9
7
  module DataObjects
10
8
  Sequel.synchronize do
11
9
  DATABASE_SETUP[:postgres] = proc do |db|
@@ -31,6 +29,11 @@ module Sequel
31
29
 
32
30
  private
33
31
 
32
+ DATABASE_ERROR_CLASSES = [::DataObjects::Error].freeze
33
+ def database_error_classes
34
+ DATABASE_ERROR_CLASSES
35
+ end
36
+
34
37
  # Extend the adapter with the DataObjects PostgreSQL AdapterMethods
35
38
  def setup_connection(conn)
36
39
  conn = super(conn)
@@ -6,12 +6,17 @@ Sequel.require 'adapters/shared/db2'
6
6
  module Sequel
7
7
 
8
8
  module IBMDB
9
+ # SEQUEL5: Remove
9
10
  @convert_smallint_to_bool = true
10
-
11
11
  class << self
12
- # Whether to convert smallint values to bool, true by default.
13
- # Can also be overridden per dataset.
14
- attr_accessor :convert_smallint_to_bool
12
+ def convert_smallint_to_bool
13
+ Sequel::Deprecation.deprecate("Sequel::IBMDB.convert_smallint_to_bool", "Call this method on the Database instance")
14
+ @convert_smallint_to_bool
15
+ end
16
+ def convert_smallint_to_bool=(v)
17
+ Sequel::Deprecation.deprecate("Sequel::IBMDB.convert_smallint_to_bool=", "Call this method on the Database instance")
18
+ @convert_smallint_to_bool = v
19
+ end
15
20
  end
16
21
 
17
22
  tt = Class.new do
@@ -187,6 +192,16 @@ module Sequel
187
192
 
188
193
  # Hash of connection procs for converting
189
194
  attr_reader :conversion_procs
195
+
196
+ # Whether to convert smallint values to bool for this Database instance
197
+ #attr_accessor :convert_smallint_to_bool # SEQUEL5
198
+
199
+ # SEQUEL5: Remove
200
+ attr_writer :convert_smallint_to_bool
201
+ def convert_smallint_to_bool
202
+ v = @convert_smallint_to_bool
203
+ v.nil? ? Sequel::IBMDB.instance_variable_get(:@convert_smallint_to_bool) : v
204
+ end
190
205
 
191
206
  # Create a new connection object for the given server.
192
207
  def connect(server)
@@ -284,6 +299,7 @@ module Sequel
284
299
  end
285
300
 
286
301
  def adapter_initialize
302
+ #@convert_smallint_to_bool = typecast_value_boolean(opts.fetch(:convert_smallint_to_bool, true)) # SEQUEL5
287
303
  @conversion_procs = DB2_TYPES.dup
288
304
  @conversion_procs[:timestamp] = method(:to_application_timestamp)
289
305
  end
@@ -349,7 +365,7 @@ module Sequel
349
365
 
350
366
  # Convert smallint type to boolean if convert_smallint_to_bool is true
351
367
  def schema_column_type(db_type)
352
- if Sequel::IBMDB.convert_smallint_to_bool && db_type =~ /smallint/i
368
+ if convert_smallint_to_bool && db_type =~ /smallint/i
353
369
  :boolean
354
370
  else
355
371
  super
@@ -379,13 +395,14 @@ module Sequel
379
395
 
380
396
  # Override the default IBMDB.convert_smallint_to_bool setting for this dataset.
381
397
  def convert_smallint_to_bool=(v)
398
+ Sequel::Deprecation.deprecate("Sequel::IBMDB::Dataset#convert_smallint_to_bool=", "Call with_convert_smallint_to_bool instead, which returns a modified copy instead of modifying the object")
382
399
  @opts[:convert_smallint_to_bool] = v
383
400
  end
384
401
 
385
402
  # Whether to convert smallint to boolean arguments for this dataset.
386
403
  # Defaults to the IBMDB module setting.
387
404
  def convert_smallint_to_bool
388
- opts.has_key?(:convert_smallint_to_bool) ? opts[:convert_smallint_to_bool] : IBMDB.convert_smallint_to_bool
405
+ opts.has_key?(:convert_smallint_to_bool) ? opts[:convert_smallint_to_bool] : db.convert_smallint_to_bool
389
406
  end
390
407
 
391
408
  # Return a cloned dataset with the convert_smallint_to_bool option set.
@@ -405,7 +422,7 @@ module Sequel
405
422
  type = stmt.field_type(i).downcase.to_sym
406
423
  # decide if it is a smallint from precision
407
424
  type = :boolean if type == :int && convert && stmt.field_precision(i) < 8
408
- type = :blob if type == :clob && Sequel::DB2.use_clob_as_blob
425
+ type = :blob if type == :clob && db.use_clob_as_blob
409
426
  columns << [key, cps[type]]
410
427
  end
411
428
  cols = columns.map{|c| c[0]}
@@ -142,16 +142,18 @@ module Sequel
142
142
  MAP.freeze
143
143
  BASIC_MAP.freeze
144
144
  INSTANCE.freeze
145
+ # freeze # SEQUEL5
145
146
  end
146
147
 
148
+ # SEQUEL5: Remove
149
+ Type_Convertor = TypeConvertor
150
+ Sequel::Deprecation.deprecate_constant(self, :TypeConvertor)
151
+
147
152
  # JDBC Databases offer a fairly uniform interface that does not change
148
153
  # much based on the sub adapter.
149
154
  class Database < Sequel::Database
150
155
  set_adapter_scheme :jdbc
151
156
 
152
- # The type of database we are connecting to
153
- attr_reader :database_type
154
-
155
157
  # The Java database driver we are using (should be a Java class)
156
158
  attr_reader :driver
157
159
 
@@ -185,12 +187,9 @@ module Sequel
185
187
  if block_given?
186
188
  yield log_connection_yield(sql, conn){cps.executeQuery}
187
189
  else
188
- case opts[:type]
189
- when :insert
190
- log_connection_yield(sql, conn){cps.executeUpdate}
190
+ log_connection_yield(sql, conn){cps.executeUpdate}
191
+ if opts[:type] == :insert
191
192
  last_insert_id(conn, opts)
192
- else
193
- log_connection_yield(sql, conn){cps.executeUpdate}
194
193
  end
195
194
  end
196
195
  rescue NativeException, JavaSQL::SQLException => e
@@ -526,7 +525,7 @@ module Sequel
526
525
  # Support fractional seconds for Time objects used in bound variables
527
526
  def java_sql_timestamp(time)
528
527
  ts = java.sql.Timestamp.new(time.to_i * 1000)
529
- # Work around jruby 1.6 ruby 1.9 mode bug
528
+ # Work around jruby 1.6 ruby 1.9 mode bug # SEQUEL5: Remove workaround
530
529
  ts.setNanos((RUBY_VERSION >= '1.9.0' && time.nsec != 0) ? time.nsec : time.usec * 1000)
531
530
  ts
532
531
  end
@@ -680,8 +679,9 @@ module Sequel
680
679
  # Called before loading subadapter-specific code, necessary so that subadapter initialization code
681
680
  # that runs queries works correctly. This cannot be overriding in subadapters,
682
681
  def setup_type_convertor_map_early
683
- @type_convertor_map = TypeConvertor::MAP.merge(Java::JavaSQL::Types::TIMESTAMP=>timestamp_convertor)
684
- @basic_type_convertor_map = TypeConvertor::BASIC_MAP.dup
682
+ # SEQUEL5: Change back to TypeConvertor
683
+ @type_convertor_map = Type_Convertor::MAP.merge(Java::JavaSQL::Types::TIMESTAMP=>method(:timestamp_convert))
684
+ @basic_type_convertor_map = Type_Convertor::BASIC_MAP.dup
685
685
  end
686
686
 
687
687
  # Yield a new statement object, and ensure that it is closed before returning.
@@ -694,15 +694,19 @@ module Sequel
694
694
  stmt.close if stmt
695
695
  end
696
696
 
697
- # A conversion proc for timestamp columns. This is used to make sure timestamps are converted using the
697
+ # A conversion method for timestamp columns. This is used to make sure timestamps are converted using the
698
698
  # correct timezone.
699
- def timestamp_convertor
700
- lambda do |r, i|
701
- if v = r.getTimestamp(i)
702
- to_application_timestamp([v.getYear + 1900, v.getMonth + 1, v.getDate, v.getHours, v.getMinutes, v.getSeconds, v.getNanos])
703
- end
699
+ def timestamp_convert(r, i)
700
+ if v = r.getTimestamp(i)
701
+ to_application_timestamp([v.getYear + 1900, v.getMonth + 1, v.getDate, v.getHours, v.getMinutes, v.getSeconds, v.getNanos])
704
702
  end
705
703
  end
704
+
705
+ # SEQUEL5: Remove
706
+ def timestamp_convertor
707
+ Sequel::Deprecation.deprecate("Sequel::JDBC::Database#timestamp_convertor", "Use method(:timestamp_convert) instead")
708
+ method(:timestamp_convert)
709
+ end
706
710
  end
707
711
 
708
712
  class Dataset < Sequel::Dataset
@@ -745,9 +749,14 @@ module Sequel
745
749
  end
746
750
 
747
751
  # Whether to convert some Java types to ruby types when retrieving rows.
748
- # Uses the database's setting by default, can be set to false to roughly
749
- # double performance when fetching rows.
750
- attr_accessor :convert_types
752
+ def convert_types
753
+ Sequel::Deprecation.deprecate("Sequel::JDBC::Dataset#convert_types", "The private #convert_types? method returns whether to convert types for this dataset")
754
+ @opts[:convert_types]
755
+ end
756
+ def convert_types=(v)
757
+ Sequel::Deprecation.deprecate("Sequel::JDBC::Dataset#convert_types=", "Switch to using #with_convert_types, which returns a modified copy")
758
+ @opts[:convert_types] = v
759
+ end
751
760
 
752
761
  # Correctly return rows from the database and return them as hashes.
753
762
  def fetch_rows(sql, &block)
@@ -755,16 +764,21 @@ module Sequel
755
764
  self
756
765
  end
757
766
 
758
- # Set the fetch size on JDBC ResultSets created from this dataset.
767
+ # Set the fetch size on JDBC ResultSets created from the returned dataset.
759
768
  def with_fetch_size(size)
760
769
  clone(:fetch_size=>size)
761
770
  end
771
+
772
+ # Set whether to convert Java types to ruby types in the returned dataset.
773
+ def with_convert_types(v)
774
+ clone(:convert_types=>v)
775
+ end
762
776
 
763
777
  private
764
778
 
765
779
  # Whether we should convert Java types to ruby types for this dataset.
766
780
  def convert_types?
767
- ct = @convert_types
781
+ ct = @opts[:convert_types]
768
782
  ct.nil? ? db.convert_types : ct
769
783
  end
770
784
 
@@ -35,7 +35,8 @@ module Sequel
35
35
  end
36
36
  end
37
37
 
38
- class TypeConvertor
38
+ # SEQUEL5: Remove
39
+ class Type_Convertor
39
40
  def DB2Clob(r, i)
40
41
  if v = r.getClob(i)
41
42
  v = v.getSubString(1, v.length)
@@ -63,7 +64,7 @@ module Sequel
63
64
  def set_ps_arg(cps, arg, i)
64
65
  case arg
65
66
  when Sequel::SQL::Blob
66
- if ::Sequel::DB2.use_clob_as_blob
67
+ if use_clob_as_blob
67
68
  cps.setString(i, arg)
68
69
  else
69
70
  super
@@ -91,7 +92,15 @@ module Sequel
91
92
  super
92
93
  map = @type_convertor_map
93
94
  types = Java::JavaSQL::Types
94
- map[types::NCLOB] = map[types::CLOB] = TypeConvertor::INSTANCE.method(:DB2Clob)
95
+ map[types::NCLOB] = map[types::CLOB] = method(:convert_clob)
96
+ end
97
+
98
+ def convert_clob(r, i)
99
+ if v = r.getClob(i)
100
+ v = v.getSubString(1, v.length)
101
+ v = Sequel::SQL::Blob.new(v) if use_clob_as_blob
102
+ v
103
+ end
95
104
  end
96
105
  end
97
106
 
@@ -54,7 +54,7 @@ module Sequel
54
54
  end
55
55
  end
56
56
 
57
- # Derby supports transaction DDL statements.
57
+ # Derby supports transactional DDL statements.
58
58
  def supports_transactional_ddl?
59
59
  true
60
60
  end
@@ -227,8 +227,7 @@ module Sequel
227
227
  Sequel::Deprecation.deprecate_constant(self, :EMULATED_FUNCTION_MAP)
228
228
 
229
229
  # Derby doesn't support an expression between CASE and WHEN,
230
- # so remove
231
- # conditions.
230
+ # so remove conditions.
232
231
  def case_expression_sql_append(sql, ce)
233
232
  super(sql, ce.with_merged_expression)
234
233
  end
@@ -300,7 +299,7 @@ module Sequel
300
299
  end
301
300
 
302
301
  # Derby uses an expression yielding false for false values.
303
- # Newer versions can use the FALSE literal, but the latest gem version cannot.
302
+ # Newer versions can use the FALSE literal, but older versions cannot.
304
303
  def literal_false
305
304
  if db.svn_version >= 1040133
306
305
  'FALSE'
@@ -315,7 +314,7 @@ module Sequel
315
314
  end
316
315
 
317
316
  # Derby uses an expression yielding true for true values.
318
- # Newer versions can use the TRUE literal, but the latest gem version cannot.
317
+ # Newer versions can use the TRUE literal, but older versions cannot.
319
318
  def literal_true
320
319
  if db.svn_version >= 1040133
321
320
  'TRUE'
@@ -14,7 +14,8 @@ module Sequel
14
14
  end
15
15
  end
16
16
 
17
- class TypeConvertor
17
+ # SEQUEL5: Remove
18
+ class Type_Convertor
18
19
  JAVA_BIG_DECIMAL_CONSTRUCTOR = java.math.BigDecimal.java_class.constructor(Java::long).method(:new_instance)
19
20
 
20
21
  def OracleDecimal(r, i)
@@ -31,6 +32,19 @@ module Sequel
31
32
 
32
33
  # Database and Dataset support for Oracle databases accessed via JDBC.
33
34
  module Oracle
35
+ JAVA_BIG_DECIMAL_CONSTRUCTOR = java.math.BigDecimal.java_class.constructor(Java::long).method(:new_instance)
36
+
37
+ def self.OracleDecimal(r, i)
38
+ if v = r.getBigDecimal(i)
39
+ i = v.long_value
40
+ if v == JAVA_BIG_DECIMAL_CONSTRUCTOR.call(i)
41
+ i
42
+ else
43
+ BigDecimal.new(v.to_string)
44
+ end
45
+ end
46
+ end
47
+
34
48
  # Instance methods for Oracle Database objects accessed via JDBC.
35
49
  module DatabaseMethods
36
50
  PRIMARY_KEY_INDEX_RE = /\Asys_/i.freeze
@@ -110,7 +124,7 @@ module Sequel
110
124
 
111
125
  def setup_type_convertor_map
112
126
  super
113
- @type_convertor_map[:OracleDecimal] = TypeConvertor::INSTANCE.method(:OracleDecimal)
127
+ @type_convertor_map[:OracleDecimal] = Oracle.method(:OracleDecimal)
114
128
  end
115
129
  end
116
130
 
@@ -4,8 +4,6 @@ Sequel::JDBC.load_driver('org.postgresql.Driver', :Postgres)
4
4
  Sequel.require 'adapters/shared/postgres'
5
5
 
6
6
  module Sequel
7
- Postgres::CONVERTED_EXCEPTIONS << NativeException
8
-
9
7
  module JDBC
10
8
  Sequel.synchronize do
11
9
  DATABASE_SETUP[:postgresql] = proc do |db|
@@ -15,11 +13,27 @@ module Sequel
15
13
  end
16
14
  end
17
15
 
18
- class TypeConvertor
16
+ # SEQUEL5: Remove
17
+ class Type_Convertor
18
+ def RubyPGArray(r, i)
19
+ if v = r.getArray(i)
20
+ v.array.to_ary
21
+ end
22
+ end
23
+ def RubyPGHstore(r, i)
24
+ if v = r.getObject(i)
25
+ v.to_hash
26
+ end
27
+ end
28
+ end
29
+
30
+ # Adapter, Database, and Dataset support for accessing a PostgreSQL
31
+ # database via JDBC.
32
+ module Postgres
19
33
  # Return PostgreSQL array types as ruby Arrays instead of
20
34
  # JDBC PostgreSQL driver-specific array type. Only used if the
21
35
  # database does not have a conversion proc for the type.
22
- def RubyPGArray(r, i)
36
+ def self.RubyPGArray(r, i)
23
37
  if v = r.getArray(i)
24
38
  v.array.to_ary
25
39
  end
@@ -28,16 +42,12 @@ module Sequel
28
42
  # Return PostgreSQL hstore types as ruby Hashes instead of
29
43
  # Java HashMaps. Only used if the database does not have a
30
44
  # conversion proc for the type.
31
- def RubyPGHstore(r, i)
45
+ def self.RubyPGHstore(r, i)
32
46
  if v = r.getObject(i)
33
47
  v.to_hash
34
48
  end
35
49
  end
36
- end
37
50
 
38
- # Adapter, Database, and Dataset support for accessing a PostgreSQL
39
- # database via JDBC.
40
- module Postgres
41
51
  # Methods to add to Database instances that access PostgreSQL via
42
52
  # JDBC.
43
53
  module DatabaseMethods
@@ -50,6 +60,12 @@ module Sequel
50
60
  db.send(:initialize_postgres_adapter)
51
61
  end
52
62
 
63
+ # Remove any current entry for the oid in the oid_convertor_map.
64
+ def add_conversion_proc(oid, *)
65
+ super
66
+ Sequel.synchronize{@oid_convertor_map.delete(oid)}
67
+ end
68
+
53
69
  # See Sequel::Postgres::Adapter#copy_into
54
70
  def copy_into(table, opts=OPTS)
55
71
  data = opts[:data]
@@ -61,7 +77,7 @@ module Sequel
61
77
  raise Error, "Must provide either a :data option or a block to copy_into"
62
78
  end
63
79
 
64
- synchronize(opts) do |conn|
80
+ synchronize(opts[:server]) do |conn|
65
81
  begin
66
82
  copy_manager = org.postgresql.copy.CopyManager.new(conn)
67
83
  copier = copy_manager.copy_in(copy_into_sql(table, opts))
@@ -73,7 +89,7 @@ module Sequel
73
89
  data.each { |d| copier.writeToCopy(d.to_java_bytes, 0, d.length) }
74
90
  end
75
91
  rescue Exception => e
76
- copier.cancelCopy
92
+ copier.cancelCopy if copier
77
93
  raise
78
94
  ensure
79
95
  unless e
@@ -105,8 +121,12 @@ module Sequel
105
121
  end
106
122
  b
107
123
  end
124
+ rescue => e
125
+ raise_error(e, :disconnect=>true)
108
126
  ensure
109
- raise DatabaseDisconnectError, "disconnecting as a partial COPY may leave the connection in an unusable state" if buf
127
+ if buf && !e
128
+ raise DatabaseDisconnectError, "disconnecting as a partial COPY may leave the connection in an unusable state"
129
+ end
110
130
  end
111
131
  end
112
132
  end
@@ -122,19 +142,24 @@ module Sequel
122
142
  else
123
143
  false
124
144
  end
125
- Sequel.synchronize{@oid_convertor_map[oid] = conv}
145
+ Sequel.synchronize{@oid_convertor_map[oid] = conv}
126
146
  end
127
147
  conv
128
148
  end
129
149
 
130
150
  private
131
151
 
132
- # Clear oid convertor map cache when conversion procs are updated.
152
+ # SEQUEL5: Remove
133
153
  def conversion_procs_updated
134
154
  super
135
155
  Sequel.synchronize{@oid_convertor_map = {}}
136
156
  end
137
157
 
158
+ DATABASE_ERROR_CLASSES = [NativeException].freeze
159
+ def database_error_classes
160
+ DATABASE_ERROR_CLASSES
161
+ end
162
+
138
163
  def disconnect_error?(exception, opts)
139
164
  super || exception.message =~ /\A(This connection has been closed\.|FATAL: terminating connection due to administrator command|An I\/O error occurred while sending to the backend\.)\z/
140
165
  end
@@ -178,8 +203,6 @@ module Sequel
178
203
  def setup_type_convertor_map
179
204
  super
180
205
  @oid_convertor_map = {}
181
- @type_convertor_map[:RubyPGArray] = TypeConvertor::INSTANCE.method(:RubyPGArray)
182
- @type_convertor_map[:RubyPGHstore] = TypeConvertor::INSTANCE.method(:RubyPGHstore)
183
206
  end
184
207
  end
185
208
 
@@ -203,8 +226,10 @@ module Sequel
203
226
 
204
227
  STRING_TYPE = Java::JavaSQL::Types::VARCHAR
205
228
  ARRAY_TYPE = Java::JavaSQL::Types::ARRAY
229
+ ARRAY_METHOD = Postgres.method(:RubyPGArray)
206
230
  PG_SPECIFIC_TYPES = [ARRAY_TYPE, Java::JavaSQL::Types::OTHER, Java::JavaSQL::Types::STRUCT]#.freeze # SEQUEL5
207
231
  HSTORE_TYPE = 'hstore'.freeze
232
+ HSTORE_METHOD = Postgres.method(:RubyPGHstore)
208
233
 
209
234
  def type_convertor(map, meta, type, i)
210
235
  case type
@@ -213,11 +238,11 @@ module Sequel
213
238
  if pr = db.oid_convertor_proc(oid)
214
239
  pr
215
240
  elsif type == ARRAY_TYPE
216
- map[:RubyPGArray]
241
+ ARRAY_METHOD
217
242
  elsif oid == 2950 # UUID
218
243
  map[STRING_TYPE]
219
244
  elsif meta.getPGType(i) == HSTORE_TYPE
220
- map[:RubyPGHstore]
245
+ HSTORE_METHOD
221
246
  else
222
247
  super
223
248
  end