sequel 4.46.0 → 4.49.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 (228) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +210 -0
  3. data/Rakefile +1 -1
  4. data/doc/advanced_associations.rdoc +1 -1
  5. data/doc/opening_databases.rdoc +3 -2
  6. data/doc/release_notes/4.47.0.txt +56 -0
  7. data/doc/release_notes/4.48.0.txt +293 -0
  8. data/doc/release_notes/4.49.0.txt +222 -0
  9. data/lib/sequel/adapters/ado/access.rb +2 -1
  10. data/lib/sequel/adapters/do/postgres.rb +5 -2
  11. data/lib/sequel/adapters/ibmdb.rb +30 -8
  12. data/lib/sequel/adapters/jdbc/as400.rb +1 -1
  13. data/lib/sequel/adapters/jdbc/db2.rb +12 -3
  14. data/lib/sequel/adapters/jdbc/derby.rb +4 -5
  15. data/lib/sequel/adapters/jdbc/h2.rb +10 -1
  16. data/lib/sequel/adapters/jdbc/oracle.rb +16 -2
  17. data/lib/sequel/adapters/jdbc/postgresql.rb +46 -20
  18. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +9 -7
  19. data/lib/sequel/adapters/jdbc/sqlserver.rb +20 -6
  20. data/lib/sequel/adapters/jdbc.rb +39 -23
  21. data/lib/sequel/adapters/mock.rb +27 -19
  22. data/lib/sequel/adapters/mysql.rb +17 -16
  23. data/lib/sequel/adapters/mysql2.rb +5 -6
  24. data/lib/sequel/adapters/oracle.rb +5 -9
  25. data/lib/sequel/adapters/postgres.rb +91 -103
  26. data/lib/sequel/adapters/shared/db2.rb +22 -6
  27. data/lib/sequel/adapters/shared/mssql.rb +5 -4
  28. data/lib/sequel/adapters/shared/mysql.rb +79 -25
  29. data/lib/sequel/adapters/shared/oracle.rb +26 -3
  30. data/lib/sequel/adapters/shared/postgres.rb +199 -95
  31. data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
  32. data/lib/sequel/adapters/shared/sqlite.rb +72 -82
  33. data/lib/sequel/adapters/sqlanywhere.rb +4 -1
  34. data/lib/sequel/adapters/sqlite.rb +5 -3
  35. data/lib/sequel/adapters/swift/postgres.rb +5 -2
  36. data/lib/sequel/adapters/tinytds.rb +0 -5
  37. data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -1
  38. data/lib/sequel/adapters/utils/pg_types.rb +2 -76
  39. data/lib/sequel/ast_transformer.rb +1 -1
  40. data/lib/sequel/connection_pool/sharded_single.rb +1 -1
  41. data/lib/sequel/connection_pool/sharded_threaded.rb +1 -1
  42. data/lib/sequel/connection_pool/single.rb +2 -2
  43. data/lib/sequel/connection_pool/threaded.rb +2 -2
  44. data/lib/sequel/connection_pool.rb +9 -2
  45. data/lib/sequel/core.rb +2 -2
  46. data/lib/sequel/database/connecting.rb +8 -8
  47. data/lib/sequel/database/dataset.rb +6 -3
  48. data/lib/sequel/database/dataset_defaults.rb +14 -1
  49. data/lib/sequel/database/misc.rb +1 -1
  50. data/lib/sequel/database/query.rb +3 -0
  51. data/lib/sequel/database/schema_methods.rb +1 -1
  52. data/lib/sequel/dataset/actions.rb +72 -10
  53. data/lib/sequel/dataset/dataset_module.rb +58 -0
  54. data/lib/sequel/dataset/graph.rb +1 -1
  55. data/lib/sequel/dataset/misc.rb +1 -0
  56. data/lib/sequel/dataset/prepared_statements.rb +3 -3
  57. data/lib/sequel/dataset/query.rb +22 -11
  58. data/lib/sequel/dataset.rb +1 -1
  59. data/lib/sequel/exceptions.rb +8 -0
  60. data/lib/sequel/extensions/_model_pg_row.rb +5 -2
  61. data/lib/sequel/extensions/core_extensions.rb +4 -1
  62. data/lib/sequel/extensions/current_datetime_timestamp.rb +2 -1
  63. data/lib/sequel/extensions/date_arithmetic.rb +1 -0
  64. data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -3
  65. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +3 -0
  66. data/lib/sequel/extensions/filter_having.rb +2 -0
  67. data/lib/sequel/extensions/freeze_datasets.rb +2 -0
  68. data/lib/sequel/extensions/from_block.rb +1 -1
  69. data/lib/sequel/extensions/graph_each.rb +2 -2
  70. data/lib/sequel/extensions/hash_aliases.rb +2 -0
  71. data/lib/sequel/extensions/identifier_mangling.rb +0 -7
  72. data/lib/sequel/extensions/meta_def.rb +2 -0
  73. data/lib/sequel/extensions/migration.rb +11 -8
  74. data/lib/sequel/extensions/no_auto_literal_strings.rb +1 -1
  75. data/lib/sequel/extensions/null_dataset.rb +1 -0
  76. data/lib/sequel/extensions/pagination.rb +1 -1
  77. data/lib/sequel/extensions/pg_array.rb +207 -130
  78. data/lib/sequel/extensions/pg_hstore.rb +38 -20
  79. data/lib/sequel/extensions/pg_inet.rb +18 -6
  80. data/lib/sequel/extensions/pg_interval.rb +19 -12
  81. data/lib/sequel/extensions/pg_json.rb +25 -14
  82. data/lib/sequel/extensions/pg_json_ops.rb +2 -2
  83. data/lib/sequel/extensions/pg_range.rb +133 -100
  84. data/lib/sequel/extensions/pg_range_ops.rb +4 -3
  85. data/lib/sequel/extensions/pg_row.rb +68 -39
  86. data/lib/sequel/extensions/pg_row_ops.rb +11 -5
  87. data/lib/sequel/extensions/query_literals.rb +2 -0
  88. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +2 -0
  89. data/lib/sequel/extensions/s.rb +1 -1
  90. data/lib/sequel/extensions/schema_dumper.rb +29 -25
  91. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +3 -1
  92. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +83 -0
  93. data/lib/sequel/extensions/server_block.rb +32 -15
  94. data/lib/sequel/extensions/set_overrides.rb +2 -2
  95. data/lib/sequel/extensions/string_agg.rb +0 -1
  96. data/lib/sequel/extensions/symbol_aref.rb +0 -4
  97. data/lib/sequel/model/associations.rb +35 -7
  98. data/lib/sequel/model/base.rb +113 -87
  99. data/lib/sequel/model/dataset_module.rb +5 -43
  100. data/lib/sequel/model/errors.rb +2 -1
  101. data/lib/sequel/model/inflections.rb +17 -5
  102. data/lib/sequel/model.rb +26 -58
  103. data/lib/sequel/plugins/active_model.rb +2 -2
  104. data/lib/sequel/plugins/association_autoreloading.rb +2 -0
  105. data/lib/sequel/plugins/association_dependencies.rb +3 -3
  106. data/lib/sequel/plugins/association_pks.rb +73 -46
  107. data/lib/sequel/plugins/association_proxies.rb +1 -1
  108. data/lib/sequel/plugins/auto_validations.rb +6 -2
  109. data/lib/sequel/plugins/boolean_readers.rb +2 -2
  110. data/lib/sequel/plugins/boolean_subsets.rb +1 -1
  111. data/lib/sequel/plugins/caching.rb +19 -13
  112. data/lib/sequel/plugins/class_table_inheritance.rb +24 -13
  113. data/lib/sequel/plugins/column_conflicts.rb +7 -2
  114. data/lib/sequel/plugins/column_select.rb +3 -3
  115. data/lib/sequel/plugins/composition.rb +2 -2
  116. data/lib/sequel/plugins/csv_serializer.rb +8 -8
  117. data/lib/sequel/plugins/dataset_associations.rb +25 -13
  118. data/lib/sequel/plugins/defaults_setter.rb +13 -1
  119. data/lib/sequel/plugins/eager_each.rb +1 -1
  120. data/lib/sequel/plugins/force_encoding.rb +2 -2
  121. data/lib/sequel/plugins/hook_class_methods.rb +9 -12
  122. data/lib/sequel/plugins/identifier_columns.rb +2 -0
  123. data/lib/sequel/plugins/instance_filters.rb +3 -1
  124. data/lib/sequel/plugins/instance_hooks.rb +17 -9
  125. data/lib/sequel/plugins/json_serializer.rb +19 -12
  126. data/lib/sequel/plugins/lazy_attributes.rb +8 -7
  127. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +2 -0
  128. data/lib/sequel/plugins/modification_detection.rb +3 -0
  129. data/lib/sequel/plugins/nested_attributes.rb +6 -2
  130. data/lib/sequel/plugins/pg_array_associations.rb +5 -0
  131. data/lib/sequel/plugins/pg_row.rb +4 -2
  132. data/lib/sequel/plugins/pg_typecast_on_load.rb +2 -0
  133. data/lib/sequel/plugins/prepared_statements.rb +1 -0
  134. data/lib/sequel/plugins/rcte_tree.rb +4 -24
  135. data/lib/sequel/plugins/serialization.rb +9 -15
  136. data/lib/sequel/plugins/single_table_inheritance.rb +8 -3
  137. data/lib/sequel/plugins/split_values.rb +6 -5
  138. data/lib/sequel/plugins/static_cache.rb +31 -25
  139. data/lib/sequel/plugins/subset_conditions.rb +3 -1
  140. data/lib/sequel/plugins/table_select.rb +1 -1
  141. data/lib/sequel/plugins/touch.rb +4 -2
  142. data/lib/sequel/plugins/validation_class_methods.rb +5 -6
  143. data/lib/sequel/plugins/validation_helpers.rb +14 -8
  144. data/lib/sequel/plugins/xml_serializer.rb +4 -4
  145. data/lib/sequel/sql.rb +18 -9
  146. data/lib/sequel/version.rb +1 -1
  147. data/spec/adapters/db2_spec.rb +115 -14
  148. data/spec/adapters/mssql_spec.rb +4 -4
  149. data/spec/adapters/mysql_spec.rb +83 -29
  150. data/spec/adapters/oracle_spec.rb +28 -24
  151. data/spec/adapters/postgres_spec.rb +40 -24
  152. data/spec/adapters/sqlanywhere_spec.rb +88 -86
  153. data/spec/adapters/sqlite_spec.rb +29 -24
  154. data/spec/bin_spec.rb +7 -1
  155. data/spec/core/connection_pool_spec.rb +45 -14
  156. data/spec/core/database_spec.rb +155 -0
  157. data/spec/core/dataset_spec.rb +219 -36
  158. data/spec/core/schema_spec.rb +16 -0
  159. data/spec/core/spec_helper.rb +1 -0
  160. data/spec/core_extensions_spec.rb +6 -2
  161. data/spec/extensions/active_model_spec.rb +1 -1
  162. data/spec/extensions/arbitrary_servers_spec.rb +1 -1
  163. data/spec/extensions/association_pks_spec.rb +34 -2
  164. data/spec/extensions/auto_literal_strings_spec.rb +5 -1
  165. data/spec/extensions/auto_validations_spec.rb +2 -0
  166. data/spec/extensions/boolean_readers_spec.rb +1 -1
  167. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  168. data/spec/extensions/class_table_inheritance_spec.rb +106 -19
  169. data/spec/extensions/column_conflicts_spec.rb +11 -0
  170. data/spec/extensions/column_select_spec.rb +1 -0
  171. data/spec/extensions/composition_spec.rb +13 -0
  172. data/spec/extensions/connection_validator_spec.rb +1 -1
  173. data/spec/extensions/dataset_associations_spec.rb +20 -8
  174. data/spec/extensions/defaults_setter_spec.rb +15 -1
  175. data/spec/extensions/filter_having_spec.rb +5 -3
  176. data/spec/extensions/hash_aliases_spec.rb +3 -1
  177. data/spec/extensions/identifier_columns_spec.rb +3 -1
  178. data/spec/extensions/implicit_subquery_spec.rb +4 -2
  179. data/spec/extensions/json_serializer_spec.rb +18 -0
  180. data/spec/extensions/lazy_attributes_spec.rb +3 -3
  181. data/spec/extensions/many_through_many_spec.rb +4 -4
  182. data/spec/extensions/meta_def_spec.rb +9 -0
  183. data/spec/extensions/migration_spec.rb +3 -3
  184. data/spec/extensions/nested_attributes_spec.rb +14 -3
  185. data/spec/extensions/no_auto_literal_strings_spec.rb +8 -4
  186. data/spec/extensions/null_dataset_spec.rb +1 -1
  187. data/spec/extensions/pg_array_associations_spec.rb +29 -18
  188. data/spec/extensions/pg_array_spec.rb +44 -25
  189. data/spec/extensions/pg_hstore_spec.rb +10 -0
  190. data/spec/extensions/pg_inet_spec.rb +26 -0
  191. data/spec/extensions/pg_interval_spec.rb +20 -0
  192. data/spec/extensions/pg_json_spec.rb +24 -0
  193. data/spec/extensions/pg_range_spec.rb +98 -14
  194. data/spec/extensions/pg_row_spec.rb +14 -4
  195. data/spec/extensions/pg_typecast_on_load_spec.rb +11 -9
  196. data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
  197. data/spec/extensions/query_literals_spec.rb +3 -1
  198. data/spec/extensions/schema_dumper_spec.rb +108 -94
  199. data/spec/extensions/sequel_3_dataset_methods_spec.rb +10 -6
  200. data/spec/extensions/sequel_4_dataset_methods_spec.rb +121 -0
  201. data/spec/extensions/serialization_spec.rb +1 -1
  202. data/spec/extensions/server_block_spec.rb +7 -0
  203. data/spec/extensions/single_table_inheritance_spec.rb +17 -1
  204. data/spec/extensions/spec_helper.rb +7 -1
  205. data/spec/extensions/static_cache_spec.rb +75 -24
  206. data/spec/extensions/string_agg_spec.rb +1 -1
  207. data/spec/extensions/touch_spec.rb +9 -0
  208. data/spec/extensions/validation_helpers_spec.rb +10 -5
  209. data/spec/extensions/whitelist_security_spec.rb +26 -0
  210. data/spec/integration/associations_test.rb +8 -0
  211. data/spec/integration/dataset_test.rb +45 -44
  212. data/spec/integration/model_test.rb +53 -4
  213. data/spec/integration/plugin_test.rb +28 -4
  214. data/spec/integration/prepared_statement_test.rb +3 -0
  215. data/spec/integration/schema_test.rb +21 -1
  216. data/spec/integration/transaction_test.rb +40 -40
  217. data/spec/model/association_reflection_spec.rb +43 -1
  218. data/spec/model/associations_spec.rb +29 -9
  219. data/spec/model/class_dataset_methods_spec.rb +20 -4
  220. data/spec/model/dataset_methods_spec.rb +12 -3
  221. data/spec/model/eager_loading_spec.rb +8 -8
  222. data/spec/model/model_spec.rb +45 -1
  223. data/spec/model/plugins_spec.rb +34 -0
  224. data/spec/model/record_spec.rb +1 -1
  225. data/spec/spec_config.rb +2 -0
  226. metadata +11 -4
  227. data/spec/adapters/firebird_spec.rb +0 -405
  228. data/spec/adapters/informix_spec.rb +0 -100
