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