sequel 3.48.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (267) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +114 -0
  3. data/Rakefile +10 -7
  4. data/doc/association_basics.rdoc +25 -23
  5. data/doc/code_order.rdoc +7 -0
  6. data/doc/core_extensions.rdoc +0 -10
  7. data/doc/object_model.rdoc +4 -1
  8. data/doc/querying.rdoc +3 -3
  9. data/doc/release_notes/4.0.0.txt +262 -0
  10. data/doc/security.rdoc +0 -28
  11. data/doc/testing.rdoc +8 -14
  12. data/lib/sequel/adapters/ado.rb +7 -11
  13. data/lib/sequel/adapters/ado/access.rb +8 -8
  14. data/lib/sequel/adapters/ado/mssql.rb +4 -4
  15. data/lib/sequel/adapters/amalgalite.rb +6 -6
  16. data/lib/sequel/adapters/cubrid.rb +7 -7
  17. data/lib/sequel/adapters/db2.rb +5 -9
  18. data/lib/sequel/adapters/dbi.rb +2 -6
  19. data/lib/sequel/adapters/do.rb +4 -4
  20. data/lib/sequel/adapters/firebird.rb +4 -4
  21. data/lib/sequel/adapters/ibmdb.rb +8 -8
  22. data/lib/sequel/adapters/informix.rb +2 -10
  23. data/lib/sequel/adapters/jdbc.rb +17 -17
  24. data/lib/sequel/adapters/jdbc/as400.rb +2 -2
  25. data/lib/sequel/adapters/jdbc/cubrid.rb +1 -1
  26. data/lib/sequel/adapters/jdbc/db2.rb +1 -1
  27. data/lib/sequel/adapters/jdbc/derby.rb +1 -1
  28. data/lib/sequel/adapters/jdbc/h2.rb +2 -2
  29. data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -1
  30. data/lib/sequel/adapters/jdbc/informix.rb +1 -1
  31. data/lib/sequel/adapters/jdbc/mssql.rb +2 -2
  32. data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
  33. data/lib/sequel/adapters/jdbc/oracle.rb +5 -1
  34. data/lib/sequel/adapters/jdbc/postgresql.rb +3 -3
  35. data/lib/sequel/adapters/jdbc/sqlite.rb +3 -3
  36. data/lib/sequel/adapters/jdbc/transactions.rb +3 -3
  37. data/lib/sequel/adapters/mock.rb +7 -7
  38. data/lib/sequel/adapters/mysql.rb +3 -3
  39. data/lib/sequel/adapters/mysql2.rb +4 -4
  40. data/lib/sequel/adapters/odbc.rb +2 -6
  41. data/lib/sequel/adapters/odbc/mssql.rb +1 -1
  42. data/lib/sequel/adapters/openbase.rb +1 -5
  43. data/lib/sequel/adapters/oracle.rb +13 -17
  44. data/lib/sequel/adapters/postgres.rb +20 -25
  45. data/lib/sequel/adapters/shared/cubrid.rb +3 -3
  46. data/lib/sequel/adapters/shared/db2.rb +2 -2
  47. data/lib/sequel/adapters/shared/firebird.rb +7 -7
  48. data/lib/sequel/adapters/shared/mssql.rb +9 -9
  49. data/lib/sequel/adapters/shared/mysql.rb +29 -13
  50. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +7 -7
  51. data/lib/sequel/adapters/shared/oracle.rb +22 -13
  52. data/lib/sequel/adapters/shared/postgres.rb +61 -46
  53. data/lib/sequel/adapters/shared/sqlite.rb +9 -9
  54. data/lib/sequel/adapters/sqlite.rb +17 -11
  55. data/lib/sequel/adapters/swift.rb +3 -3
  56. data/lib/sequel/adapters/swift/mysql.rb +1 -1
  57. data/lib/sequel/adapters/swift/sqlite.rb +1 -1
  58. data/lib/sequel/adapters/tinytds.rb +8 -8
  59. data/lib/sequel/ast_transformer.rb +3 -1
  60. data/lib/sequel/connection_pool.rb +4 -2
  61. data/lib/sequel/connection_pool/sharded_single.rb +2 -2
  62. data/lib/sequel/connection_pool/sharded_threaded.rb +5 -5
  63. data/lib/sequel/connection_pool/threaded.rb +7 -7
  64. data/lib/sequel/core.rb +4 -67
  65. data/lib/sequel/database.rb +1 -0
  66. data/lib/sequel/database/connecting.rb +2 -8
  67. data/lib/sequel/database/dataset.rb +2 -7
  68. data/lib/sequel/database/dataset_defaults.rb +0 -18
  69. data/lib/sequel/database/features.rb +4 -4
  70. data/lib/sequel/database/misc.rb +6 -8
  71. data/lib/sequel/database/query.rb +5 -61
  72. data/lib/sequel/database/schema_generator.rb +22 -20
  73. data/lib/sequel/database/schema_methods.rb +48 -20
  74. data/lib/sequel/database/transactions.rb +7 -17
  75. data/lib/sequel/dataset.rb +2 -0
  76. data/lib/sequel/dataset/actions.rb +23 -91
  77. data/lib/sequel/dataset/features.rb +1 -4
  78. data/lib/sequel/dataset/graph.rb +3 -47
  79. data/lib/sequel/dataset/misc.rb +4 -33
  80. data/lib/sequel/dataset/prepared_statements.rb +3 -1
  81. data/lib/sequel/dataset/query.rb +116 -240
  82. data/lib/sequel/dataset/sql.rb +19 -97
  83. data/lib/sequel/deprecated.rb +0 -16
  84. data/lib/sequel/exceptions.rb +0 -3
  85. data/lib/sequel/extensions/_pretty_table.rb +1 -1
  86. data/lib/sequel/extensions/columns_introspection.rb +1 -12
  87. data/lib/sequel/extensions/constraint_validations.rb +3 -3
  88. data/lib/sequel/extensions/core_extensions.rb +0 -9
  89. data/lib/sequel/extensions/date_arithmetic.rb +1 -2
  90. data/lib/sequel/extensions/graph_each.rb +11 -0
  91. data/lib/sequel/extensions/migration.rb +5 -5
  92. data/lib/sequel/extensions/null_dataset.rb +11 -13
  93. data/lib/sequel/extensions/pagination.rb +3 -6
  94. data/lib/sequel/extensions/pg_array.rb +6 -4
  95. data/lib/sequel/extensions/pg_array_ops.rb +35 -1
  96. data/lib/sequel/extensions/pg_json.rb +12 -2
  97. data/lib/sequel/extensions/pg_json_ops.rb +266 -0
  98. data/lib/sequel/extensions/pg_range.rb +2 -2
  99. data/lib/sequel/extensions/pg_range_ops.rb +0 -8
  100. data/lib/sequel/extensions/pg_row.rb +2 -2
  101. data/lib/sequel/extensions/pretty_table.rb +0 -4
  102. data/lib/sequel/extensions/query.rb +3 -8
  103. data/lib/sequel/extensions/schema_caching.rb +0 -7
  104. data/lib/sequel/extensions/schema_dumper.rb +10 -17
  105. data/lib/sequel/extensions/select_remove.rb +0 -4
  106. data/lib/sequel/extensions/set_overrides.rb +28 -0
  107. data/lib/sequel/extensions/to_dot.rb +6 -10
  108. data/lib/sequel/model.rb +6 -7
  109. data/lib/sequel/model/associations.rb +127 -182
  110. data/lib/sequel/model/base.rb +88 -211
  111. data/lib/sequel/model/errors.rb +0 -13
  112. data/lib/sequel/model/plugins.rb +2 -2
  113. data/lib/sequel/no_core_ext.rb +0 -1
  114. data/lib/sequel/plugins/after_initialize.rb +11 -17
  115. data/lib/sequel/plugins/association_autoreloading.rb +1 -47
  116. data/lib/sequel/plugins/association_dependencies.rb +2 -2
  117. data/lib/sequel/plugins/auto_validations.rb +2 -8
  118. data/lib/sequel/plugins/blacklist_security.rb +32 -2
  119. data/lib/sequel/plugins/caching.rb +1 -1
  120. data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
  121. data/lib/sequel/plugins/composition.rb +10 -8
  122. data/lib/sequel/plugins/constraint_validations.rb +2 -2
  123. data/lib/sequel/plugins/dataset_associations.rb +4 -0
  124. data/lib/sequel/plugins/defaults_setter.rb +8 -6
  125. data/lib/sequel/plugins/dirty.rb +6 -6
  126. data/lib/sequel/plugins/force_encoding.rb +13 -8
  127. data/lib/sequel/plugins/hook_class_methods.rb +1 -7
  128. data/lib/sequel/plugins/json_serializer.rb +13 -74
  129. data/lib/sequel/plugins/lazy_attributes.rb +2 -4
  130. data/lib/sequel/plugins/list.rb +1 -1
  131. data/lib/sequel/plugins/many_through_many.rb +4 -11
  132. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +1 -49
  133. data/lib/sequel/plugins/nested_attributes.rb +1 -1
  134. data/lib/sequel/plugins/optimistic_locking.rb +3 -5
  135. data/lib/sequel/plugins/pg_array_associations.rb +453 -0
  136. data/lib/sequel/plugins/pg_typecast_on_load.rb +23 -7
  137. data/lib/sequel/plugins/prepared_statements.rb +1 -1
  138. data/lib/sequel/plugins/prepared_statements_associations.rb +20 -14
  139. data/lib/sequel/plugins/prepared_statements_safe.rb +2 -2
  140. data/lib/sequel/plugins/rcte_tree.rb +1 -1
  141. data/lib/sequel/plugins/serialization.rb +5 -4
  142. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  143. data/lib/sequel/plugins/sharding.rb +7 -1
  144. data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
  145. data/lib/sequel/plugins/timestamps.rb +1 -1
  146. data/lib/sequel/plugins/touch.rb +2 -2
  147. data/lib/sequel/plugins/tree.rb +1 -1
  148. data/lib/sequel/plugins/typecast_on_load.rb +19 -4
  149. data/lib/sequel/plugins/validation_class_methods.rb +0 -30
  150. data/lib/sequel/plugins/validation_helpers.rb +13 -31
  151. data/lib/sequel/plugins/xml_serializer.rb +18 -57
  152. data/lib/sequel/sql.rb +20 -22
  153. data/lib/sequel/version.rb +2 -2
  154. data/spec/adapters/db2_spec.rb +14 -23
  155. data/spec/adapters/firebird_spec.rb +25 -29
  156. data/spec/adapters/informix_spec.rb +11 -14
  157. data/spec/adapters/mssql_spec.rb +71 -77
  158. data/spec/adapters/mysql_spec.rb +165 -172
  159. data/spec/adapters/oracle_spec.rb +36 -39
  160. data/spec/adapters/postgres_spec.rb +175 -100
  161. data/spec/adapters/spec_helper.rb +13 -11
  162. data/spec/adapters/sqlite_spec.rb +36 -44
  163. data/spec/core/connection_pool_spec.rb +2 -1
  164. data/spec/core/database_spec.rb +55 -55
  165. data/spec/core/dataset_spec.rb +45 -249
  166. data/spec/core/deprecated_spec.rb +0 -8
  167. data/spec/core/expression_filters_spec.rb +23 -5
  168. data/spec/core/object_graph_spec.rb +4 -66
  169. data/spec/core/schema_spec.rb +35 -12
  170. data/spec/core/spec_helper.rb +3 -2
  171. data/spec/core_extensions_spec.rb +17 -19
  172. data/spec/extensions/arbitrary_servers_spec.rb +2 -3
  173. data/spec/extensions/association_dependencies_spec.rb +14 -14
  174. data/spec/extensions/auto_validations_spec.rb +7 -0
  175. data/spec/extensions/blacklist_security_spec.rb +5 -5
  176. data/spec/extensions/blank_spec.rb +2 -0
  177. data/spec/extensions/class_table_inheritance_spec.rb +2 -2
  178. data/spec/extensions/columns_introspection_spec.rb +2 -29
  179. data/spec/extensions/composition_spec.rb +10 -17
  180. data/spec/extensions/core_refinements_spec.rb +5 -1
  181. data/spec/extensions/dataset_associations_spec.rb +18 -0
  182. data/spec/extensions/date_arithmetic_spec.rb +2 -2
  183. data/spec/extensions/defaults_setter_spec.rb +9 -9
  184. data/spec/extensions/dirty_spec.rb +0 -5
  185. data/spec/extensions/eval_inspect_spec.rb +2 -0
  186. data/spec/extensions/force_encoding_spec.rb +2 -18
  187. data/spec/extensions/hash_aliases_spec.rb +8 -0
  188. data/spec/extensions/hook_class_methods_spec.rb +39 -58
  189. data/spec/extensions/inflector_spec.rb +2 -0
  190. data/spec/extensions/instance_filters_spec.rb +8 -8
  191. data/spec/extensions/json_serializer_spec.rb +1 -41
  192. data/spec/extensions/list_spec.rb +1 -1
  193. data/spec/extensions/many_through_many_spec.rb +106 -109
  194. data/spec/extensions/migration_spec.rb +2 -0
  195. data/spec/extensions/named_timezones_spec.rb +1 -0
  196. data/spec/extensions/pg_array_associations_spec.rb +603 -0
  197. data/spec/extensions/pg_array_ops_spec.rb +25 -0
  198. data/spec/extensions/pg_array_spec.rb +9 -1
  199. data/spec/extensions/pg_hstore_ops_spec.rb +13 -0
  200. data/spec/extensions/pg_hstore_spec.rb +1 -0
  201. data/spec/extensions/pg_json_ops_spec.rb +131 -0
  202. data/spec/extensions/pg_json_spec.rb +10 -4
  203. data/spec/extensions/pg_range_ops_spec.rb +2 -5
  204. data/spec/extensions/pg_range_spec.rb +6 -2
  205. data/spec/extensions/pg_row_ops_spec.rb +2 -0
  206. data/spec/extensions/prepared_statements_associations_spec.rb +26 -5
  207. data/spec/extensions/rcte_tree_spec.rb +15 -15
  208. data/spec/extensions/schema_dumper_spec.rb +0 -1
  209. data/spec/extensions/schema_spec.rb +9 -9
  210. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  211. data/spec/extensions/serialization_spec.rb +18 -29
  212. data/spec/extensions/set_overrides_spec.rb +4 -0
  213. data/spec/extensions/{many_to_one_pk_lookup_spec.rb → shared_caching_spec.rb} +1 -4
  214. data/spec/extensions/single_table_inheritance_spec.rb +4 -4
  215. data/spec/extensions/spec_helper.rb +8 -9
  216. data/spec/extensions/sql_expr_spec.rb +2 -0
  217. data/spec/extensions/string_date_time_spec.rb +2 -0
  218. data/spec/extensions/string_stripper_spec.rb +2 -0
  219. data/spec/extensions/tactical_eager_loading_spec.rb +12 -12
  220. data/spec/extensions/thread_local_timezones_spec.rb +2 -0
  221. data/spec/extensions/timestamps_spec.rb +1 -1
  222. data/spec/extensions/to_dot_spec.rb +1 -1
  223. data/spec/extensions/touch_spec.rb +24 -24
  224. data/spec/extensions/tree_spec.rb +7 -7
  225. data/spec/extensions/typecast_on_load_spec.rb +8 -1
  226. data/spec/extensions/update_primary_key_spec.rb +10 -10
  227. data/spec/extensions/validation_class_methods_spec.rb +10 -39
  228. data/spec/extensions/validation_helpers_spec.rb +29 -47
  229. data/spec/extensions/xml_serializer_spec.rb +1 -23
  230. data/spec/integration/associations_test.rb +231 -40
  231. data/spec/integration/database_test.rb +1 -1
  232. data/spec/integration/dataset_test.rb +64 -64
  233. data/spec/integration/eager_loader_test.rb +28 -28
  234. data/spec/integration/migrator_test.rb +1 -1
  235. data/spec/integration/model_test.rb +2 -2
  236. data/spec/integration/plugin_test.rb +21 -21
  237. data/spec/integration/prepared_statement_test.rb +7 -7
  238. data/spec/integration/schema_test.rb +115 -110
  239. data/spec/integration/spec_helper.rb +17 -27
  240. data/spec/integration/timezone_test.rb +1 -1
  241. data/spec/integration/transaction_test.rb +10 -10
  242. data/spec/integration/type_test.rb +2 -2
  243. data/spec/model/association_reflection_spec.rb +2 -28
  244. data/spec/model/associations_spec.rb +239 -188
  245. data/spec/model/base_spec.rb +27 -68
  246. data/spec/model/dataset_methods_spec.rb +4 -4
  247. data/spec/model/eager_loading_spec.rb +160 -172
  248. data/spec/model/hooks_spec.rb +62 -79
  249. data/spec/model/model_spec.rb +36 -51
  250. data/spec/model/plugins_spec.rb +5 -19
  251. data/spec/model/record_spec.rb +125 -151
  252. data/spec/model/spec_helper.rb +8 -6
  253. data/spec/model/validations_spec.rb +4 -17
  254. data/spec/spec_config.rb +2 -10
  255. metadata +50 -56
  256. data/lib/sequel/deprecated_core_extensions.rb +0 -135
  257. data/lib/sequel/extensions/pg_auto_parameterize.rb +0 -185
  258. data/lib/sequel/extensions/pg_statement_cache.rb +0 -318
  259. data/lib/sequel/plugins/identity_map.rb +0 -260
  260. data/lib/sequel_core.rb +0 -2
  261. data/lib/sequel_model.rb +0 -2
  262. data/spec/extensions/association_autoreloading_spec.rb +0 -102
  263. data/spec/extensions/identity_map_spec.rb +0 -337
  264. data/spec/extensions/pg_auto_parameterize_spec.rb +0 -70
  265. data/spec/extensions/pg_statement_cache_spec.rb +0 -208
  266. data/spec/rcov.opts +0 -8
  267. data/spec/spec_config.rb.example +0 -10