@@ -49,18 +49,18 @@
49
49
  #
50
50
  # * \[\]
51
51
  # * \[\]=
52
- # * assoc (ruby 1.9 only)
52
+ # * assoc
53
53
  # * delete
54
54
  # * fetch
55
55
  # * has_key?
56
56
  # * has_value?
57
57
  # * include?
58
- # * key (ruby 1.9 only)
58
+ # * key
59
59
  # * key?
60
60
  # * member?
61
61
  # * merge
62
62
  # * merge!
63
- # * rassoc (ruby 1.9 only)
63
+ # * rassoc
64
64
  # * replace
65
65
  # * store
66
66
  # * update
@@ -70,10 +70,7 @@
70
70
  #
71
71
  # DB[:table].insert(:column=>Sequel.hstore('foo'=>'bar'))
72
72
  #
73
- # If you would like to use hstore columns in your model objects, you
74
- # probably want to modify the schema parsing/typecasting so that it
75
- # recognizes and correctly handles the hstore columns, which you can
76
- # do by:
73
+ # To use this extension, first load it into your Sequel::Database instance:
77
74
  #
78
75
  # DB.extension :pg_hstore
79
76
  #
@@ -95,12 +92,19 @@ module Sequel
95
92
  # Parser for PostgreSQL hstore output format.
