sequel 3.21.0 → 3.32.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 (234) hide show
  1. data/CHANGELOG +539 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +20 -6
  4. data/Rakefile +37 -19
  5. data/bin/sequel +1 -5
  6. data/doc/advanced_associations.rdoc +17 -0
  7. data/doc/association_basics.rdoc +293 -43
  8. data/doc/dataset_basics.rdoc +4 -4
  9. data/doc/dataset_filtering.rdoc +8 -0
  10. data/doc/mass_assignment.rdoc +54 -0
  11. data/doc/migration.rdoc +15 -538
  12. data/doc/model_hooks.rdoc +72 -27
  13. data/doc/opening_databases.rdoc +89 -50
  14. data/doc/prepared_statements.rdoc +40 -13
  15. data/doc/reflection.rdoc +8 -2
  16. data/doc/release_notes/3.22.0.txt +39 -0
  17. data/doc/release_notes/3.23.0.txt +172 -0
  18. data/doc/release_notes/3.24.0.txt +420 -0
  19. data/doc/release_notes/3.25.0.txt +88 -0
  20. data/doc/release_notes/3.26.0.txt +88 -0
  21. data/doc/release_notes/3.27.0.txt +82 -0
  22. data/doc/release_notes/3.28.0.txt +304 -0
  23. data/doc/release_notes/3.29.0.txt +459 -0
  24. data/doc/release_notes/3.30.0.txt +135 -0
  25. data/doc/release_notes/3.31.0.txt +146 -0
  26. data/doc/release_notes/3.32.0.txt +202 -0
  27. data/doc/schema_modification.rdoc +547 -0
  28. data/doc/sharding.rdoc +7 -1
  29. data/doc/testing.rdoc +129 -0
  30. data/doc/transactions.rdoc +137 -0
  31. data/doc/virtual_rows.rdoc +2 -2
  32. data/lib/sequel/adapters/ado/mssql.rb +18 -6
  33. data/lib/sequel/adapters/ado.rb +40 -18
  34. data/lib/sequel/adapters/amalgalite.rb +17 -9
  35. data/lib/sequel/adapters/db2.rb +175 -86
  36. data/lib/sequel/adapters/dbi.rb +15 -15
  37. data/lib/sequel/adapters/do/mysql.rb +5 -7
  38. data/lib/sequel/adapters/do/postgres.rb +0 -5
  39. data/lib/sequel/adapters/do/sqlite.rb +0 -5
  40. data/lib/sequel/adapters/do.rb +17 -36
  41. data/lib/sequel/adapters/firebird.rb +27 -208
  42. data/lib/sequel/adapters/ibmdb.rb +448 -0
  43. data/lib/sequel/adapters/informix.rb +6 -23
  44. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  45. data/lib/sequel/adapters/jdbc/db2.rb +52 -0
  46. data/lib/sequel/adapters/jdbc/derby.rb +260 -0
  47. data/lib/sequel/adapters/jdbc/firebird.rb +29 -0
  48. data/lib/sequel/adapters/jdbc/h2.rb +66 -30
  49. data/lib/sequel/adapters/jdbc/hsqldb.rb +177 -0
  50. data/lib/sequel/adapters/jdbc/informix.rb +26 -0
  51. data/lib/sequel/adapters/jdbc/jtds.rb +34 -0
  52. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  53. data/lib/sequel/adapters/jdbc/mysql.rb +11 -11
  54. data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
  55. data/lib/sequel/adapters/jdbc/postgresql.rb +9 -13
  56. data/lib/sequel/adapters/jdbc/sqlite.rb +2 -6
  57. data/lib/sequel/adapters/jdbc/sqlserver.rb +71 -0
  58. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  59. data/lib/sequel/adapters/jdbc.rb +231 -78
  60. data/lib/sequel/adapters/mock.rb +339 -0
  61. data/lib/sequel/adapters/mysql.rb +85 -184
  62. data/lib/sequel/adapters/mysql2.rb +26 -25
  63. data/lib/sequel/adapters/odbc/db2.rb +17 -0
  64. data/lib/sequel/adapters/odbc/mssql.rb +1 -6
  65. data/lib/sequel/adapters/odbc.rb +28 -9
  66. data/lib/sequel/adapters/openbase.rb +3 -5
  67. data/lib/sequel/adapters/oracle.rb +355 -53
  68. data/lib/sequel/adapters/postgres.rb +194 -33
  69. data/lib/sequel/adapters/shared/access.rb +32 -9
  70. data/lib/sequel/adapters/shared/db2.rb +328 -0
  71. data/lib/sequel/adapters/shared/firebird.rb +221 -0
  72. data/lib/sequel/adapters/shared/informix.rb +53 -0
  73. data/lib/sequel/adapters/shared/mssql.rb +278 -107
  74. data/lib/sequel/adapters/shared/mysql.rb +203 -65
  75. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +149 -0
  76. data/lib/sequel/adapters/shared/oracle.rb +237 -46
  77. data/lib/sequel/adapters/shared/postgres.rb +214 -82
  78. data/lib/sequel/adapters/shared/progress.rb +5 -8
  79. data/lib/sequel/adapters/shared/sqlite.rb +200 -50
  80. data/lib/sequel/adapters/sqlite.rb +29 -21
  81. data/lib/sequel/adapters/swift/mysql.rb +12 -7
  82. data/lib/sequel/adapters/swift/postgres.rb +0 -5
  83. data/lib/sequel/adapters/swift/sqlite.rb +8 -6
  84. data/lib/sequel/adapters/swift.rb +5 -5
  85. data/lib/sequel/adapters/tinytds.rb +160 -19
  86. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +66 -0
  87. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  88. data/lib/sequel/ast_transformer.rb +190 -0
  89. data/lib/sequel/connection_pool/threaded.rb +3 -2
  90. data/lib/sequel/connection_pool.rb +1 -1
  91. data/lib/sequel/core.rb +68 -5
  92. data/lib/sequel/database/connecting.rb +5 -6
  93. data/lib/sequel/database/dataset.rb +4 -4
  94. data/lib/sequel/database/dataset_defaults.rb +59 -1
  95. data/lib/sequel/database/logging.rb +1 -1
  96. data/lib/sequel/database/misc.rb +104 -19
  97. data/lib/sequel/database/query.rb +163 -59
  98. data/lib/sequel/database/schema_generator.rb +17 -7
  99. data/lib/sequel/database/schema_methods.rb +59 -29
  100. data/lib/sequel/dataset/actions.rb +240 -76
  101. data/lib/sequel/dataset/features.rb +91 -8
  102. data/lib/sequel/dataset/graph.rb +38 -11
  103. data/lib/sequel/dataset/misc.rb +50 -23
  104. data/lib/sequel/dataset/mutation.rb +12 -7
  105. data/lib/sequel/dataset/prepared_statements.rb +59 -27
  106. data/lib/sequel/dataset/query.rb +236 -43
  107. data/lib/sequel/dataset/sql.rb +676 -267
  108. data/lib/sequel/dataset.rb +8 -0
  109. data/lib/sequel/exceptions.rb +4 -0
  110. data/lib/sequel/extensions/columns_introspection.rb +61 -0
  111. data/lib/sequel/extensions/migration.rb +6 -4
  112. data/lib/sequel/extensions/named_timezones.rb +5 -0
  113. data/lib/sequel/extensions/query.rb +1 -1
  114. data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
  115. data/lib/sequel/extensions/to_dot.rb +95 -83
  116. data/lib/sequel/model/associations.rb +1081 -344
  117. data/lib/sequel/model/base.rb +420 -133
  118. data/lib/sequel/model/errors.rb +1 -1
  119. data/lib/sequel/model/exceptions.rb +5 -1
  120. data/lib/sequel/model.rb +20 -10
  121. data/lib/sequel/plugins/active_model.rb +13 -1
  122. data/lib/sequel/plugins/association_pks.rb +22 -4
  123. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  124. data/lib/sequel/plugins/composition.rb +43 -10
  125. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  126. data/lib/sequel/plugins/defaults_setter.rb +58 -0
  127. data/lib/sequel/plugins/force_encoding.rb +6 -6
  128. data/lib/sequel/plugins/identity_map.rb +114 -7
  129. data/lib/sequel/plugins/many_through_many.rb +68 -7
  130. data/lib/sequel/plugins/nested_attributes.rb +65 -10
  131. data/lib/sequel/plugins/prepared_statements.rb +151 -0
  132. data/lib/sequel/plugins/prepared_statements_associations.rb +84 -0
  133. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  134. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  135. data/lib/sequel/plugins/rcte_tree.rb +29 -15
  136. data/lib/sequel/plugins/serialization.rb +98 -49
  137. data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
  138. data/lib/sequel/plugins/sharding.rb +21 -54
  139. data/lib/sequel/plugins/single_table_inheritance.rb +3 -1
  140. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  141. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  142. data/lib/sequel/plugins/xml_serializer.rb +3 -3
  143. data/lib/sequel/sql.rb +109 -52
  144. data/lib/sequel/timezones.rb +57 -38
  145. data/lib/sequel/version.rb +1 -1
  146. data/spec/adapters/db2_spec.rb +146 -0
  147. data/spec/adapters/mssql_spec.rb +135 -30
  148. data/spec/adapters/mysql_spec.rb +244 -212
  149. data/spec/adapters/oracle_spec.rb +67 -77
  150. data/spec/adapters/postgres_spec.rb +267 -78
  151. data/spec/adapters/spec_helper.rb +6 -5
  152. data/spec/adapters/sqlite_spec.rb +35 -21
  153. data/spec/core/connection_pool_spec.rb +71 -92
  154. data/spec/core/core_sql_spec.rb +21 -30
  155. data/spec/core/database_spec.rb +789 -512
  156. data/spec/core/dataset_spec.rb +1176 -1061
  157. data/spec/core/expression_filters_spec.rb +159 -42
  158. data/spec/core/mock_adapter_spec.rb +419 -0
  159. data/spec/core/object_graph_spec.rb +86 -114
  160. data/spec/core/schema_generator_spec.rb +3 -3
  161. data/spec/core/schema_spec.rb +298 -38
  162. data/spec/core/spec_helper.rb +6 -48
  163. data/spec/extensions/active_model_spec.rb +13 -0
  164. data/spec/extensions/association_autoreloading_spec.rb +1 -10
  165. data/spec/extensions/association_dependencies_spec.rb +2 -12
  166. data/spec/extensions/association_pks_spec.rb +66 -32
  167. data/spec/extensions/caching_spec.rb +23 -50
  168. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  169. data/spec/extensions/columns_introspection_spec.rb +91 -0
  170. data/spec/extensions/composition_spec.rb +18 -13
  171. data/spec/extensions/dataset_associations_spec.rb +199 -0
  172. data/spec/extensions/defaults_setter_spec.rb +64 -0
  173. data/spec/extensions/hook_class_methods_spec.rb +65 -91
  174. data/spec/extensions/identity_map_spec.rb +114 -22
  175. data/spec/extensions/instance_filters_spec.rb +11 -21
  176. data/spec/extensions/instance_hooks_spec.rb +53 -0
  177. data/spec/extensions/json_serializer_spec.rb +4 -5
  178. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  179. data/spec/extensions/list_spec.rb +17 -39
  180. data/spec/extensions/many_through_many_spec.rb +283 -250
  181. data/spec/extensions/migration_spec.rb +35 -32
  182. data/spec/extensions/named_timezones_spec.rb +23 -3
  183. data/spec/extensions/nested_attributes_spec.rb +97 -88
  184. data/spec/extensions/optimistic_locking_spec.rb +9 -20
  185. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  186. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  187. data/spec/extensions/prepared_statements_spec.rb +53 -0
  188. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  189. data/spec/extensions/pretty_table_spec.rb +1 -6
  190. data/spec/extensions/query_spec.rb +6 -0
  191. data/spec/extensions/rcte_tree_spec.rb +41 -43
  192. data/spec/extensions/schema_dumper_spec.rb +5 -8
  193. data/spec/extensions/schema_spec.rb +13 -21
  194. data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
  195. data/spec/extensions/serialization_spec.rb +81 -43
  196. data/spec/extensions/sharding_spec.rb +66 -140
  197. data/spec/extensions/single_table_inheritance_spec.rb +18 -29
  198. data/spec/extensions/spec_helper.rb +13 -61
  199. data/spec/extensions/sql_expr_spec.rb +20 -60
  200. data/spec/extensions/tactical_eager_loading_spec.rb +9 -19
  201. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  202. data/spec/extensions/timestamps_spec.rb +6 -6
  203. data/spec/extensions/to_dot_spec.rb +4 -7
  204. data/spec/extensions/touch_spec.rb +13 -14
  205. data/spec/extensions/tree_spec.rb +11 -26
  206. data/spec/extensions/typecast_on_load_spec.rb +1 -6
  207. data/spec/extensions/update_primary_key_spec.rb +30 -24
  208. data/spec/extensions/validation_class_methods_spec.rb +30 -51
  209. data/spec/extensions/validation_helpers_spec.rb +16 -35
  210. data/spec/extensions/xml_serializer_spec.rb +16 -4
  211. data/spec/integration/associations_test.rb +661 -21
  212. data/spec/integration/database_test.rb +4 -2
  213. data/spec/integration/dataset_test.rb +500 -67
  214. data/spec/integration/eager_loader_test.rb +19 -21
  215. data/spec/integration/model_test.rb +80 -1
  216. data/spec/integration/plugin_test.rb +367 -119
  217. data/spec/integration/prepared_statement_test.rb +222 -125
  218. data/spec/integration/schema_test.rb +217 -39
  219. data/spec/integration/spec_helper.rb +39 -30
  220. data/spec/integration/timezone_test.rb +38 -12
  221. data/spec/integration/transaction_test.rb +182 -5
  222. data/spec/integration/type_test.rb +17 -3
  223. data/spec/model/association_reflection_spec.rb +201 -7
  224. data/spec/model/associations_spec.rb +955 -662
  225. data/spec/model/base_spec.rb +275 -95
  226. data/spec/model/dataset_methods_spec.rb +7 -27
  227. data/spec/model/eager_loading_spec.rb +677 -676
  228. data/spec/model/hooks_spec.rb +349 -67
  229. data/spec/model/model_spec.rb +222 -168
  230. data/spec/model/plugins_spec.rb +24 -13
  231. data/spec/model/record_spec.rb +381 -218
  232. data/spec/model/spec_helper.rb +13 -71
  233. data/spec/model/validations_spec.rb +11 -0
  234. metadata +117 -73