@@ -40,8 +40,6 @@ module Sequel
40
40
  when 1
41
41
  case vals = values.at(0)
42
42
  when Hash
43
- vals = @opts[:defaults].merge(vals) if @opts[:defaults]
44
- vals = vals.merge(@opts[:overrides]) if @opts[:overrides]
45
43
  values = []
46
44
  vals.each do |k,v|
47
45
  columns << k
@@ -163,7 +161,7 @@ module Sequel
163
161
  #
164
162
  # Raises an +Error+ if the dataset is grouped or includes more
165
163
  # than one table.
166
- def update_sql(values = {})
164
+ def update_sql(values = OPTS)
167
165
  return static_sql(opts[:sql]) if opts[:sql]
168
166
  check_modification_allowed!
169
167
  clone(:values=>values)._update_sql
@@ -202,6 +200,7 @@ module Sequel
202
200
  CASE_THEN = " THEN ".freeze
203
201
  CASE_WHEN = " WHEN ".freeze
204
202
  CAST_OPEN = 'CAST('.freeze
203
+ COLON = ':'.freeze
205
204
  COLUMN_REF_RE1 = Sequel::COLUMN_REF_RE1
206
205
  COLUMN_REF_RE2 = Sequel::COLUMN_REF_RE2
207
206
  COLUMN_REF_RE3 = Sequel::COLUMN_REF_RE3