96
93
  class Parser < StringScanner
97
94
  QUOTE_RE = /"/.freeze
95
+ Sequel::Deprecation.deprecate_constant(self, :QUOTE_RE)
98
96
  KV_SEP_RE = /"\s*=>\s*/.freeze
97
+ Sequel::Deprecation.deprecate_constant(self, :KV_SEP_RE)
99
98
  NULL_RE = /NULL/.freeze
99
+ Sequel::Deprecation.deprecate_constant(self, :NULL_RE)
100
100
  SEP_RE = /,\s*/.freeze
101
+ Sequel::Deprecation.deprecate_constant(self, :SEP_RE)
101
102
  QUOTED_RE = /(\\"|[^"])*/.freeze
103
+ Sequel::Deprecation.deprecate_constant(self, :QUOTED_RE)
102
104
  REPLACE_RE = /\\(.)/.freeze
105
+ Sequel::Deprecation.deprecate_constant(self, :REPLACE_RE)
103
106
  REPLACE_WITH = '\1'.freeze
107
+ Sequel::Deprecation.deprecate_constant(self, :REPLACE_WITH)
104
108
 
105
109
  # Parse the output format that PostgreSQL uses for hstore
106
110
  # columns. Note that this does not attempt to parse all
@@ -114,17 +118,17 @@ module Sequel
114
118
  return @result if @result
