sequel 4.46.0 → 4.49.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -20,12 +20,14 @@ module Sequel
20
20
 
21
21
  PRIMARY_KEY_INDEX_RE = /\Asqlite_autoindex_/.freeze
22
22
  Sequel::Deprecation.deprecate_constant(self, :PRIMARY_KEY_INDEX_RE)
23
+ TABLES_FILTER = Sequel.~(:name=>'sqlite_sequence'.freeze) & {:type => 'table'.freeze}
24
+ Sequel::Deprecation.deprecate_constant(self, :TABLES_FILTER)
25
+ VIEWS_FILTER = {:type => 'view'.freeze}.freeze
26
+ Sequel::Deprecation.deprecate_constant(self, :VIEWS_FILTER)
23
27
 
24
28
  AUTO_VACUUM = [:none, :full, :incremental].freeze
25
29
  SYNCHRONOUS = [:off, :normal, :full].freeze
26
- TABLES_FILTER = Sequel.~(:name=>'sqlite_sequence'.freeze) & {:type => 'table'.freeze}
27
30
  TEMP_STORE = [:default, :file, :memory].freeze
28
- VIEWS_FILTER = {:type => 'view'.freeze}.freeze
29
31
  TRANSACTION_MODE = {
30
32
  :deferred => "BEGIN DEFERRED TRANSACTION".freeze,
31
33
  :immediate => "BEGIN IMMEDIATE TRANSACTION".freeze,
@@ -37,26 +39,6 @@ module Sequel
37
39
  # booleans be stored as integers, but historically Sequel has used 't'/'f'.
38
40
  attr_accessor :integer_booleans
39
41
 
40
- # A symbol signifying the value of the auto_vacuum PRAGMA.
41
- def auto_vacuum
42
- AUTO_VACUUM[pragma_get(:auto_vacuum).to_i]
43
- end
44
-
45
- # Set the auto_vacuum PRAGMA using the given symbol (:none, :full, or
46
- # :incremental). See pragma_set. Consider using the :auto_vacuum
47
- # Database option instead.
48
- def auto_vacuum=(value)
49
- value = AUTO_VACUUM.index(value) || (raise Error, "Invalid value for auto_vacuum option. Please specify one of :none, :full, :incremental.")
50
- pragma_set(:auto_vacuum, value)
51
- end
52
-
53
- # Set the case_sensitive_like PRAGMA using the given boolean value, if using
54
- # SQLite 3.2.3+. If not using 3.2.3+, no error is raised. See pragma_set.
55
- # Consider using the :case_sensitive_like Database option instead.
56
- def case_sensitive_like=(value)
57
- pragma_set(:case_sensitive_like, !!value ? 'on' : 'off') if sqlite_version >= 30203
58
- end
59
-
60
42
  # A symbol signifying the value of the default transaction mode
61
43
  attr_reader :transaction_mode
62
44
 
@@ -74,18 +56,50 @@ module Sequel
74
56
  :sqlite
75
57
  end
76
58
 
77
- # Boolean signifying the value of the foreign_keys PRAGMA, or nil
78
- # if not using SQLite 3.6.19+.
59
+ # SEQUEL5: Remove
60
+ def auto_vacuum
61
+ AUTO_VACUUM[pragma_get(:auto_vacuum).to_i]
62
+ end
63
+ def auto_vacuum=(value)
64
+ value = AUTO_VACUUM.index(value) || (raise Error, "Invalid value for auto_vacuum option. Please specify one of :none, :full, :incremental.")
65
+ pragma_set(:auto_vacuum, value)
66
+ end
67
+ def case_sensitive_like=(value)
68
+ pragma_set(:case_sensitive_like, !!value ? 'on' : 'off') if sqlite_version >= 30203
69
+ end
79
70
  def foreign_keys
80
71
  pragma_get(:foreign_keys).to_i == 1 if sqlite_version >= 30619
81
72
  end
82
-
83
- # Set the foreign_keys PRAGMA using the given boolean value, if using
84
- # SQLite 3.6.19+. If not using 3.6.19+, no error is raised. See pragma_set.
85
- # Consider using the :foreign_keys Database option instead.
86
73
  def foreign_keys=(value)
87
74
  pragma_set(:foreign_keys, !!value ? 'on' : 'off') if sqlite_version >= 30619
88
75
  end
76
+ def pragma_get(name)
77
+ Sequel::Deprecation.deprecate('Database#{pragma_get,auto_vacuum,case_sensitive_like,foreign_keys,synchronous,temp_store} on SQLite', "These methods may not be safe when using multiple connections, call fetch(#{"PRAGMA #{name}".inspect}).single_value if you really want to get the pragma value")
78
+ self["PRAGMA #{name}"].single_value
79
+ end
80
+ def pragma_set(name, value)
81
+ Sequel::Deprecation.deprecate('Database#{pragma_set,auto_vacuum=,case_sensitive_like=,foreign_keys=,synchronous=,temp_store=} on SQLite', "These methods are not thread safe or safe when using multiple connections, pass the appropriate option when connecting to set the pragma correctly for all connections")
82
+ execute_ddl("PRAGMA #{name} = #{value}")
83
+ end
84
+ def synchronous
85
+ SYNCHRONOUS[pragma_get(:synchronous).to_i]
86
+ end
87
+ def synchronous=(value)
88
+ value = SYNCHRONOUS.index(value) || (raise Error, "Invalid value for synchronous option. Please specify one of :off, :normal, :full.")
89
+ pragma_set(:synchronous, value)
90
+ end
91
+ def temp_store
92
+ TEMP_STORE[pragma_get(:temp_store).to_i]
93
+ end
94
+ def temp_store=(value)
95
+ value = TEMP_STORE.index(value) || (raise Error, "Invalid value for temp_store option. Please specify one of :default, :file, :memory.")
96
+ pragma_set(:temp_store, value)
97
+ end
98
+
99
+ # Set the integer_booleans option using the passed in :integer_boolean option.
100
+ def set_integer_booleans
101
+ @integer_booleans = @opts.has_key?(:integer_booleans) ? typecast_value_boolean(@opts[:integer_booleans]) : true
102
+ end
89
103
 
90
104
  # Return the array of foreign key info hashes using the foreign_key_list PRAGMA,
91
105
  # including information for the :on_update and :on_delete entries.
@@ -115,8 +129,18 @@ module Sequel
115
129
  im = input_identifier_meth
116
130
  indexes = {}
117
131
  metadata_dataset.with_sql("PRAGMA index_list(?)", im.call(table)).each do |r|
118
- # :only_autocreated internal option can be used to get only autocreated indexes
119
- next if (!!(r[:name] =~ /\Asqlite_autoindex_/) ^ !!opts[:only_autocreated])
132
+ if opts[:only_autocreated]
133
+ # If specifically asked for only autocreated indexes, then return those an only those
134
+ next unless r[:name] =~ /\Asqlite_autoindex_/
135
+ elsif r.has_key?(:origin)
136
+ # If origin is set, then only exclude primary key indexes and partial indexes
137
+ next if r[:origin] == 'pk'
138
+ next if r[:partial].to_i == 1
139
+ else
140
+ # When :origin key not present, assume any autoindex could be a primary key one and exclude it
141
+ next if r[:name] =~ /\Asqlite_autoindex_/
142
+ end
143
+
120
144
  indexes[m.call(r[:name])] = {:unique=>r[:unique].to_i==1}
121
145
  end
122
146
  indexes.each do |k, v|
@@ -125,28 +149,6 @@ module Sequel
125
149
  indexes
126
150
  end
127
151
 
128
- # Get the value of the given PRAGMA.
129
- def pragma_get(name)
130
- Sequel::Deprecation.deprecate('Database#{pragma_get,auto_vacuum,case_sensitive_like,foreign_keys,synchronous,temp_store} on SQLite', "These methods may not be safe when using multiple connections, call fetch(#{"PRAGMA #{name}".inspect}).single_value if you really want to get the pragma value")
131
- self["PRAGMA #{name}"].single_value
132
- end
133
-
134
- # Set the value of the given PRAGMA to value.
135
- #
136
- # This method is not thread safe, and will not work correctly if there
137
- # are multiple connections in the Database's connection pool. PRAGMA
138
- # modifications should be done when the connection is created, using
139
- # an option provided when creating the Database object.
140
- def pragma_set(name, value)
141
- Sequel::Deprecation.deprecate('Database#{pragma_set,auto_vacuum=,case_sensitive_like=,foreign_keys=,synchronous=,temp_store=} on SQLite', "These methods are not thread safe or safe when using multiple connections, pass the appropriate option when connecting to set the pragma correctly for all connections")
142
- execute_ddl("PRAGMA #{name} = #{value}")
143
- end
144
-
145
- # Set the integer_booleans option using the passed in :integer_boolean option.
146
- def set_integer_booleans
147
- @integer_booleans = @opts.has_key?(:integer_booleans) ? typecast_value_boolean(@opts[:integer_booleans]) : true
148
- end
149
-
150
152
  # The version of the server as an integer, where 3.6.19 = 30619.
151
153
  # If the server version can't be determined, 0 is used.
152
154
  def sqlite_version
@@ -190,36 +192,12 @@ module Sequel
190
192
  defined?(@use_timestamp_timezones) ? @use_timestamp_timezones : (@use_timestamp_timezones = false)
191
193
  end
192
194
 
193
- # A symbol signifying the value of the synchronous PRAGMA.
194
- def synchronous
195
- SYNCHRONOUS[pragma_get(:synchronous).to_i]
196
- end
197
-
198
- # Set the synchronous PRAGMA using the given symbol (:off, :normal, or :full). See pragma_set.
199
- # Consider using the :synchronous Database option instead.
200
- def synchronous=(value)
201
- value = SYNCHRONOUS.index(value) || (raise Error, "Invalid value for synchronous option. Please specify one of :off, :normal, :full.")
202
- pragma_set(:synchronous, value)
203
- end
204
-
205
195
  # Array of symbols specifying the table names in the current database.
206
196
  #
207
197
  # Options:
208
198
  # :server :: Set the server to use.
209
199
  def tables(opts=OPTS)
210
- tables_and_views(TABLES_FILTER, opts)
211
- end
212
-
213
- # A symbol signifying the value of the temp_store PRAGMA.
214
- def temp_store
215
- TEMP_STORE[pragma_get(:temp_store).to_i]
216
- end
217
-
218
- # Set the temp_store PRAGMA using the given symbol (:default, :file, or :memory). See pragma_set.
219
- # Consider using the :temp_store Database option instead.
220
- def temp_store=(value)
221
- value = TEMP_STORE.index(value) || (raise Error, "Invalid value for temp_store option. Please specify one of :default, :file, :memory.")
222
- pragma_set(:temp_store, value)
200
+ tables_and_views(Sequel.~(:name=>'sqlite_sequence') & {:type => 'table'}, opts)
223
201
  end
224
202
 
225
203
  # Creates a dataset that uses the VALUES clause:
@@ -235,7 +213,7 @@ module Sequel
235
213
  # Options:
236
214
  # :server :: Set the server to use.
237
215
  def views(opts=OPTS)
238
- tables_and_views(VIEWS_FILTER, opts)
216
+ tables_and_views({:type => 'view'}, opts)
239
217
  end
240
218
 
241
219
  private
@@ -438,8 +416,12 @@ module Sequel
438
416
 
439
417
  # Determine unique constraints and make sure the new columns have them
440
418
  unique_columns = []
441
- indexes(table, :only_autocreated=>true).each_value do |h|
442
- unique_columns.concat(h[:columns]) if h[:columns].length == 1 && h[:unique]
419
+ skip_indexes = []
420
+ indexes(table, :only_autocreated=>true).each do |name, h|
421
+ skip_indexes << name
422
+ if h[:columns].length == 1 && h[:unique]
423
+ unique_columns.concat(h[:columns])
424
+ end
443
425
  end
444
426
  unique_columns -= pks
445
427
  unless unique_columns.empty?
@@ -462,6 +444,7 @@ module Sequel
462
444
  "DROP TABLE #{bt}"
463
445
  ]
464
446
  indexes(table).each do |name, h|
447
+ next if skip_indexes.include?(name)
465
448
  if (h[:columns].map(&:to_s) - new_columns).empty?
466
449
  a << alter_table_sql(table, h.merge(:op=>:add_index, :name=>name))
467
450
  end
@@ -471,7 +454,7 @@ module Sequel
471
454
 
472
455
  # Does the reverse of on_delete_clause, eg. converts strings like +'SET NULL'+
473
456
  # to symbols +:set_null+.
474
- def on_delete_sql_to_sym str
457
+ def on_delete_sql_to_sym(str)
475
458
  case str
476
459
  when 'RESTRICT'
477
460
  :restrict
@@ -549,6 +532,9 @@ module Sequel
549
532
  include Dataset::Replace
550
533
  include UnmodifiedIdentifiers::DatasetMethods
551
534
 
535
+ # The allowed values for insert_conflict
536
+ INSERT_CONFLICT_RESOLUTIONS = %w'ROLLBACK ABORT FAIL IGNORE REPLACE'.each(&:freeze).freeze
537
+
552
538
  CONSTANT_MAP = {:CURRENT_DATE=>"date(CURRENT_TIMESTAMP, 'localtime')".freeze, :CURRENT_TIMESTAMP=>"datetime(CURRENT_TIMESTAMP, 'localtime')".freeze, :CURRENT_TIME=>"time(CURRENT_TIMESTAMP, 'localtime')".freeze}#.freeze # SEQUEL5
553
539
  EXTRACT_MAP = {:year=>"'%Y'", :month=>"'%m'", :day=>"'%d'", :hour=>"'%H'", :minute=>"'%M'", :second=>"'%f'"}#.freeze # SEQUEL5
554
540
  #EXTRACT_MAP.each_value(&:freeze) # SEQUEL5
@@ -676,7 +662,7 @@ module Sequel
676
662
  end
677
663
 
678
664
  # Return an array of strings specifying a query explanation for a SELECT of the
679
- # current dataset. Currently, the options are ignore, but it accepts options
665
+ # current dataset. Currently, the options are ignored, but it accepts options
680
666
  # to be compatible with other adapters.
681
667
  def explain(opts=nil)
682
668
  # Load the PrettyTable class, needed for explain output
@@ -723,6 +709,10 @@ module Sequel
723
709
  # DB[:table].insert_conflict(:replace).insert(:a=>1, :b=>2)
724
710
  # # INSERT OR REPLACE INTO TABLE (a, b) VALUES (1, 2)
725
711
  def insert_conflict(resolution = :ignore)
712
+ unless INSERT_CONFLICT_RESOLUTIONS.include?(resolution.to_s.upcase)
713
+ Sequel::Deprecation.deprecate("Passing #{resolution.inspect} argument to Dataset#insert_conflict", "The allowed values are: :rollback, :abort, :fail, :ignore, or :replace")
714
+ # raise Error, "Invalid value passed to Dataset#insert_conflict: #{resolution.inspect}. The allowed values are: :rollback, :abort, :fail, :ignore, or :replace"
715
+ end
726
716
  clone(:insert_conflict => resolution)
727
717
  end
728
718
 
@@ -19,7 +19,7 @@ module Sequel
19
19
  end
20
20
  end
21
21
 
22
- TYPE_TRANSLATOR = tt = Class.new do
22
+ tt = Class.new do
23
23
  def blob(s) ::Sequel::SQL::Blob.new(s) end
24
24
  def boolean(s) s.to_i != 0 end
25
25
  def date(s) ::Date.strptime(s) end
@@ -27,6 +27,9 @@ module Sequel
27
27
  def time(s) ::Sequel.string_to_time(s) end
28
28
  end.new
29
29
 
30
+ TYPE_TRANSLATOR = tt
31
+ Sequel::Deprecation.deprecate_constant(self, :TYPE_TRANSLATOR)
32
+
30
33
  SQLANYWHERE_TYPES = {}
31
34
  {
32
35
  [0, 484] => tt.method(:decimal),
@@ -7,9 +7,9 @@ module Sequel
7
7
  # Top level module for holding all SQLite-related modules and classes
8
8
  # for Sequel.
9
9
  module SQLite
10
- TYPE_TRANSLATOR = tt = Class.new do
11
- FALSE_VALUES = (%w'0 false f no n' + [0]).freeze
10
+ FALSE_VALUES = (%w'0 false f no n' + [0]).freeze
12
11
 
12
+ tt = Class.new do
13
13
  def blob(s)
14
14
  Sequel::SQL::Blob.new(s.to_s)
15
15
  end
@@ -58,9 +58,11 @@ module Sequel
58
58
  raise Sequel::Error, "unhandled type when converting to date: #{s.inspect} (#{s.class.inspect})"
59
59
  end
60
60
  end
61
-
62
61
  end.new
63
62
 
63
+ TYPE_TRANSLATOR = tt
64
+ Sequel::Deprecation.deprecate_constant(self, :TYPE_TRANSLATOR)
65
+
64
66
  # Hash with string keys and callable values for converting SQLite types.
65
67
  SQLITE_TYPES = {}
66
68
  {
@@ -4,8 +4,6 @@ require 'swift/db/postgres'
4
4
  Sequel.require 'adapters/shared/postgres'
5
5
 
6
6
  module Sequel
7
- Postgres::CONVERTED_EXCEPTIONS << ::Swift::Error
8
-
9
7
  module Swift
10
8
  # Adapter, Database, and Dataset support for accessing a PostgreSQL
11
9
  # database via Swift.
@@ -23,6 +21,11 @@ module Sequel
23
21
 
24
22
  private
25
23
 
24
+ DATABASE_ERROR_CLASSES = [::Swift::Error].freeze
25
+ def database_error_classes
26
+ DATABASE_ERROR_CLASSES
27
+ end
28
+
26
29
  # Remove all other options except for ones specifically handled, as
27
30
  # otherwise swift passes them to dbic++ which passes them to PostgreSQL
28
31
  # which can raise an error.
@@ -188,14 +188,11 @@ module Sequel
188
188
  Database::DatasetClass = self
189
189
  Sequel::Deprecation.deprecate_constant(Database, :DatasetClass)
190
190
 
191
- # SQLite already supports named bind arguments, so use directly.
192
191
  module ArgumentMapper
193
192
  include Sequel::Dataset::ArgumentMapper
194
193
 
195
194
  protected
196
195
 
197
- # Return a hash with the same values as the given hash,
198
- # but with the keys converted to strings.
199
196
  def map_to_prepared_args(hash)
200
197
  args = {}
201
198
  hash.each{|k,v| args[k.to_s.gsub('.', '__')] = v}
@@ -204,8 +201,6 @@ module Sequel
204
201
 
205
202
  private
206
203
 
207
- # SQLite uses a : before the name of the argument for named
208
- # arguments.
209
204
  def prepared_arg(k)
210
205
  LiteralString.new("@#{k.to_s.gsub('.', '__')}")
211
206
  end
@@ -18,7 +18,7 @@ module Sequel
18
18
  closed MySQL connection
19
19
  END
20
20
  # Error messages for mysql and mysql2 that indicate the current connection should be disconnected
21
- MYSQL_DATABASE_DISCONNECT_ERRORS = /\A#{Regexp.union(disconnect_errors)}/o
21
+ MYSQL_DATABASE_DISCONNECT_ERRORS = /\A#{Regexp.union(disconnect_errors)}/
22
22
 
23
23
  # Support stored procedures on MySQL
24
24
  def call_sproc(name, opts=OPTS, &block)
@@ -1,78 +1,4 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- module Sequel
4
- module Postgres
5
- NAN = 0.0/0.0
6
- PLUS_INFINITY = 1.0/0.0
7
- MINUS_INFINITY = -1.0/0.0
8
-
9
- NAN_STR = 'NaN'.freeze
10
- Sequel::Deprecation.deprecate_constant(self, :NAN_STR)
11
- PLUS_INFINITY_STR = 'Infinity'.freeze
12
- Sequel::Deprecation.deprecate_constant(self, :PLUS_INFINITY_STR)
13
- MINUS_INFINITY_STR = '-Infinity'.freeze
14
- Sequel::Deprecation.deprecate_constant(self, :MINUS_INFINITY_STR)
15
- TRUE_STR = 't'.freeze
16
- Sequel::Deprecation.deprecate_constant(self, :TRUE_STR)
17
- DASH_STR = '-'.freeze
18
- Sequel::Deprecation.deprecate_constant(self, :DASH_STR)
19
-
20
- TYPE_TRANSLATOR = tt = Class.new do
21
- def boolean(s) s == 't' end
22
- def integer(s) s.to_i end
23
- def float(s)
24
- case s
25
- when 'NaN'
26
- NAN
27
- when 'Infinity'
28
- PLUS_INFINITY
29
- when '-Infinity'
30
- MINUS_INFINITY
31
- else
32
- s.to_f
33
- end
34
- end
35
- def date(s) ::Date.new(*s.split('-').map(&:to_i)) end
36
- def bytea(str)
37
- str = if str =~ /\A\\x/
38
- # PostgreSQL 9.0+ bytea hex format
39
- str[2..-1].gsub(/(..)/){|s| s.to_i(16).chr}
40
- else
41
- # Historical PostgreSQL bytea escape format
42
- str.gsub(/\\(\\|'|[0-3][0-7][0-7])/) {|s|
43
- if s.size == 2 then s[1,1] else s[1,3].oct.chr end
44
- }
45
- end
46
- ::Sequel::SQL::Blob.new(str)
47
- end
48
- end.new
49
-
50
- # Type OIDs for string types used by PostgreSQL. These types don't
51
- # have conversion procs associated with them (since the data is
52
- # already in the form of a string).
53
- STRING_TYPES = [18, 19, 25, 1042, 1043]#.freeze # SEQUEL5
54
-
55
- # Hash with type name strings/symbols and callable values for converting PostgreSQL types.
56
- # Non-builtin types that don't have fixed numbers should use this to register
57
- # conversion procs.
58
- PG_NAMED_TYPES = {} unless defined?(PG_NAMED_TYPES)
59
- PG_NAMED__TYPES = PG_NAMED_TYPES
60
- Sequel::Deprecation.deprecate_constant(self, :PG_NAMED_TYPES)
61
-
62
- # Hash with integer keys and callable values for converting PostgreSQL types.
63
- PG_TYPES = {} unless defined?(PG_TYPES)
64
-
65
- {
66
- [16] => tt.method(:boolean),
67
- [17] => tt.method(:bytea),
68
- [20, 21, 23, 26] => tt.method(:integer),
69
- [700, 701] => tt.method(:float),
70
- [1700] => ::BigDecimal.method(:new),
71
- [1083, 1266] => ::Sequel.method(:string_to_time),
72
- [1082] => ::Sequel.method(:string_to_date),
73
- [1184, 1114] => ::Sequel.method(:database_to_application_timestamp),
74
- }.each do |k,v|
75
- k.each{|n| PG_TYPES[n] = v}
76
- end
77
- end
78
- end
3
+ Sequel::Deprecation.deprecate("requiring sequel/adapters/utils/pg_types", "This file should no longer be required, use Database#conversion_procs to modify conversion procs for a Database instance")
4
+ Sequel.require 'adapters/shared/postgres'
@@ -93,7 +93,7 @@ module Sequel
93
93
  def initialize(table, unused=nil)
94
94
  if unused
95
95
  # :nocov:
96
- Sequel::Deprecation.deprecate("Passing two arguments to Sequel::Qualifier.new", 'Pass only the second arguument specifying the table used for qualification')
96
+ Sequel::Deprecation.deprecate("Passing two arguments to Sequel::Qualifier.new", 'Pass only the second argument specifying the table used for qualification')
97
97
  @table = unused
98
98
  # :nocov:
99
99
  else
@@ -111,5 +111,5 @@ class Sequel::ShardedSingleConnectionPool < Sequel::ConnectionPool
111
111
  servers.each{|s| hold(s){}}
112
112
  end
113
113
 
114
- CONNECTION_POOL_MAP[[true, true]] = self
114
+ CONNECTION_POOL__MAP[[true, true]] = self
115
115
  end
@@ -353,5 +353,5 @@ class Sequel::ShardedThreadedConnectionPool < Sequel::ThreadedConnectionPool
353
353
  disconnect_connection(conn)
354
354
  end
355
355
 
356
- CONNECTION_POOL_MAP[[false, true]] = self
356
+ CONNECTION_POOL__MAP[[false, true]] = self
357
357
  end
@@ -26,7 +26,7 @@ class Sequel::SingleConnectionPool < Sequel::ConnectionPool
26
26
  def hold(server=nil)
27
27
  begin
28
28
  unless c = @conn.first
29
- @conn.replace([c = make_new(DEFAULT_SERVER)])
29
+ @conn.replace([c = make_new(:default)])
30
30
  end
31
31
  yield c
32
32
  rescue Sequel::DatabaseDisconnectError, *@error_classes => e
@@ -57,5 +57,5 @@ class Sequel::SingleConnectionPool < Sequel::ConnectionPool
57
57
  hold{}
58
58
  end
59
59
 
60
- CONNECTION_POOL_MAP[[true, false]] = self
60
+ CONNECTION_POOL__MAP[[true, false]] = self
61
61
  end
@@ -198,7 +198,7 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
198
198
  # available, tries to create a new connection. The calling code should already
199
199
  # have the mutex before calling this.
200
200
  def available
201
- next_available || make_new(DEFAULT_SERVER)
201
+ next_available || make_new(:default)
202
202
  end
203
203
 
204
204
  # Return a connection to the pool of available connections, returns the connection.
@@ -282,5 +282,5 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
282
282
  @mutex.synchronize{yield}
283
283
  end
284
284
 
285
- CONNECTION_POOL_MAP[[false, false]] = self
285
+ CONNECTION_POOL__MAP[[false, false]] = self
286
286
  end
@@ -29,12 +29,15 @@ class Sequel::ConnectionPool
29
29
 
30
30
  # The default server to use
31
31
  DEFAULT_SERVER = :default
32
+ Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SERVER)
32
33
 
33
34
  # A map of [single threaded, sharded] values to symbols or ConnectionPool subclasses.
34
35
  CONNECTION_POOL_MAP = {[true, false] => :single,
35
36
  [true, true] => :sharded_single,
36
37
  [false, false] => :threaded,
37
38
  [false, true] => :sharded_threaded}
39
+ CONNECTION_POOL__MAP = CONNECTION_POOL_MAP
40
+ Sequel::Deprecation.deprecate_constant(self, :CONNECTION_POOL_MAP)
38
41
 
39
42
  # Class methods used to return an appropriate pool subclass, separated
40
43
  # into a module for easier overridding by extensions.
@@ -57,7 +60,10 @@ class Sequel::ConnectionPool
57
60
 
58
61
  # Return a connection pool class based on the given options.
59
62
  def connection_pool_class(opts)
60
- CONNECTION_POOL_MAP[opts[:pool_class]] || opts[:pool_class] || CONNECTION_POOL_MAP[[!!opts[:single_threaded], !!opts[:servers]]]
63
+ if opts[:pool_class] && !opts[:pool_class].is_a?(Class) && ![:threaded, :single, :sharded_threaded, :sharded_single].include?(opts[:pool_class])
64
+ Sequel::Deprecation.deprecate("Using an unrecognized :pool_class option", "Use a class for the :pool_class option to select a custom pool class, or one of the following symbols for one of the default pool classes: :threaded, :single, :sharded_threaded, :sharded_single")
65
+ end
66
+ CONNECTION_POOL__MAP[opts[:pool_class]] || opts[:pool_class] || CONNECTION_POOL__MAP[[!!opts[:single_threaded], !!opts[:servers]]]
61
67
  end
62
68
  end
63
69
  extend ClassMethods
@@ -89,12 +95,13 @@ class Sequel::ConnectionPool
89
95
 
90
96
  # Alias for +size+, not aliased directly for ease of subclass implementation
91
97
  def created_count(*args)
98
+ Sequel::Deprecation.deprecate("Sequel::ConnectionPool#created_count", "Use #size instead")
92
99
  size(*args)
93
100
  end
94
101
 
95
102
  # An array of symbols for all shards/servers, which is a single <tt>:default</tt> by default.
96
103
  def servers
97
- [DEFAULT_SERVER]
104
+ [:default]
98
105
  end
99
106
 
100
107
  private
data/lib/sequel/core.rb CHANGED
@@ -188,8 +188,8 @@ module Sequel
188
188
 
189
189
  # Convert given object to json and return the result.
190
190
  # This can be overridden to use an alternative json implementation.
191
- def self.object_to_json(obj, *args)
192
- obj.to_json(*args)
191
+ def self.object_to_json(obj, *args, &block)
192
+ obj.to_json(*args, &block)
193
193
  end
194
194
 
195
195
  # Parse the string as JSON and return the result.
@@ -8,7 +8,7 @@ module Sequel
8
8
  # ---------------------
9
9
 
10
10
  # Array of supported database adapters
11
- ADAPTERS = %w'ado amalgalite cubrid do ibmdb jdbc mock mysql mysql2 odbc oracle postgres sqlanywhere sqlite swift tinytds'.collect(&:to_sym)
11
+ ADAPTERS = %w'ado amalgalite cubrid do ibmdb jdbc mock mysql mysql2 odbc oracle postgres sqlanywhere sqlite swift tinytds'.map(&:to_sym)
12
12
  # SEQUEL5: Remove cubrid do swift
13
13
 
14
14
  def self.single_threaded
@@ -49,7 +49,7 @@ module Sequel
49
49
  case conn_string
50
50
  when String
51
51
  # SEQUEL5: Remove do
52
- if match = /\A(jdbc|do):/o.match(conn_string)
52
+ if match = /\A(jdbc|do):/.match(conn_string)
53
53
  c = adapter_class(match[1].to_sym)
54
54
  opts = opts.merge(:orig_opts=>opts.dup)
55
55
  opts = {:uri=>conn_string}.merge!(opts)
@@ -58,7 +58,7 @@ module Sequel
58
58
  scheme = uri.scheme
59
59
  c = adapter_class(scheme)
60
60
  uri_options = c.send(:uri_to_options, uri)
61
- uri.query.split('&').collect{|s| s.split('=')}.each{|k,v| uri_options[k.to_sym] = v if k && !k.empty?} unless uri.query.to_s.strip.empty?
61
+ uri.query.split('&').map{|s| s.split('=')}.each{|k,v| uri_options[k.to_sym] = v if k && !k.empty?} unless uri.query.to_s.strip.empty?
62
62
  uri_options.to_a.each{|k,v| uri_options[k] = (defined?(URI::DEFAULT_PARSER) ? URI::DEFAULT_PARSER : URI).unescape(v) if v.is_a?(String)}
63
63
  opts = uri_options.merge(opts).merge!(:orig_opts=>opts.dup, :uri=>conn_string, :adapter=>scheme)
64
64
  end
@@ -197,7 +197,7 @@ module Sequel
197
197
  # DB.add_servers(:f=>{:host=>"hash_host_f"})
198
198
  def add_servers(servers)
199
199
  unless h = @opts[:servers]
200
- Sequel::Deprecation.deprecate("Calling Database#add_servers on a database that does not use sharding", "This method should only be called if the database supports sharding.")
200
+ Sequel::Deprecation.deprecate("Calling Database#add_servers on a database that does not use sharding", "This method should only be called if the database supports sharding")
201
201
  # raise Error, "cannot call Database#add_servers on a Database instance that does not use a sharded connection pool" # SEQUEL5
202
202
  return
203
203
  end
@@ -220,14 +220,14 @@ module Sequel
220
220
 
221
221
  # Disconnects all available connections from the connection pool. Any
222
222
  # connections currently in use will not be disconnected. Options:
223
- # :servers :: Should be a symbol specifing the server to disconnect from,
223
+ # :server :: Should be a symbol specifing the server to disconnect from,
224
224
  # or an array of symbols to specify multiple servers.
225
225
  #
226
226
  # Example:
227
227
  #
228
228
  # DB.disconnect # All servers
229
- # DB.disconnect(:servers=>:server1) # Single server
230
- # DB.disconnect(:servers=>[:server1, :server2]) # Multiple servers
229
+ # DB.disconnect(:server=>:server1) # Single server
230
+ # DB.disconnect(:server=>[:server1, :server2]) # Multiple servers
231
231
  def disconnect(opts = OPTS)
232
232
  pool.disconnect(opts)
233
233
  end
@@ -262,7 +262,7 @@ module Sequel
262
262
  # DB.remove_servers(:f1, :f2)
263
263
  def remove_servers(*servers)
264
264
  unless h = @opts[:servers]
265
- Sequel::Deprecation.deprecate("Calling Database#add_servers on a database that does not use sharding", "This method should only be called if the database supports sharding.")
265
+ Sequel::Deprecation.deprecate("Calling Database#add_servers on a database that does not use sharding", "This method should only be called if the database supports sharding")
266
266
  # raise Error, "cannot call Database#remove_servers on a Database instance that does not use a sharded connection pool" # SEQUEL5
267
267
  return
268
268
  end
@@ -58,12 +58,15 @@ module Sequel
58
58
  # DB.from(:items) # SELECT * FROM items
59
59
  # DB.from(:items){id > 2} # SELECT * FROM items WHERE (id > 2)
60
60
  def from(*args, &block)
61
- ds = @default_dataset.from(*args)
62
61
  if block
63
62
  Sequel::Deprecation.deprecate("Sequel::Database#from with a block", "Use .from(*args).where(&block) instead")
64
- ds.where(&block)
63
+ @default_dataset.from(*args).where(&block)
64
+ #SEQUEL5
65
+ # @default_dataset.from(*args, &block)
66
+ #elsif args.length == 1 && (table = args[0]).is_a?(Symbol)
67
+ # @default_dataset.send(:cached_dataset, :"_from_#{table}_ds"){@default_dataset.from(table)}
65
68
  else
66
- ds
69
+ @default_dataset.from(*args)
67
70
  end
68
71
  end
69
72
 
@@ -69,6 +69,9 @@ module Sequel
69
69
  # This allows you to override any of the dataset methods even if they are
70
70
  # defined directly on the dataset class that this Database object uses.
71
71
  #
72
+ # If a block is given, a Dataset::DatasetModule instance is created, allowing
73
+ # for the easy creation of named dataset methods that will do caching.
74
+ #
72
75
  # Examples:
73
76
  #
74
77
  # # Introspec columns for all of DB's datasets
@@ -82,9 +85,19 @@ module Sequel
82
85
  # super
83
86
  # end
84
87
  # end
88
+ #
89
+ # # Add some named dataset methods
90
+ # DB.extend_datasets do
91
+ # order :by_id, :id
92
+ # select :with_id_and_name, :id, :name
93
+ # where :active, :active
94
+ # end
95
+ #
96
+ # DB[:table].active.with_id_and_name.by_id
97
+ # # SELECT id, name FROM table WHERE active ORDER BY id
85
98
  def extend_datasets(mod=nil, &block)
86
99
  raise(Error, "must provide either mod or block, not both") if mod && block
87
- mod = Module.new(&block) if block
100
+ mod = Dataset::DatasetModule.new(&block) if block
88
101
  if @dataset_modules.empty?
89
102
  @dataset_modules = [mod]
90
103
  @dataset_class = Class.new(@dataset_class)