@@ -285,80 +284,6 @@ module Sequel
285
284
  V190 = '1.9.0'.freeze
286
285
  WHERE = " WHERE ".freeze
287
286
 
288
- PUBLIC_APPEND_METHODS = (<<-END).split.map{|x| x.to_sym}
289
- literal
290
- aliased_expression_sql
291
- array_sql
292
- boolean_constant_sql
293
- case_expression_sql
294
- cast_sql
295
- column_all_sql
296
- complex_expression_sql
297
- constant_sql
298
- delayed_evaluation_sql
299
- function_sql
300
- join_clause_sql
301
- join_on_clause_sql
302
- join_using_clause_sql
303
- negative_boolean_constant_sql
304
- ordered_expression_sql
305
- placeholder_literal_string_sql
306
- qualified_identifier_sql
307
- quote_identifier
308
- quote_schema_table
309
- quoted_identifier
310
- subscript_sql
311
- window_sql
312
- window_function_sql
313
- END
314
- PRIVATE_APPEND_METHODS = (<<-END).split.map{|x| x.to_sym}
315
- as_sql
316
- column_list
317
- compound_dataset_sql
318
- expression_list
319
- literal_array
320
- literal_blob
321
- literal_dataset
322
- literal_expression
323
- literal_hash
324
- literal_other
325
- literal_string
326
- literal_symbol
327
- source_list
328
- subselect_sql
329
- table_ref
330
- END
331
-
332
- # For each of the methods in the given array, define a method with
333
- # that name that returns a string with the SQL fragment that the
334
- # related *_append method would add.
335
- #
336
- # Do not call this method with untrusted input, as that can result in
337
- # arbitrary code execution.
338
- def self.def_append_methods(meths)
339
- Sequel::Deprecation.deprecate('Dataset.def_append_methods', "There is no replacement planned")
340
- meths.each do |meth|
341
- class_eval(<<-END, __FILE__, __LINE__ + 1)
342
- def #{meth}(*args, &block)
343
- s = ''
344
- #{meth}_append(s, *args, &block)
345
- s
346
- end
347
- END
348
- end
349
- end
350
- (PUBLIC_APPEND_METHODS + PRIVATE_APPEND_METHODS - [:literal, :quote_identifier, :quote_schema_table]).each do |meth|
351
- class_eval(<<-END, __FILE__, __LINE__ + 1)
352
- def #{meth}(*args, &block)
353
- Sequel::Deprecation.deprecate('Dataset##{meth}', "Please switch to Dataset##{meth}_append")
354
- s = ''
355
- #{meth}_append(s, *args, &block)
356
- s
357
- end
358
- END
359
- end
360
- private(*PRIVATE_APPEND_METHODS)
361
-
362
287
  [:literal, :quote_identifier, :quote_schema_table].each do |meth|