115
119
  hash = {}
116
120
  while !eos?
117
- skip(QUOTE_RE)
121
+ skip(/"/)
118
122
  k = parse_quoted
119
- skip(KV_SEP_RE)
120
- if skip(QUOTE_RE)
123
+ skip(/"\s*=>\s*/)
124
+ if skip(/"/)
121
125
  v = parse_quoted
122
- skip(QUOTE_RE)
126
+ skip(/"/)
123
127
  else
124
- scan(NULL_RE)
128
+ scan(/NULL/)
125
129
  v = nil
126
130
  end
127
- skip(SEP_RE)
131
+ skip(/,\s*/)
128
132
  hash[k] = v
129
133
  end
130
134
  @result = hash
@@ -134,7 +138,7 @@ module Sequel
134
138
 
135
139
  # Parse and unescape a quoted key/value.
136
140
  def parse_quoted
137
- scan(QUOTED_RE).gsub(REPLACE_RE, REPLACE_WITH)
141
+ scan(/(\\"|[^"])*/).gsub(/\\(.)/, '\1')
138
142
  end
139
143
  end
140
144
 
@@ -158,6 +162,13 @@ module Sequel
158
162
  end
159
163
  end
160
164
 
165
+ # SEQUEL5: Remove
166
+ def reset_conversion_procs
167
+ procs = super
168
+ add_named_conversion_proc(:hstore, &HStore.method(:parse))
169
+ procs
170
+ end
171
+
161
172
  private
162
173
 
163
174
  # Recognize the hstore database type.
@@ -188,12 +199,19 @@ module Sequel
188
199
  DEFAULT_PROC = lambda{|h, k| h[k.to_s] unless k.is_a?(String)}
189
200
 
190
201
  QUOTE = '"'.freeze
202
+ Sequel::Deprecation.deprecate_constant(self, :QUOTE)
191
203
  COMMA = ",".freeze
204
+ Sequel::Deprecation.deprecate_constant(self, :COMMA)
192
205
  KV_SEP = "=>".freeze
206
+ Sequel::Deprecation.deprecate_constant(self, :KV_SEP)
193
207
  NULL = "NULL".freeze
208
+ Sequel::Deprecation.deprecate_constant(self, :NULL)
194
209
  ESCAPE_RE = /("|\\)/.freeze
210
+ Sequel::Deprecation.deprecate_constant(self, :ESCAPE_RE)
195
211
  ESCAPE_REPLACE = '\\\\\1'.freeze
212
+ Sequel::Deprecation.deprecate_constant(self, :ESCAPE_REPLACE)
196
213
  HSTORE_CAST = '::hstore'.freeze
214
+ Sequel::Deprecation.deprecate_constant(self, :HSTORE_CAST)
197
215
 
198
216
  if RUBY_VERSION >= '1.9'
199
217
  # Undef 1.9 marshal_{dump,load} methods in the delegate class,
@@ -258,7 +276,7 @@ module Sequel
258
276
  # Append a literalize version of the hstore to the sql.
259
277
  def sql_literal_append(ds, sql)
260
278
  ds.literal_append(sql, unquoted_literal)
261
- sql << HSTORE_CAST
279
+ sql << '::hstore'
262
280
  end
263
281
 
264
282
  # Return a string containing the unquoted, unstring-escaped
@@ -267,10 +285,10 @@ module Sequel
267
285
  def unquoted_literal
268
286
  str = String.new
269
287
  comma = false
270
- commas = COMMA
271
- quote = QUOTE
272
- kv_sep = KV_SEP
273
- null = NULL
288
+ commas = ","
289
+ quote = '"'
290
+ kv_sep = "=>"
291
+ null = "NULL"
274
292
  each do |k, v|
275
293
  str << commas if comma
276
294
  str << quote << escape_value(k) << quote
@@ -303,7 +321,7 @@ module Sequel
303
321
  # Escape key/value strings when literalizing to
304
322
  # correctly handle backslash and quote characters.
305
323
  def escape_value(k)
306
- k.to_s.gsub(ESCAPE_RE, ESCAPE_REPLACE)
324
+ k.to_s.gsub(/("|\\)/, '\\\\\1')
307
325
  end
308
326
  end
309
327
  end
@@ -29,7 +29,7 @@
29
29
  # Related module: Sequel::Postgres::InetDatabaseMethods
30
30
 
31
31
  require 'ipaddr'
32
- Sequel.require 'adapters/utils/pg_types'
32
+ Sequel.require 'adapters/shared/postgres'
33
33
 
34
34
  module Sequel
35
35
  module Postgres
@@ -41,7 +41,14 @@ module Sequel
41
41
  def self.extended(db)
42
42
  db.instance_eval do
43
43
  extend_datasets(InetDatasetMethods)
44
- copy_conversion_procs([869, 650, 1041, 651, 1040])
44
+ meth = IPAddr.method(:new)
45
+ add_conversion_proc(869, meth)
46
+ add_conversion_proc(650, meth)
47
+ if respond_to?(:register_array_type)
48
+ register_array_type('inet', :oid=>1041, :scalar_oid=>869)
49
+ register_array_type('cidr', :oid=>651, :scalar_oid=>650)
50
+ register_array_type('macaddr', :oid=>1040)
51
+ end
45
52
  @schema_type_classes[:ipaddr] = IPAddr
46
53
  end
47
54
  end
@@ -106,11 +113,16 @@ module Sequel
106
113
  end
107
114
  end
108
115
 
109
- PG_TYPES[869] = PG_TYPES[650] = IPAddr.method(:new)
116
+ # SEQUEL5: Remove
117
+ meth = IPAddr.method(:new)
118
+ PG__TYPES[869] = PG__TYPES[650] = lambda do |s|
119
+ Sequel::Deprecation.deprecate("Conversion proc for inet/cidr added globally by pg_inet extension", "Load the pg_inet extension into the Database instance")
120
+ IPAddr.new(s)
121
+ end
110
122
  if defined?(PGArray) && PGArray.respond_to?(:register)
111
- PGArray.register('inet', :oid=>1041, :scalar_oid=>869)
112
- PGArray.register('cidr', :oid=>651, :scalar_oid=>650)
113
- PGArray.register('macaddr', :oid=>1040)
123
+ PGArray.register('inet', :oid=>1041, :scalar_oid=>869, :skip_deprecation_warning=>true)
124
+ PGArray.register('cidr', :oid=>651, :scalar_oid=>650, :skip_deprecation_warning=>true)
125
+ PGArray.register('macaddr', :oid=>1040, :skip_deprecation_warning=>true)
114
126
  end
115
127
  end
116
128
 
@@ -10,10 +10,7 @@
10
10
  # ActiveSupport::Duration that use the standard Sequel literalization
11
11
  # callbacks, so they work on all adapters.
12
12
  #
13
- # If you would like to use interval columns in your model objects, you
14
- # probably want to modify the typecasting so that it
15
- # recognizes and correctly handles the interval columns, which you can
16
- # do by:
13
+ # To use this extension, load it into the Database instance:
17
14
  #
18
15
  # DB.extension :pg_interval
19
16
  #
@@ -36,12 +33,13 @@
36
33
  # Related module: Sequel::Postgres::IntervalDatabaseMethods
37
34
 
38
35
  require 'active_support/duration'
39
- Sequel.require 'adapters/utils/pg_types'
36
+ Sequel.require 'adapters/shared/postgres'
40
37
 
41
38
  module Sequel
42
39
  module Postgres
43
40
  module IntervalDatabaseMethods
44
41
  EMPTY_INTERVAL = '0'.freeze
42
+ Sequel::Deprecation.deprecate_constant(self, :EMPTY_INTERVAL)
45
43
  DURATION_UNITS = [:years, :months, :weeks, :days, :hours, :minutes, :seconds].freeze
46
44
 
47
45
  # Return an unquoted string version of the duration object suitable for
@@ -58,7 +56,7 @@ module Sequel
58
56
  end
59
57
 
60
58
  if s.empty?
61
- EMPTY_INTERVAL
59
+ '0'
62
60
  else
63
61
  s
64
62
  end
@@ -67,11 +65,12 @@ module Sequel
67
65
  # Creates callable objects that convert strings into ActiveSupport::Duration instances.
68
66
  class Parser
69
67
  # Regexp that parses the full range of PostgreSQL interval type output.
70
- PARSER = /\A([+-]?\d+ years?\s?)?([+-]?\d+ mons?\s?)?([+-]?\d+ days?\s?)?(?:(?:([+-])?(\d{2,10}):(\d\d):(\d\d(\.\d+)?))|([+-]?\d+ hours?\s?)?([+-]?\d+ mins?\s?)?([+-]?\d+(\.\d+)? secs?\s?)?)?\z/o
68
+ PARSER = /\A([+-]?\d+ years?\s?)?([+-]?\d+ mons?\s?)?([+-]?\d+ days?\s?)?(?:(?:([+-])?(\d{2,10}):(\d\d):(\d\d(\.\d+)?))|([+-]?\d+ hours?\s?)?([+-]?\d+ mins?\s?)?([+-]?\d+(\.\d+)? secs?\s?)?)?\z/
69
+ Sequel::Deprecation.deprecate_constant(self, :PARSER)
71
70
 
72
71
  # Parse the interval input string into an ActiveSupport::Duration instance.
73
72
  def call(string)
74
- raise(InvalidValue, "invalid or unhandled interval format: #{string.inspect}") unless matches = PARSER.match(string)
73
+ raise(InvalidValue, "invalid or unhandled interval format: #{string.inspect}") unless matches = /\A([+-]?\d+ years?\s?)?([+-]?\d+ mons?\s?)?([+-]?\d+ days?\s?)?(?:(?:([+-])?(\d{2,10}):(\d\d):(\d\d(\.\d+)?))|([+-]?\d+ hours?\s?)?([+-]?\d+ mins?\s?)?([+-]?\d+(\.\d+)? secs?\s?)?)?\z/.match(string)
75
74
 
76
75
  value = 0
77
76
  parts = []
@@ -124,7 +123,10 @@ module Sequel
124
123
  def self.extended(db)
125
124
  db.instance_eval do
126
125
  extend_datasets(IntervalDatasetMethods)
127
- copy_conversion_procs([1186, 1187])
126
+ add_conversion_proc(1186, Postgres::IntervalDatabaseMethods::PARSER)
127
+ if respond_to?(:register_array_type)
128
+ register_array_type('interval', :oid=>1187, :scalar_oid=>1186)
129
+ end
128
130
  @schema_type_classes[:interval] = ActiveSupport::Duration
129
131
  end
130
132
  end
@@ -174,6 +176,7 @@ module Sequel
174
176
 
175
177
  module IntervalDatasetMethods
176
178
  CAST_INTERVAL = '::interval'.freeze
179
+ Sequel::Deprecation.deprecate_constant(self, :CAST_INTERVAL)
177
180
 
178
181
  # Handle literalization of ActiveSupport::Duration objects, treating them as
179
182
  # PostgreSQL intervals.
@@ -181,16 +184,20 @@ module Sequel
181
184
  case v
182
185
  when ActiveSupport::Duration
183
186
  literal_append(sql, IntervalDatabaseMethods.literal_duration(v))
184
- sql << CAST_INTERVAL
187
+ sql << '::interval'
185
188
  else
186
189
  super
187
190
  end
188
191
  end
189
192
  end
190
193
 
191
- PG_TYPES[1186] = Postgres::IntervalDatabaseMethods::PARSER
194
+ # SEQUEL5: Remove
195
+ PG__TYPES[1186] = lambda do |s|
196
+ Sequel::Deprecation.deprecate("Conversion proc for interval added globally by pg_interval extension", "Load the pg_interval extension into the Database instance")
197
+ Postgres::IntervalDatabaseMethods::PARSER.call(s)
198
+ end
192
199
  if defined?(PGArray) && PGArray.respond_to?(:register)
193
- PGArray.register('interval', :oid=>1187, :scalar_oid=>1186)
200
+ PGArray.register('interval', :oid=>1187, :scalar_oid=>1186, :skip_deprecation_warning=>true)
194
201
  end
195
202
  end
196
203
 
@@ -38,10 +38,7 @@
38
38
  # DB[:table].insert(:column=>Sequel.pg_json([1, 2, 3]))
39
39
  # DB[:table].insert(:column=>Sequel.pg_json({'a'=>1, 'b'=>2}))
40
40
  #
41
- # If you would like to use PostgreSQL json columns in your model
42
- # objects, you probably want to modify the schema parsing/typecasting
43
- # so that it recognizes and correctly handles the json type, which
44
- # you can do by:
41
+ # To use this extension, please load it into the Database instance:
45
42
  #
46
43
  # DB.extension :pg_json
47
44
  #
@@ -65,12 +62,14 @@
65
62
 
66
63
  require 'delegate'
67
64
  require 'json'
68
- Sequel.require 'adapters/utils/pg_types'
65
+ Sequel.require 'adapters/shared/postgres'
69
66
 
70
67
  module Sequel
71
68
  module Postgres
72
69
  CAST_JSON = '::json'.freeze
70
+ Sequel::Deprecation.deprecate_constant(self, :CAST_JSON)
73
71
  CAST_JSONB = '::jsonb'.freeze
72
+ Sequel::Deprecation.deprecate_constant(self, :CAST_JSONB)
74
73
 
75
74
  # Class representing PostgreSQL JSON/JSONB column array values.
76
75
  class JSONArrayBase < DelegateClass(Array)
@@ -88,7 +87,7 @@ module Sequel
88
87
  # Cast as json
89
88
  def sql_literal_append(ds, sql)
90
89
  super
91
- sql << CAST_JSON
90
+ sql << '::json'
92
91
  end
93
92
  end
94
93
 
@@ -96,7 +95,7 @@ module Sequel
96
95
  # Cast as jsonb
97
96
  def sql_literal_append(ds, sql)
98
97
  super
99
- sql << CAST_JSONB
98
+ sql << '::jsonb'
100
99
  end
101
100
  end
102
101
 
@@ -119,7 +118,7 @@ module Sequel
119
118
  # Cast as json
120
119
  def sql_literal_append(ds, sql)
121
120
  super
122
- sql << CAST_JSON
121
+ sql << '::json'
123
122
  end
124
123
  end
125
124
 
@@ -127,7 +126,7 @@ module Sequel
127
126
  # Cast as jsonb
128
127
  def sql_literal_append(ds, sql)
129
128
  super
130
- sql << CAST_JSONB
129
+ sql << '::jsonb'
131
130
  end
132
131
  end
133
132
 
@@ -135,7 +134,12 @@ module Sequel
135
134
  module JSONDatabaseMethods
136
135
  def self.extended(db)
137
136
  db.instance_eval do
138
- copy_conversion_procs([114, 199, 3802, 3807])
137
+ add_conversion_proc(114, JSONDatabaseMethods.method(:db_parse_json))
138
+ add_conversion_proc(3802, JSONDatabaseMethods.method(:db_parse_jsonb))
139
+ if respond_to?(:register_array_type)
140
+ register_array_type('json', :oid=>199, :scalar_oid=>114)
141
+ register_array_type('jsonb', :oid=>3807, :scalar_oid=>3802)
142
+ end
139
143
  @schema_type_classes[:json] = [JSONHash, JSONArray]
140
144
  @schema_type_classes[:jsonb] = [JSONBHash, JSONBArray]
141
145
  end
@@ -257,11 +261,18 @@ module Sequel
257
261
  end
258
262
  end
259
263
 
260
- PG_TYPES[114] = JSONDatabaseMethods.method(:db_parse_json)
261
- PG_TYPES[3802] = JSONDatabaseMethods.method(:db_parse_jsonb)
264
+ # SEQUEL5: Remove
265
+ PG__TYPES[114] = lambda do |s|
266
+ Sequel::Deprecation.deprecate("Conversion proc for json added globally by pg_json extension", "Load the pg_json extension into the Database instance")
267
+ JSONDatabaseMethods.db_parse_json(s)
268
+ end
269
+ PG__TYPES[3802] = lambda do |s|
270
+ Sequel::Deprecation.deprecate("Conversion proc for jsonb added globally by pg_json extension", "Load the pg_json extension into the Database instance")
271
+ JSONDatabaseMethods.db_parse_jsonb(s)
272
+ end
262
273
  if defined?(PGArray) && PGArray.respond_to?(:register)
263
- PGArray.register('json', :oid=>199, :scalar_oid=>114)
264
- PGArray.register('jsonb', :oid=>3807, :scalar_oid=>3802)
274
+ PGArray.register('json', :oid=>199, :scalar_oid=>114, :skip_deprecation_warning=>true)
275
+ PGArray.register('jsonb', :oid=>3807, :scalar_oid=>3802, :skip_deprecation_warning=>true)
265
276
  end
266
277
  end
267
278
 
@@ -3,7 +3,7 @@
3
3
  # The pg_json_ops extension adds support to Sequel's DSL to make
4
4
  # it easier to call PostgreSQL JSON functions and operators (added
5
5
  # first in PostgreSQL 9.3). It also supports the JSONB functions
6
- # and operators added in PostgreSQL 9.4).
6
+ # and operators added in PostgreSQL 9.4.
7
7
  #
8
8
  # To load the extension:
9
9
  #
@@ -22,7 +22,7 @@
22
22
  # jb = Sequel.pg_jsonb(:jsonb_column)
23
23
  #
24
24
  # Also, on most Sequel expression objects, you can call the pg_json
25
- # or pg_jsonb # method:
25
+ # or pg_jsonb method:
26
26
  #
27
27
  # j = Sequel[:json_column].pg_json
28
28
  # jb = Sequel[:jsonb_column].pg_jsonb