@@ -0,0 +1,339 @@
1
+ module Sequel
2
+ module Mock
3
+ # Connection class for Sequel's mock adapter.
4
+ class Connection
5
+ # Sequel::Mock::Database object that created this connection
6
+ attr_reader :db
7
+
8
+ # Shard this connection operates on, when using Sequel's
9
+ # sharding support (always :default for databases not using
10
+ # sharding).
11
+ attr_reader :server
12
+
13
+ # The specific database options for this connection.
14
+ attr_reader :opts
15
+
16
+ # Store the db, server, and opts.
17
+ def initialize(db, server, opts)
18
+ @db = db
19
+ @server = server
20
+ @opts = opts
21
+ end
22
+
23
+ # Delegate to the db's #_execute method.
24
+ def execute(sql)
25
+ @db.send(:_execute, self, sql)
26
+ end
27
+ end
28
+
29
+ # Database class for Sequel's mock adapter.
30
+ class Database < Sequel::Database
31
+ set_adapter_scheme :mock
32
+
33
+ # Map of database type names to module names, used for handling
34
+ # mock adapters for specific database types.
35
+ SHARED_ADAPTERS = {
36
+ 'access'=>'Access',
37
+ 'db2'=>'DB2',
38
+ 'firebird'=>'Firebird',
39
+ 'informix'=>'Informix',
40
+ 'mssql'=>'MSSQL',
41
+ 'mysql'=>'MySQL',
42
+ 'oracle'=>'Oracle',
43
+ 'postgres'=>'Postgres',
44
+ 'sqlite'=>'SQLite'
45
+ }
46
+
47
+ # Set the autogenerated primary key integer
48
+ # to be returned when running an insert query.
49
+ # Argument types supported:
50
+ #
51
+ # nil :: Return nil for all inserts
52
+ # Integer :: Starting integer for next insert, with
53
+ # futher inserts getting an incremented
54
+ # value
55
+ # Array :: First insert gets the first value in the
56
+ # array, second gets the second value, etc.
57
+ # Proc :: Called with the insert SQL query, uses
58
+ # the value returned
59
+ # Class :: Should be an Exception subclass, will create a new
60
+ # instance an raise it wrapped in a DatabaseError.
61
+ attr_writer :autoid
62
+
63
+ # Set the columns to set in the dataset when the dataset fetches
64
+ # rows. Argument types supported:
65
+ # nil :: Set no columns
66
+ # Array of Symbols: Used for all datasets
67
+ # Array (otherwise): First retrieval gets the first value in the
68
+ # array, second gets the second value, etc.
69
+ # Proc :: Called with the select SQL query, uses the value
70
+ # returned, which should be an array of symbols
71
+ attr_writer :columns
72
+
73
+ # Set the hashes to yield by execute when retrieving rows.
74
+ # Argument types supported:
75
+ #
76
+ # nil :: Yield no rows
77
+ # Hash :: Always yield a single row with this hash
78
+ # Array of Hashes :: Yield separately for each hash in this array
79
+ # Array (otherwise) :: First retrieval gets the first value
80
+ # in the array, second gets the second value, etc.
81
+ # Proc :: Called with the select SQL query, uses
82
+ # the value returned, which should be a hash or
83
+ # array of hashes.
84
+ # Class :: Should be an Exception subclass, will create a new
85
+ # instance an raise it wrapped in a DatabaseError.
86
+ attr_writer :fetch
87
+
88
+ # Set the number of rows to return from update or delete.
89
+ # Argument types supported:
90
+ #
91
+ # nil :: Return 0 for all updates and deletes
92
+ # Integer :: Used for all updates and deletes
93
+ # Array :: First update/delete gets the first value in the
94
+ # array, second gets the second value, etc.
95
+ # Proc :: Called with the update/delete SQL query, uses
96
+ # the value returned.
97
+ # Class :: Should be an Exception subclass, will create a new
98
+ # instance an raise it wrapped in a DatabaseError.
99
+ attr_writer :numrows
100
+
101
+ # Additional options supported:
102
+ #
103
+ # :autoid :: Call #autoid= with the value
104
+ # :columns :: Call #columns= with the value
105
+ # :fetch :: Call #fetch= with the value
106
+ # :numrows :: Call #numrows= with the value
107
+ # :extend :: A module the object is extended with.
108
+ # :sqls :: The array to store the SQL queries in.
109
+ def initialize(opts={})
110
+ super
111
+ opts = @opts
112
+ if mod_name = SHARED_ADAPTERS[opts[:host]]
113
+ require "sequel/adapters/shared/#{opts[:host]}"
114
+ extend Sequel.const_get(mod_name)::DatabaseMethods
115
+ extend_datasets Sequel.const_get(mod_name)::DatasetMethods
116
+ end
117
+ self.autoid = opts[:autoid]
118
+ self.columns = opts[:columns]
119
+ self.fetch = opts[:fetch]
120
+ self.numrows = opts[:numrows]
121
+ extend(opts[:extend]) if opts[:extend]
122
+ @sqls = opts[:sqls] || []
123
+ end
124
+
125
+ # Return a related Connection option connecting to the given shard.
126
+ def connect(server)
127
+ Connection.new(self, server, server_opts(server))
128
+ end
129
+
130
+ # Store the sql used for later retrieval with #sqls, and return
131
+ # the appropriate value using either the #autoid, #fetch, or
132
+ # #numrows methods.
133
+ def execute(sql, opts={}, &block)
134
+ synchronize(opts[:server]){|c| _execute(c, sql, opts, &block)}
135
+ end
136
+ alias execute_ddl execute
137
+
138
+ # Store the sql used, and return the value of the #numrows method.
139
+ def execute_dui(sql, opts={})
140
+ execute(sql, opts.merge(:meth=>:numrows))
141
+ end
142
+
143
+ # Store the sql used, and return the value of the #autoid method.
144
+ def execute_insert(sql, opts={})
145
+ execute(sql, opts.merge(:meth=>:autoid))
146
+ end
147
+
148
+ # Return all stored SQL queries, and clear the cache
149
+ # of SQL queries.
150
+ def sqls
151
+ s = @sqls.dup
152
+ @sqls.clear
153
+ s
154
+ end
155
+
156
+ # Enable use of savepoints.
157
+ def supports_savepoints?
158
+ true
159
+ end
160
+
161
+ private
162
+
163
+ def _autoid(sql, v, ds=nil)
164
+ case v
165
+ when Integer
166
+ if ds
167
+ ds.autoid += 1 if ds.autoid.is_a?(Integer)
168
+ else
169
+ @autoid += 1
170
+ end
171
+ v
172
+ else
173
+ _nextres(v, sql, nil)
174
+ end
175
+ end
176
+
177
+ def _execute(c, sql, opts={}, &block)
178
+ sql += " -- args: #{opts[:arguments].inspect}" if opts[:arguments]
179
+ sql += " -- #{@opts[:append]}" if @opts[:append]
180
+ sql += " -- #{c.server}" if c.server != :default
181
+ log_info(sql)
182
+ @sqls << sql
183
+
184
+ ds = opts[:dataset]
185
+ begin
186
+ if block
187
+ columns(ds, sql) if ds
188
+ _fetch(sql, ds._fetch || @fetch, &block)
189
+ elsif meth = opts[:meth]
190
+ if meth == :numrows
191
+ _numrows(sql, ds.numrows || @numrows)
192
+ else
193
+ v = ds.autoid
194
+ _autoid(sql, v || @autoid, (ds if v))
195
+ end
196
+ end
197
+ rescue => e
198
+ raise_error(e)
199
+ end
200
+ end
201
+
202
+ def _fetch(sql, f, &block)
203
+ case f
204
+ when Hash
205
+ yield f.dup
206
+ when Array
207
+ if f.all?{|h| h.is_a?(Hash)}
208
+ f.each{|h| yield h.dup}
209
+ else
210
+ _fetch(sql, f.shift, &block)
211
+ end
212
+ when Proc
213
+ h = f.call(sql)
214
+ if h.is_a?(Hash)
215
+ yield h.dup
216
+ elsif h
217
+ h.each{|h1| yield h1.dup}
218
+ end
219
+ when Class
220
+ if f < Exception
221
+ raise f
222
+ else
223
+ raise Error, "Invalid @autoid/@numrows attribute: #{v.inspect}"
224
+ end
225
+ when nil
226
+ # nothing
227
+ else
228
+ raise Error, "Invalid @fetch attribute: #{f.inspect}"
229
+ end
230
+ end
231
+
232
+ def _nextres(v, sql, default)
233
+ case v
234
+ when Integer
235
+ v
236
+ when Array
237
+ v.empty? ? default : _nextres(v.shift, sql, default)
238
+ when Proc
239
+ v.call(sql)
240
+ when Class
241
+ if v < Exception
242
+ raise v
243
+ else
244
+ raise Error, "Invalid @autoid/@numrows attribute: #{v.inspect}"
245
+ end
246
+ when nil
247
+ default
248
+ else
249
+ raise Error, "Invalid @autoid/@numrows attribute: #{v.inspect}"
250
+ end
251
+ end
252
+
253
+ def _numrows(sql, v)
254
+ _nextres(v, sql, 0)
255
+ end
256
+
257
+ def columns(ds, sql, cs=@columns)
258
+ case cs
259
+ when Array
260
+ unless cs.empty?
261
+ if cs.all?{|c| c.is_a?(Symbol)}
262
+ ds.columns(*cs)
263
+ else
264
+ columns(ds, sql, cs.shift)
265
+ end
266
+ end
267
+ when Proc
268
+ ds.columns(*cs.call(sql))
269
+ when nil
270
+ # nothing
271
+ else
272
+ raise Error, "Invalid @columns attribute: #{cs.inspect}"
273
+ end
274
+ end
275
+
276
+ def disconnect_connection(c)
277
+ end
278
+
279
+ def log_connection_execute(c, sql)
280
+ c.execute(sql)
281
+ end
282
+
283
+ def quote_identifiers_default
284
+ false
285
+ end
286
+
287
+ def identifier_input_method_default
288
+ nil
289
+ end
290
+
291
+ def identifier_output_method_default
292
+ nil
293
+ end
294
+ end
295
+
296
+ class Dataset < Sequel::Dataset
297
+ Database::DatasetClass = self
298
+
299
+ # Override the databases's autoid setting for this dataset
300
+ attr_accessor :autoid
301
+
302
+ # Override the databases's fetch setting for this dataset
303
+ attr_accessor :_fetch
304
+
305
+ # Override the databases's numrows setting for this dataset
306
+ attr_accessor :numrows
307
+
308
+ # If arguments are provided, use them to set the columns
309
+ # for this dataset and return self. Otherwise, use the
310
+ # default Sequel behavior and return the columns.
311
+ def columns(*cs)
312
+ if cs.empty?
313
+ super
314
+ else
315
+ @columns = cs
316
+ self
317
+ end
318
+ end
319
+
320
+ def fetch_rows(sql, &block)
321
+ execute(sql, &block)
322
+ end
323
+
324
+ private
325
+
326
+ def execute(sql, opts={}, &block)
327
+ super(sql, opts.merge(:dataset=>self), &block)
328
+ end
329
+
330
+ def execute_dui(sql, opts={}, &block)
331
+ super(sql, opts.merge(:dataset=>self), &block)
332
+ end
333
+
334
+ def execute_insert(sql, opts={}, &block)
335
+ super(sql, opts.merge(:dataset=>self), &block)
336
+ end
337
+ end
338
+ end
339
+ end