363
288
  class_eval(<<-END, __FILE__, __LINE__ + 1)
364
289
  def #{meth}(*args, &block)
@@ -622,17 +547,18 @@ module Sequel
622
547
  literal_append(sql, args[i]) unless i == len
623
548
  end
624
549
  unless str.length == args.length || str.length == args.length + 1
625
- Sequel::Deprecation.deprecate("Using a mismatched number of placeholders (#{str.length}) and placeholder arguments (#{args.length}) is deprecated and will raise an Error in Sequel 4.")
550
+ raise Error, "Mismatched number of placeholders (#{str.length}) and placeholder arguments (#{args.length}) when using placeholder array"
626
551
  end
627
552
  else
628
553
  i = -1
554
+ match_len = args.length - 1
629
555
  loop do
630
556
  previous, q, str = str.partition(QUESTION_MARK)
631
557
  sql << previous
632
558
  literal_append(sql, args.at(i+=1)) unless q.empty?
633
559
  if str.empty?
634
- unless i + 1 == args.length
635
- Sequel::Deprecation.deprecate("Using a mismatched number of placeholders (#{i+1}) and placeholder arguments (#{args.length}) is deprecated and will raise an Error in Sequel 4.")
560
+ unless i == match_len
561
+ raise Error, "Mismatched number of placeholders (#{i+1}) and placeholder arguments (#{args.length}) when using placeholder array"
636
562
  end
637
563
  break
638
564
  end
@@ -693,7 +619,7 @@ module Sequel
693
619
  # Note that this function does not handle tables with more than one
694
620
  # level of qualification (e.g. database.schema.table on Microsoft
695
621
  # SQL Server).
696
- def schema_and_table(table_name, sch=(db._default_schema if db))
622
+ def schema_and_table(table_name, sch=nil)
697
623
  sch = sch.to_s if sch
698
624
  case table_name
699
625
  when Symbol
@@ -730,7 +656,15 @@ module Sequel
730
656
  def subscript_sql_append(sql, s)
731
657
  literal_append(sql, s.f)
732
658
  sql << BRACKET_OPEN
733
- expression_list_append(sql, s.sub)
659
+ if s.sub.length == 1 && (range = s.sub.first).is_a?(Range)
660
+ literal_append(sql, range.begin)
661
+ sql << COLON
662
+ e = range.end
663
+ e -= 1 if range.exclude_end? && e.is_a?(Integer)
664
+ literal_append(sql, e)
665
+ else
666
+ expression_list_append(sql, s.sub)
667
+ end
734
668
  sql << BRACKET_CLOSE
735
669
  end
736
670
 
@@ -949,14 +883,10 @@ module Sequel
949
883
  end
950
884
  end
951
885
 
952
- # An expression for how to handle an empty array lookup
886
+ # An expression for how to handle an empty array lookup.
953
887
  def empty_array_value(op, cols)
954
- if Sequel.empty_array_handle_nulls
955
- c = Array(cols)
956
- SQL::BooleanExpression.from_value_pairs(c.zip(c), :AND, op == :IN)
957
- else
958
- {1 => ((op == :IN) ? 0 : 1)}
959
- end
888
+ c = Array(cols)
889
+ SQL::BooleanExpression.from_value_pairs(c.zip(c), :AND, op == :IN)
960
890
  end
961
891
 
962
892
  # Format the timestamp based on the default_timestamp_format, with a couple
@@ -1008,12 +938,6 @@ module Sequel
1008
938
  end
1009
939
  end
1010
940
 
1011
- # REMOVE40
1012
- def table_ref_append(sql, v)
1013
- Sequel::Deprecation.deprecate('Dataset#table_ref_append', "Please switch to Dataset#identifier_append")
1014
- identifier_append(sql, v)
1015
- end
1016
-
1017
941
  # Append all identifiers in args interspersed by commas.
1018
942
  def identifier_list_append(sql, args)
1019
943
  c = false
@@ -1467,8 +1391,6 @@ module Sequel
1467
1391
  values = opts[:values]
1468
1392
  sql << SET
1469
1393
  if values.is_a?(Hash)
1470
- values = opts[:defaults].merge(values) if opts[:defaults]
1471
- values = values.merge(opts[:overrides]) if opts[:overrides]
1472
1394
  c = false
1473
1395
  eq = EQUAL
1474
1396
  values.each do |k, v|
@@ -54,21 +54,5 @@ module Sequel
54
54
  end
55
55
  nil
56
56
  end
57
-
58
- # Return a module that includes deprecation warnings for all public
59
- # instance methods in the given module, such that including the returned
60
- # module will not result in the given module being included.
61
- def self.deprecated_module(mod, &block)
62
- Module.new do
63
- include mod.dup
64
- mod.public_instance_methods.each do |meth|
65
- msg = block.call(meth)
66
- define_method(meth) do |*a, &blk|
67
- Sequel::Deprecation.deprecate(*msg)
68
- super(*a, &blk)
69
- end
70
- end
71
- end
72
- end
73
57
  end
74
58
  end
@@ -54,9 +54,6 @@ module Sequel
54
54
  # method, and the dataset does not yield any rows.
55
55
  class NoMatchingRow < Error; end
56
56
 
57
- # Error raised when the adapter adapter hasn't implemented a method such as +tables+:
58
- class NotImplemented < Error; end
59
-
60
57
  # Error raised when the connection pool cannot acquire a database connection
61
58
  # before the timeout.
62
59
  class PoolTimeout < Error; end
@@ -60,7 +60,7 @@ module Sequel
60
60
  case v
61
61
  when Bignum, Fixnum
62
62
  "%#{size}d" % v
63
- when Float
63
+ when Float, BigDecimal
64
64
  "%#{size}g" % v
65
65
  else
66
66
  "%-#{size}s" % v.to_s
@@ -27,7 +27,7 @@ module Sequel
27
27
  if (pcs = probable_columns) && pcs.all?
28
28
  @columns = pcs
29
29
  else
30
- columns_without_introspection
30
+ super
31
31
  end
32
32
  end
33
33
 
@@ -77,17 +77,6 @@ module Sequel
77
77
  end
78
78
  end
79
79
 
80
- class Dataset
81
- alias columns_without_introspection columns
82
-
83
- # Enable column introspection for every dataset.
84
- def self.introspect_all_columns
85
- Sequel::Deprecation.deprecate('Sequel::Dataset.introspect_all_columns', "Please use Database.extension :columns_introspection to load the extension into all databases")
86
- include ColumnsIntrospection
87
- remove_method(:columns) if instance_methods(false).map{|x| x.to_s}.include?('columns')
88
- end
89
- end
90
-
91
80
  Dataset.register_extension(:columns_introspection, Sequel::ColumnsIntrospection)
92
81
  end
93
82
 
@@ -144,7 +144,7 @@ module Sequel
144
144
  # Create constraint validation methods that don't take an argument
145
145
  %w'presence unique'.each do |v|
146
146
  class_eval(<<-END, __FILE__, __LINE__+1)
147
- def #{v}(columns, opts={})
147
+ def #{v}(columns, opts=OPTS)
148
148
  @generator.validation({:type=>:#{v}, :columns=>Array(columns)}.merge(opts))
149
149
  end
150
150
  END
@@ -153,7 +153,7 @@ module Sequel
153
153
  # Create constraint validation methods that take an argument
154
154
  %w'exact_length min_length max_length length_range format like ilike includes'.each do |v|
155
155
  class_eval(<<-END, __FILE__, __LINE__+1)
156
- def #{v}(arg, columns, opts={})
156
+ def #{v}(arg, columns, opts=OPTS)
157
157
  @generator.validation({:type=>:#{v}, :columns=>Array(columns), :arg=>arg}.merge(opts))
158
158
  end
159
159
  END
@@ -244,7 +244,7 @@ module Sequel
244
244
  # the related metadata, it could make it impossible to save
245
245
  # rows, since a validation for a nonexistent column will be
246
246
  # created.
247
- def drop_constraint_validations_for(opts={})
247
+ def drop_constraint_validations_for(opts=OPTS)
248
248
  ds = from(constraint_validations_table)
249
249
  if table = opts[:table]
250
250
  ds = ds.where(:table=>constraint_validations_literal_table(table))
@@ -208,9 +208,6 @@ class Symbol
208
208
  include Sequel::SQL::StringMethods
209
209
  include Sequel::SQL::SubscriptMethods
210
210
  include Sequel::SQL::ComplexExpressionMethods
211
- if RUBY_VERSION < '1.9.0'
212
- include Sequel::Deprecation.deprecated_module(Sequel::SQL::InequalityMethods){|meth| ["Symbol##{meth}", "Please use Sequel.expr(symbol).#{meth} instead, or Sequel.extension(:ruby18_symbol_extensions) to continue using it"]}
213
- end
214
211
 
215
212
  # Returns receiver wrapped in an <tt>Sequel::SQL::Identifier</tt>. Usually used to
216
213
  # prevent splitting the symbol.
@@ -232,10 +229,4 @@ class Symbol
232
229
  def sql_function(*args)
233
230
  Sequel::SQL::Function.new(self, *args)
234
231
  end
235
- if RUBY_VERSION < '1.9.0'
236
- def [](*args)
237
- Sequel::Deprecation.deprecate('Symbol#[]', 'Please use Sequel.function instead, or Sequel.extension(:ruby18_symbol_extensions) to continue using it')
238
- Sequel::SQL::Function.new(self, *args)
239
- end
240
- end
241
232
  end
@@ -122,8 +122,7 @@ module Sequel
122
122
  end
123
123
  false
124
124
  else
125
- Sequel::Deprecation.deprecate('Sequel::NotImplemented', 'Sequel 4 will just raise Error if date_arithmetic is not supported on the database')
126
- raise NotImplemented, "date arithmetic is not implemented on #{db.database_type}"
125
+ raise Error, "date arithmetic is not implemented on #{db.database_type}"
127
126
  end
128
127
 
129
128
  if cast
@@ -17,6 +17,17 @@
17
17
 
18
18
  module Sequel
19
19
  module GraphEach
20
+ # Call graph_each for graphed datasets that are not being eager graphed.
21
+ def each
22
+ if @opts[:graph] && !@opts[:eager_graph]
23
+ graph_each{|r| yield r}
24
+ else
25
+ super
26
+ end
27
+ end
28
+
29
+ private
30
+
20
31
  # Fetch the rows, split them into component table parts,
21
32
  # tranform and run the row_proc on each part (if applicable),
22
33
  # and yield a hash of the parts.
@@ -369,7 +369,7 @@ module Sequel
369
369
 
370
370
  # Return whether the migrator is current (i.e. it does not need to make
371
371
  # any changes). Takes the same arguments as #run.
372
- def self.is_current?(db, directory, opts={})
372
+ def self.is_current?(db, directory, opts=OPTS)
373
373
  migrator_class(directory).new(db, directory, opts).is_current?
374
374
  end
375
375
 
@@ -386,7 +386,7 @@ module Sequel
386
386
  # Sequel::Migrator.run(DB, "migrations", :target=>15, :current=>10)
387
387
  # Sequel::Migrator.run(DB, "app1/migrations", :column=> :app2_version)
388
388
  # Sequel::Migrator.run(DB, "app2/migrations", :column => :app2_version, :table=>:schema_info2)
389
- def self.run(db, directory, opts={})
389
+ def self.run(db, directory, opts=OPTS)
390
390
  migrator_class(directory).new(db, directory, opts).run
391
391
  end
392
392
 
@@ -432,7 +432,7 @@ module Sequel
432
432
  attr_reader :target
433
433
 
434
434
  # Setup the state for the migrator
435
- def initialize(db, directory, opts={})
435
+ def initialize(db, directory, opts=OPTS)
436
436
  raise(Error, "Must supply a valid migration path") unless File.directory?(directory)
437
437
  @db = db
438
438
  @directory = directory
@@ -502,7 +502,7 @@ module Sequel
502
502
  attr_reader :migrations
503
503
 
504
504
  # Set up all state for the migrator instance
505
- def initialize(db, directory, opts={})
505
+ def initialize(db, directory, opts=OPTS)
506
506
  super
507
507
  @target = opts[:target] || latest_migration_version
508
508
  @current = opts[:current] || current_migration_version
@@ -628,7 +628,7 @@ module Sequel
628
628
  attr_reader :migration_tuples
629
629
 
630
630
  # Set up all state for the migrator instance
631
- def initialize(db, directory, opts={})
631
+ def initialize(db, directory, opts=OPTS)
632
632
  super
633
633
  @target = opts[:target]
634
634
  @applied_migrations = get_applied_migrations
@@ -30,6 +30,15 @@
30
30
  module Sequel
31
31
  class Dataset
32
32
  module Nullifiable
33
+ # Return a cloned nullified dataset.
34
+ def nullify
35
+ clone.nullify!
36
+ end
37
+
38
+ # Nullify the current dataset
39
+ def nullify!
40
+ extend NullDataset
41
+ end
33
42
  end
34
43
 
35
44
  module NullDataset
@@ -65,7 +74,7 @@ module Sequel
65
74
  end
66
75
 
67
76
  # Return 0 without sending a database query.
68
- def update(v={})
77
+ def update(v=OPTS)
69
78
  0
70
79
  end
71
80
 
@@ -82,20 +91,9 @@ module Sequel
82
91
  # make them noops. There's nothing we can do if the db
83
92
  # is accessed directly to make a change, though.
84
93
  (%w'_ddl _dui _insert' << '').each do |m|
85
- class_eval("private; def execute#{m}(sql, opts={}) end", __FILE__, __LINE__)
94
+ class_eval("private; def execute#{m}(sql, opts=OPTS) end", __FILE__, __LINE__)
86
95
  end
87
96
  end
88
-
89
- # Return a cloned nullified dataset.
90
- def nullify
91
- clone.nullify!
92
- end
93
-
94
- # Nullify the current dataset
95
- def nullify!
96
- Sequel::Deprecation.deprecate('Loading the null_dataset extension globally', "Please use Database/Dataset#extension to load the extension into this dataset") unless is_a?(Nullifiable)
97
- extend NullDataset
98
- end
99
97
  end
100
98
 
101
99
  Dataset.register_extension(:null_dataset, Dataset::Nullifiable)
@@ -16,32 +16,29 @@
16
16
 
17
17
  module Sequel
18
18
  module DatasetPagination
19
- end
20
-
21
- class Dataset
22
19
  # Returns a paginated dataset. The returned dataset is limited to
23
20
  # the page size at the correct offset, and extended with the Pagination
24
21
  # module. If a record count is not provided, does a count of total
25
22
  # number of records for this dataset.
26
23
  def paginate(page_no, page_size, record_count=nil)
27
- Sequel::Deprecation.deprecate('Loading the pagination extension globally', "Please use Database/Dataset#extension to load the extension into this dataset") unless is_a?(DatasetPagination)
28
24
  raise(Error, "You cannot paginate a dataset that already has a limit") if @opts[:limit]
29
25
  paginated = limit(page_size, (page_no - 1) * page_size)
30
- paginated.extend(Pagination)
26
+ paginated.extend(Dataset::Pagination)
31
27
  paginated.set_pagination_info(page_no, page_size, record_count || count)
32
28
  end
33
29
 
34
30
  # Yields a paginated dataset for each page and returns the receiver. Does
35
31
  # a count to find the total number of records for this dataset.
36
32
  def each_page(page_size)
37
- Sequel::Deprecation.deprecate('Loading the pagination extension globally', "Please use Database/Dataset#extension to load the extension into this dataset") unless is_a?(DatasetPagination)
38
33
  raise(Error, "You cannot paginate a dataset that already has a limit") if @opts[:limit]
39
34
  record_count = count
40
35
  total_pages = (record_count / page_size.to_f).ceil
41
36
  (1..total_pages).each{|page_no| yield paginate(page_no, page_size, record_count)}
42
37
  self
43
38
  end
39
+ end
44
40
 
41
+ class Dataset
45
42
  # Holds methods that only relate to paginated datasets. Paginated dataset
46
43
  # have pages starting at 1 (page 1 is offset 0, page 1 is offset page_size).
47
44
  module Pagination