sequel 4.26.0 → 5.37.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 (692) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +405 -5656
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +232 -157
  5. data/bin/sequel +32 -9
  6. data/doc/advanced_associations.rdoc +252 -188
  7. data/doc/association_basics.rdoc +231 -273
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +75 -48
  10. data/doc/code_order.rdoc +28 -10
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +74 -31
  16. data/doc/migration.rdoc +72 -46
  17. data/doc/model_dataset_method_design.rdoc +129 -0
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +12 -12
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +59 -69
  22. data/doc/opening_databases.rdoc +84 -94
  23. data/doc/postgresql.rdoc +268 -38
  24. data/doc/prepared_statements.rdoc +29 -24
  25. data/doc/querying.rdoc +184 -164
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.10.0.txt +84 -0
  30. data/doc/release_notes/5.11.0.txt +83 -0
  31. data/doc/release_notes/5.12.0.txt +141 -0
  32. data/doc/release_notes/5.13.0.txt +27 -0
  33. data/doc/release_notes/5.14.0.txt +63 -0
  34. data/doc/release_notes/5.15.0.txt +39 -0
  35. data/doc/release_notes/5.16.0.txt +110 -0
  36. data/doc/release_notes/5.17.0.txt +31 -0
  37. data/doc/release_notes/5.18.0.txt +69 -0
  38. data/doc/release_notes/5.19.0.txt +28 -0
  39. data/doc/release_notes/5.2.0.txt +33 -0
  40. data/doc/release_notes/5.20.0.txt +89 -0
  41. data/doc/release_notes/5.21.0.txt +87 -0
  42. data/doc/release_notes/5.22.0.txt +48 -0
  43. data/doc/release_notes/5.23.0.txt +56 -0
  44. data/doc/release_notes/5.24.0.txt +56 -0
  45. data/doc/release_notes/5.25.0.txt +32 -0
  46. data/doc/release_notes/5.26.0.txt +35 -0
  47. data/doc/release_notes/5.27.0.txt +21 -0
  48. data/doc/release_notes/5.28.0.txt +16 -0
  49. data/doc/release_notes/5.29.0.txt +22 -0
  50. data/doc/release_notes/5.3.0.txt +121 -0
  51. data/doc/release_notes/5.30.0.txt +20 -0
  52. data/doc/release_notes/5.31.0.txt +148 -0
  53. data/doc/release_notes/5.32.0.txt +46 -0
  54. data/doc/release_notes/5.33.0.txt +24 -0
  55. data/doc/release_notes/5.34.0.txt +40 -0
  56. data/doc/release_notes/5.35.0.txt +56 -0
  57. data/doc/release_notes/5.36.0.txt +60 -0
  58. data/doc/release_notes/5.37.0.txt +30 -0
  59. data/doc/release_notes/5.4.0.txt +80 -0
  60. data/doc/release_notes/5.5.0.txt +61 -0
  61. data/doc/release_notes/5.6.0.txt +31 -0
  62. data/doc/release_notes/5.7.0.txt +108 -0
  63. data/doc/release_notes/5.8.0.txt +170 -0
  64. data/doc/release_notes/5.9.0.txt +99 -0
  65. data/doc/schema_modification.rdoc +102 -77
  66. data/doc/security.rdoc +160 -87
  67. data/doc/sharding.rdoc +74 -47
  68. data/doc/sql.rdoc +135 -122
  69. data/doc/testing.rdoc +34 -18
  70. data/doc/thread_safety.rdoc +2 -4
  71. data/doc/transactions.rdoc +101 -19
  72. data/doc/validations.rdoc +64 -51
  73. data/doc/virtual_rows.rdoc +90 -109
  74. data/lib/sequel.rb +3 -1
  75. data/lib/sequel/adapters/ado.rb +154 -22
  76. data/lib/sequel/adapters/ado/access.rb +21 -21
  77. data/lib/sequel/adapters/ado/mssql.rb +8 -15
  78. data/lib/sequel/adapters/amalgalite.rb +17 -25
  79. data/lib/sequel/adapters/ibmdb.rb +52 -58
  80. data/lib/sequel/adapters/jdbc.rb +149 -127
  81. data/lib/sequel/adapters/jdbc/db2.rb +32 -40
  82. data/lib/sequel/adapters/jdbc/derby.rb +56 -58
  83. data/lib/sequel/adapters/jdbc/h2.rb +40 -30
  84. data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
  85. data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
  86. data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
  87. data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
  88. data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
  89. data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
  90. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
  91. data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
  92. data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
  93. data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
  94. data/lib/sequel/adapters/mock.rb +104 -113
  95. data/lib/sequel/adapters/mysql.rb +42 -61
  96. data/lib/sequel/adapters/mysql2.rb +126 -35
  97. data/lib/sequel/adapters/odbc.rb +21 -28
  98. data/lib/sequel/adapters/odbc/db2.rb +3 -1
  99. data/lib/sequel/adapters/odbc/mssql.rb +11 -15
  100. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  101. data/lib/sequel/adapters/oracle.rb +62 -68
  102. data/lib/sequel/adapters/postgres.rb +257 -311
  103. data/lib/sequel/adapters/postgresql.rb +3 -1
  104. data/lib/sequel/adapters/shared/access.rb +75 -79
  105. data/lib/sequel/adapters/shared/db2.rb +96 -74
  106. data/lib/sequel/adapters/shared/mssql.rb +258 -213
  107. data/lib/sequel/adapters/shared/mysql.rb +284 -216
  108. data/lib/sequel/adapters/shared/oracle.rb +175 -60
  109. data/lib/sequel/adapters/shared/postgres.rb +829 -383
  110. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
  111. data/lib/sequel/adapters/shared/sqlite.rb +382 -159
  112. data/lib/sequel/adapters/sqlanywhere.rb +53 -38
  113. data/lib/sequel/adapters/sqlite.rb +111 -105
  114. data/lib/sequel/adapters/tinytds.rb +38 -46
  115. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
  116. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
  117. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  118. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  119. data/lib/sequel/adapters/utils/replace.rb +3 -4
  120. data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
  121. data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
  122. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  123. data/lib/sequel/ast_transformer.rb +13 -89
  124. data/lib/sequel/connection_pool.rb +54 -26
  125. data/lib/sequel/connection_pool/sharded_single.rb +19 -12
  126. data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
  127. data/lib/sequel/connection_pool/single.rb +21 -12
  128. data/lib/sequel/connection_pool/threaded.rb +137 -119
  129. data/lib/sequel/core.rb +352 -320
  130. data/lib/sequel/database.rb +19 -2
  131. data/lib/sequel/database/connecting.rb +70 -55
  132. data/lib/sequel/database/dataset.rb +15 -5
  133. data/lib/sequel/database/dataset_defaults.rb +20 -102
  134. data/lib/sequel/database/features.rb +20 -4
  135. data/lib/sequel/database/logging.rb +25 -7
  136. data/lib/sequel/database/misc.rb +132 -118
  137. data/lib/sequel/database/query.rb +51 -28
  138. data/lib/sequel/database/schema_generator.rb +188 -75
  139. data/lib/sequel/database/schema_methods.rb +161 -92
  140. data/lib/sequel/database/transactions.rb +260 -58
  141. data/lib/sequel/dataset.rb +28 -12
  142. data/lib/sequel/dataset/actions.rb +354 -170
  143. data/lib/sequel/dataset/dataset_module.rb +46 -0
  144. data/lib/sequel/dataset/features.rb +81 -34
  145. data/lib/sequel/dataset/graph.rb +82 -58
  146. data/lib/sequel/dataset/misc.rb +139 -47
  147. data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
  148. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  149. data/lib/sequel/dataset/query.rb +428 -214
  150. data/lib/sequel/dataset/sql.rb +446 -339
  151. data/lib/sequel/deprecated.rb +14 -2
  152. data/lib/sequel/exceptions.rb +48 -16
  153. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  154. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  155. data/lib/sequel/extensions/_pretty_table.rb +10 -9
  156. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  157. data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
  158. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  159. data/lib/sequel/extensions/blank.rb +2 -0
  160. data/lib/sequel/extensions/caller_logging.rb +79 -0
  161. data/lib/sequel/extensions/columns_introspection.rb +9 -4
  162. data/lib/sequel/extensions/connection_expiration.rb +99 -0
  163. data/lib/sequel/extensions/connection_validator.rb +26 -13
  164. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  165. data/lib/sequel/extensions/constraint_validations.rb +93 -38
  166. data/lib/sequel/extensions/core_extensions.rb +45 -53
  167. data/lib/sequel/extensions/core_refinements.rb +44 -46
  168. data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
  169. data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
  170. data/lib/sequel/extensions/date_arithmetic.rb +42 -16
  171. data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
  172. data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
  173. data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
  174. data/lib/sequel/extensions/error_sql.rb +7 -3
  175. data/lib/sequel/extensions/escaped_like.rb +100 -0
  176. data/lib/sequel/extensions/eval_inspect.rb +14 -15
  177. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  178. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  179. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  180. data/lib/sequel/extensions/from_block.rb +2 -31
  181. data/lib/sequel/extensions/graph_each.rb +19 -6
  182. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  183. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  184. data/lib/sequel/extensions/index_caching.rb +109 -0
  185. data/lib/sequel/extensions/inflector.rb +8 -4
  186. data/lib/sequel/extensions/integer64.rb +32 -0
  187. data/lib/sequel/extensions/looser_typecasting.rb +19 -9
  188. data/lib/sequel/extensions/migration.rb +132 -80
  189. data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
  190. data/lib/sequel/extensions/named_timezones.rb +88 -23
  191. data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
  192. data/lib/sequel/extensions/null_dataset.rb +12 -8
  193. data/lib/sequel/extensions/pagination.rb +35 -28
  194. data/lib/sequel/extensions/pg_array.rb +227 -316
  195. data/lib/sequel/extensions/pg_array_ops.rb +19 -7
  196. data/lib/sequel/extensions/pg_enum.rb +69 -24
  197. data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
  198. data/lib/sequel/extensions/pg_hstore.rb +50 -59
  199. data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
  200. data/lib/sequel/extensions/pg_inet.rb +34 -15
  201. data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
  202. data/lib/sequel/extensions/pg_interval.rb +26 -26
  203. data/lib/sequel/extensions/pg_json.rb +422 -141
  204. data/lib/sequel/extensions/pg_json_ops.rb +248 -9
  205. data/lib/sequel/extensions/pg_loose_count.rb +5 -1
  206. data/lib/sequel/extensions/pg_range.rb +162 -146
  207. data/lib/sequel/extensions/pg_range_ops.rb +10 -5
  208. data/lib/sequel/extensions/pg_row.rb +53 -87
  209. data/lib/sequel/extensions/pg_row_ops.rb +36 -13
  210. data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
  211. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  212. data/lib/sequel/extensions/pretty_table.rb +4 -0
  213. data/lib/sequel/extensions/query.rb +12 -7
  214. data/lib/sequel/extensions/round_timestamps.rb +6 -9
  215. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  216. data/lib/sequel/extensions/s.rb +59 -0
  217. data/lib/sequel/extensions/schema_caching.rb +14 -1
  218. data/lib/sequel/extensions/schema_dumper.rb +83 -55
  219. data/lib/sequel/extensions/select_remove.rb +8 -4
  220. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  221. data/lib/sequel/extensions/server_block.rb +50 -17
  222. data/lib/sequel/extensions/server_logging.rb +61 -0
  223. data/lib/sequel/extensions/split_array_nil.rb +8 -4
  224. data/lib/sequel/extensions/sql_comments.rb +96 -0
  225. data/lib/sequel/extensions/sql_expr.rb +4 -1
  226. data/lib/sequel/extensions/string_agg.rb +181 -0
  227. data/lib/sequel/extensions/string_date_time.rb +2 -0
  228. data/lib/sequel/extensions/symbol_aref.rb +53 -0
  229. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  230. data/lib/sequel/extensions/symbol_as.rb +23 -0
  231. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  232. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  233. data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
  234. data/lib/sequel/extensions/to_dot.rb +15 -5
  235. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  236. data/lib/sequel/model.rb +36 -126
  237. data/lib/sequel/model/associations.rb +850 -257
  238. data/lib/sequel/model/base.rb +652 -764
  239. data/lib/sequel/model/dataset_module.rb +13 -10
  240. data/lib/sequel/model/default_inflections.rb +3 -1
  241. data/lib/sequel/model/errors.rb +3 -3
  242. data/lib/sequel/model/exceptions.rb +12 -12
  243. data/lib/sequel/model/inflections.rb +8 -19
  244. data/lib/sequel/model/plugins.rb +111 -0
  245. data/lib/sequel/plugins/accessed_columns.rb +2 -0
  246. data/lib/sequel/plugins/active_model.rb +32 -7
  247. data/lib/sequel/plugins/after_initialize.rb +3 -1
  248. data/lib/sequel/plugins/association_dependencies.rb +27 -18
  249. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  250. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  251. data/lib/sequel/plugins/association_pks.rb +181 -83
  252. data/lib/sequel/plugins/association_proxies.rb +33 -9
  253. data/lib/sequel/plugins/auto_validations.rb +58 -23
  254. data/lib/sequel/plugins/before_after_save.rb +8 -0
  255. data/lib/sequel/plugins/blacklist_security.rb +23 -12
  256. data/lib/sequel/plugins/boolean_readers.rb +9 -6
  257. data/lib/sequel/plugins/boolean_subsets.rb +64 -0
  258. data/lib/sequel/plugins/caching.rb +27 -16
  259. data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
  260. data/lib/sequel/plugins/column_conflicts.rb +18 -3
  261. data/lib/sequel/plugins/column_select.rb +9 -5
  262. data/lib/sequel/plugins/columns_updated.rb +42 -0
  263. data/lib/sequel/plugins/composition.rb +36 -24
  264. data/lib/sequel/plugins/constraint_validations.rb +37 -16
  265. data/lib/sequel/plugins/csv_serializer.rb +58 -35
  266. data/lib/sequel/plugins/dataset_associations.rb +60 -18
  267. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  268. data/lib/sequel/plugins/defaults_setter.rb +74 -13
  269. data/lib/sequel/plugins/delay_add_association.rb +4 -1
  270. data/lib/sequel/plugins/dirty.rb +65 -24
  271. data/lib/sequel/plugins/eager_each.rb +27 -3
  272. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  273. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  274. data/lib/sequel/plugins/error_splitter.rb +19 -12
  275. data/lib/sequel/plugins/finder.rb +246 -0
  276. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  277. data/lib/sequel/plugins/force_encoding.rb +9 -12
  278. data/lib/sequel/plugins/hook_class_methods.rb +39 -54
  279. data/lib/sequel/plugins/input_transformer.rb +20 -10
  280. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  281. data/lib/sequel/plugins/insert_returning_select.rb +4 -2
  282. data/lib/sequel/plugins/instance_filters.rb +12 -8
  283. data/lib/sequel/plugins/instance_hooks.rb +36 -17
  284. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  285. data/lib/sequel/plugins/inverted_subsets.rb +24 -13
  286. data/lib/sequel/plugins/json_serializer.rb +123 -47
  287. data/lib/sequel/plugins/lazy_attributes.rb +20 -14
  288. data/lib/sequel/plugins/list.rb +40 -26
  289. data/lib/sequel/plugins/many_through_many.rb +28 -12
  290. data/lib/sequel/plugins/modification_detection.rb +17 -5
  291. data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
  292. data/lib/sequel/plugins/nested_attributes.rb +55 -28
  293. data/lib/sequel/plugins/optimistic_locking.rb +5 -3
  294. data/lib/sequel/plugins/pg_array_associations.rb +52 -18
  295. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
  296. data/lib/sequel/plugins/pg_row.rb +7 -51
  297. data/lib/sequel/plugins/prepared_statements.rb +53 -72
  298. data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
  299. data/lib/sequel/plugins/rcte_tree.rb +43 -63
  300. data/lib/sequel/plugins/serialization.rb +37 -44
  301. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
  302. data/lib/sequel/plugins/sharding.rb +17 -10
  303. data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
  304. data/lib/sequel/plugins/singular_table_names.rb +2 -0
  305. data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
  306. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  307. data/lib/sequel/plugins/split_values.rb +13 -6
  308. data/lib/sequel/plugins/static_cache.rb +79 -53
  309. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  310. data/lib/sequel/plugins/string_stripper.rb +5 -3
  311. data/lib/sequel/plugins/subclasses.rb +20 -2
  312. data/lib/sequel/plugins/subset_conditions.rb +48 -0
  313. data/lib/sequel/plugins/table_select.rb +4 -2
  314. data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
  315. data/lib/sequel/plugins/throw_failures.rb +110 -0
  316. data/lib/sequel/plugins/timestamps.rb +22 -8
  317. data/lib/sequel/plugins/touch.rb +21 -8
  318. data/lib/sequel/plugins/tree.rb +57 -30
  319. data/lib/sequel/plugins/typecast_on_load.rb +14 -4
  320. data/lib/sequel/plugins/unlimited_update.rb +3 -7
  321. data/lib/sequel/plugins/update_or_create.rb +6 -4
  322. data/lib/sequel/plugins/update_primary_key.rb +3 -1
  323. data/lib/sequel/plugins/update_refresh.rb +28 -15
  324. data/lib/sequel/plugins/uuid.rb +70 -0
  325. data/lib/sequel/plugins/validate_associated.rb +20 -0
  326. data/lib/sequel/plugins/validation_class_methods.rb +40 -19
  327. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  328. data/lib/sequel/plugins/validation_helpers.rb +49 -31
  329. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  330. data/lib/sequel/plugins/xml_serializer.rb +31 -30
  331. data/lib/sequel/sql.rb +479 -329
  332. data/lib/sequel/timezones.rb +62 -32
  333. data/lib/sequel/version.rb +10 -3
  334. metadata +177 -477
  335. data/Rakefile +0 -165
  336. data/doc/active_record.rdoc +0 -912
  337. data/doc/release_notes/1.0.txt +0 -38
  338. data/doc/release_notes/1.1.txt +0 -143
  339. data/doc/release_notes/1.3.txt +0 -101
  340. data/doc/release_notes/1.4.0.txt +0 -53
  341. data/doc/release_notes/1.5.0.txt +0 -155
  342. data/doc/release_notes/2.0.0.txt +0 -298
  343. data/doc/release_notes/2.1.0.txt +0 -271
  344. data/doc/release_notes/2.10.0.txt +0 -328
  345. data/doc/release_notes/2.11.0.txt +0 -215
  346. data/doc/release_notes/2.12.0.txt +0 -534
  347. data/doc/release_notes/2.2.0.txt +0 -253
  348. data/doc/release_notes/2.3.0.txt +0 -88
  349. data/doc/release_notes/2.4.0.txt +0 -106
  350. data/doc/release_notes/2.5.0.txt +0 -137
  351. data/doc/release_notes/2.6.0.txt +0 -157
  352. data/doc/release_notes/2.7.0.txt +0 -166
  353. data/doc/release_notes/2.8.0.txt +0 -171
  354. data/doc/release_notes/2.9.0.txt +0 -97
  355. data/doc/release_notes/3.0.0.txt +0 -221
  356. data/doc/release_notes/3.1.0.txt +0 -406
  357. data/doc/release_notes/3.10.0.txt +0 -286
  358. data/doc/release_notes/3.11.0.txt +0 -254
  359. data/doc/release_notes/3.12.0.txt +0 -304
  360. data/doc/release_notes/3.13.0.txt +0 -210
  361. data/doc/release_notes/3.14.0.txt +0 -118
  362. data/doc/release_notes/3.15.0.txt +0 -78
  363. data/doc/release_notes/3.16.0.txt +0 -45
  364. data/doc/release_notes/3.17.0.txt +0 -58
  365. data/doc/release_notes/3.18.0.txt +0 -120
  366. data/doc/release_notes/3.19.0.txt +0 -67
  367. data/doc/release_notes/3.2.0.txt +0 -268
  368. data/doc/release_notes/3.20.0.txt +0 -41
  369. data/doc/release_notes/3.21.0.txt +0 -87
  370. data/doc/release_notes/3.22.0.txt +0 -39
  371. data/doc/release_notes/3.23.0.txt +0 -172
  372. data/doc/release_notes/3.24.0.txt +0 -420
  373. data/doc/release_notes/3.25.0.txt +0 -88
  374. data/doc/release_notes/3.26.0.txt +0 -88
  375. data/doc/release_notes/3.27.0.txt +0 -82
  376. data/doc/release_notes/3.28.0.txt +0 -304
  377. data/doc/release_notes/3.29.0.txt +0 -459
  378. data/doc/release_notes/3.3.0.txt +0 -192
  379. data/doc/release_notes/3.30.0.txt +0 -135
  380. data/doc/release_notes/3.31.0.txt +0 -146
  381. data/doc/release_notes/3.32.0.txt +0 -202
  382. data/doc/release_notes/3.33.0.txt +0 -157
  383. data/doc/release_notes/3.34.0.txt +0 -671
  384. data/doc/release_notes/3.35.0.txt +0 -144
  385. data/doc/release_notes/3.36.0.txt +0 -245
  386. data/doc/release_notes/3.37.0.txt +0 -338
  387. data/doc/release_notes/3.38.0.txt +0 -234
  388. data/doc/release_notes/3.39.0.txt +0 -237
  389. data/doc/release_notes/3.4.0.txt +0 -325
  390. data/doc/release_notes/3.40.0.txt +0 -73
  391. data/doc/release_notes/3.41.0.txt +0 -155
  392. data/doc/release_notes/3.42.0.txt +0 -74
  393. data/doc/release_notes/3.43.0.txt +0 -105
  394. data/doc/release_notes/3.44.0.txt +0 -152
  395. data/doc/release_notes/3.45.0.txt +0 -179
  396. data/doc/release_notes/3.46.0.txt +0 -122
  397. data/doc/release_notes/3.47.0.txt +0 -270
  398. data/doc/release_notes/3.48.0.txt +0 -477
  399. data/doc/release_notes/3.5.0.txt +0 -510
  400. data/doc/release_notes/3.6.0.txt +0 -366
  401. data/doc/release_notes/3.7.0.txt +0 -179
  402. data/doc/release_notes/3.8.0.txt +0 -151
  403. data/doc/release_notes/3.9.0.txt +0 -233
  404. data/doc/release_notes/4.0.0.txt +0 -262
  405. data/doc/release_notes/4.1.0.txt +0 -85
  406. data/doc/release_notes/4.10.0.txt +0 -226
  407. data/doc/release_notes/4.11.0.txt +0 -147
  408. data/doc/release_notes/4.12.0.txt +0 -105
  409. data/doc/release_notes/4.13.0.txt +0 -169
  410. data/doc/release_notes/4.14.0.txt +0 -68
  411. data/doc/release_notes/4.15.0.txt +0 -56
  412. data/doc/release_notes/4.16.0.txt +0 -36
  413. data/doc/release_notes/4.17.0.txt +0 -38
  414. data/doc/release_notes/4.18.0.txt +0 -36
  415. data/doc/release_notes/4.19.0.txt +0 -45
  416. data/doc/release_notes/4.2.0.txt +0 -129
  417. data/doc/release_notes/4.20.0.txt +0 -79
  418. data/doc/release_notes/4.21.0.txt +0 -94
  419. data/doc/release_notes/4.22.0.txt +0 -72
  420. data/doc/release_notes/4.23.0.txt +0 -65
  421. data/doc/release_notes/4.24.0.txt +0 -99
  422. data/doc/release_notes/4.25.0.txt +0 -181
  423. data/doc/release_notes/4.26.0.txt +0 -44
  424. data/doc/release_notes/4.3.0.txt +0 -40
  425. data/doc/release_notes/4.4.0.txt +0 -92
  426. data/doc/release_notes/4.5.0.txt +0 -34
  427. data/doc/release_notes/4.6.0.txt +0 -30
  428. data/doc/release_notes/4.7.0.txt +0 -103
  429. data/doc/release_notes/4.8.0.txt +0 -175
  430. data/doc/release_notes/4.9.0.txt +0 -190
  431. data/lib/sequel/adapters/cubrid.rb +0 -142
  432. data/lib/sequel/adapters/do.rb +0 -156
  433. data/lib/sequel/adapters/do/mysql.rb +0 -64
  434. data/lib/sequel/adapters/do/postgres.rb +0 -42
  435. data/lib/sequel/adapters/do/sqlite3.rb +0 -40
  436. data/lib/sequel/adapters/jdbc/as400.rb +0 -82
  437. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
  438. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
  439. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
  440. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
  441. data/lib/sequel/adapters/odbc/progress.rb +0 -8
  442. data/lib/sequel/adapters/shared/cubrid.rb +0 -243
  443. data/lib/sequel/adapters/shared/firebird.rb +0 -245
  444. data/lib/sequel/adapters/shared/informix.rb +0 -52
  445. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
  446. data/lib/sequel/adapters/shared/progress.rb +0 -38
  447. data/lib/sequel/adapters/swift.rb +0 -158
  448. data/lib/sequel/adapters/swift/mysql.rb +0 -47
  449. data/lib/sequel/adapters/swift/postgres.rb +0 -45
  450. data/lib/sequel/adapters/swift/sqlite.rb +0 -47
  451. data/lib/sequel/adapters/utils/pg_types.rb +0 -68
  452. data/lib/sequel/dataset/mutation.rb +0 -109
  453. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
  454. data/lib/sequel/extensions/filter_having.rb +0 -59
  455. data/lib/sequel/extensions/hash_aliases.rb +0 -45
  456. data/lib/sequel/extensions/meta_def.rb +0 -31
  457. data/lib/sequel/extensions/query_literals.rb +0 -80
  458. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
  459. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
  460. data/lib/sequel/extensions/set_overrides.rb +0 -72
  461. data/lib/sequel/no_core_ext.rb +0 -1
  462. data/lib/sequel/plugins/association_autoreloading.rb +0 -7
  463. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
  464. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
  465. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
  466. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
  467. data/lib/sequel/plugins/schema.rb +0 -80
  468. data/lib/sequel/plugins/scissors.rb +0 -33
  469. data/spec/adapters/db2_spec.rb +0 -160
  470. data/spec/adapters/firebird_spec.rb +0 -411
  471. data/spec/adapters/informix_spec.rb +0 -100
  472. data/spec/adapters/mssql_spec.rb +0 -706
  473. data/spec/adapters/mysql_spec.rb +0 -1287
  474. data/spec/adapters/oracle_spec.rb +0 -313
  475. data/spec/adapters/postgres_spec.rb +0 -3725
  476. data/spec/adapters/spec_helper.rb +0 -43
  477. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  478. data/spec/adapters/sqlite_spec.rb +0 -653
  479. data/spec/bin_spec.rb +0 -254
  480. data/spec/core/connection_pool_spec.rb +0 -1016
  481. data/spec/core/database_spec.rb +0 -2531
  482. data/spec/core/dataset_spec.rb +0 -5098
  483. data/spec/core/deprecated_spec.rb +0 -70
  484. data/spec/core/expression_filters_spec.rb +0 -1243
  485. data/spec/core/mock_adapter_spec.rb +0 -462
  486. data/spec/core/object_graph_spec.rb +0 -303
  487. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  488. data/spec/core/schema_generator_spec.rb +0 -179
  489. data/spec/core/schema_spec.rb +0 -1659
  490. data/spec/core/spec_helper.rb +0 -34
  491. data/spec/core/version_spec.rb +0 -7
  492. data/spec/core_extensions_spec.rb +0 -699
  493. data/spec/extensions/accessed_columns_spec.rb +0 -51
  494. data/spec/extensions/active_model_spec.rb +0 -123
  495. data/spec/extensions/after_initialize_spec.rb +0 -24
  496. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  497. data/spec/extensions/association_dependencies_spec.rb +0 -117
  498. data/spec/extensions/association_pks_spec.rb +0 -365
  499. data/spec/extensions/association_proxies_spec.rb +0 -86
  500. data/spec/extensions/auto_validations_spec.rb +0 -192
  501. data/spec/extensions/blacklist_security_spec.rb +0 -88
  502. data/spec/extensions/blank_spec.rb +0 -69
  503. data/spec/extensions/boolean_readers_spec.rb +0 -93
  504. data/spec/extensions/caching_spec.rb +0 -270
  505. data/spec/extensions/class_table_inheritance_spec.rb +0 -420
  506. data/spec/extensions/column_conflicts_spec.rb +0 -60
  507. data/spec/extensions/column_select_spec.rb +0 -108
  508. data/spec/extensions/columns_introspection_spec.rb +0 -91
  509. data/spec/extensions/composition_spec.rb +0 -242
  510. data/spec/extensions/connection_validator_spec.rb +0 -120
  511. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
  512. data/spec/extensions/constraint_validations_spec.rb +0 -325
  513. data/spec/extensions/core_refinements_spec.rb +0 -519
  514. data/spec/extensions/csv_serializer_spec.rb +0 -173
  515. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  516. data/spec/extensions/dataset_associations_spec.rb +0 -311
  517. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  518. data/spec/extensions/date_arithmetic_spec.rb +0 -150
  519. data/spec/extensions/defaults_setter_spec.rb +0 -101
  520. data/spec/extensions/delay_add_association_spec.rb +0 -52
  521. data/spec/extensions/dirty_spec.rb +0 -180
  522. data/spec/extensions/eager_each_spec.rb +0 -42
  523. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  524. data/spec/extensions/error_splitter_spec.rb +0 -18
  525. data/spec/extensions/error_sql_spec.rb +0 -20
  526. data/spec/extensions/eval_inspect_spec.rb +0 -73
  527. data/spec/extensions/filter_having_spec.rb +0 -40
  528. data/spec/extensions/force_encoding_spec.rb +0 -114
  529. data/spec/extensions/from_block_spec.rb +0 -21
  530. data/spec/extensions/graph_each_spec.rb +0 -109
  531. data/spec/extensions/hash_aliases_spec.rb +0 -24
  532. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  533. data/spec/extensions/inflector_spec.rb +0 -183
  534. data/spec/extensions/input_transformer_spec.rb +0 -54
  535. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  536. data/spec/extensions/instance_filters_spec.rb +0 -79
  537. data/spec/extensions/instance_hooks_spec.rb +0 -276
  538. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  539. data/spec/extensions/json_serializer_spec.rb +0 -291
  540. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  541. data/spec/extensions/list_spec.rb +0 -267
  542. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  543. data/spec/extensions/many_through_many_spec.rb +0 -2172
  544. data/spec/extensions/meta_def_spec.rb +0 -21
  545. data/spec/extensions/migration_spec.rb +0 -712
  546. data/spec/extensions/modification_detection_spec.rb +0 -80
  547. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  548. data/spec/extensions/named_timezones_spec.rb +0 -108
  549. data/spec/extensions/nested_attributes_spec.rb +0 -697
  550. data/spec/extensions/null_dataset_spec.rb +0 -85
  551. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  552. data/spec/extensions/pagination_spec.rb +0 -118
  553. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  554. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  555. data/spec/extensions/pg_array_spec.rb +0 -395
  556. data/spec/extensions/pg_enum_spec.rb +0 -92
  557. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  558. data/spec/extensions/pg_hstore_spec.rb +0 -206
  559. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  560. data/spec/extensions/pg_inet_spec.rb +0 -52
  561. data/spec/extensions/pg_interval_spec.rb +0 -76
  562. data/spec/extensions/pg_json_ops_spec.rb +0 -229
  563. data/spec/extensions/pg_json_spec.rb +0 -218
  564. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  565. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  566. data/spec/extensions/pg_range_spec.rb +0 -404
  567. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  568. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  569. data/spec/extensions/pg_row_spec.rb +0 -360
  570. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  571. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  572. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  573. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  574. data/spec/extensions/prepared_statements_spec.rb +0 -103
  575. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  576. data/spec/extensions/pretty_table_spec.rb +0 -92
  577. data/spec/extensions/query_literals_spec.rb +0 -183
  578. data/spec/extensions/query_spec.rb +0 -102
  579. data/spec/extensions/rcte_tree_spec.rb +0 -392
  580. data/spec/extensions/round_timestamps_spec.rb +0 -43
  581. data/spec/extensions/schema_caching_spec.rb +0 -41
  582. data/spec/extensions/schema_dumper_spec.rb +0 -789
  583. data/spec/extensions/schema_spec.rb +0 -117
  584. data/spec/extensions/scissors_spec.rb +0 -26
  585. data/spec/extensions/select_remove_spec.rb +0 -38
  586. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  587. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  588. data/spec/extensions/serialization_spec.rb +0 -362
  589. data/spec/extensions/server_block_spec.rb +0 -90
  590. data/spec/extensions/set_overrides_spec.rb +0 -61
  591. data/spec/extensions/sharding_spec.rb +0 -198
  592. data/spec/extensions/shared_caching_spec.rb +0 -175
  593. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  594. data/spec/extensions/singular_table_names_spec.rb +0 -22
  595. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  596. data/spec/extensions/spec_helper.rb +0 -71
  597. data/spec/extensions/split_array_nil_spec.rb +0 -24
  598. data/spec/extensions/split_values_spec.rb +0 -22
  599. data/spec/extensions/sql_expr_spec.rb +0 -60
  600. data/spec/extensions/static_cache_spec.rb +0 -361
  601. data/spec/extensions/string_date_time_spec.rb +0 -95
  602. data/spec/extensions/string_stripper_spec.rb +0 -68
  603. data/spec/extensions/subclasses_spec.rb +0 -66
  604. data/spec/extensions/table_select_spec.rb +0 -71
  605. data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
  606. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  607. data/spec/extensions/timestamps_spec.rb +0 -175
  608. data/spec/extensions/to_dot_spec.rb +0 -154
  609. data/spec/extensions/touch_spec.rb +0 -203
  610. data/spec/extensions/tree_spec.rb +0 -274
  611. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  612. data/spec/extensions/unlimited_update_spec.rb +0 -20
  613. data/spec/extensions/update_or_create_spec.rb +0 -87
  614. data/spec/extensions/update_primary_key_spec.rb +0 -100
  615. data/spec/extensions/update_refresh_spec.rb +0 -53
  616. data/spec/extensions/validate_associated_spec.rb +0 -52
  617. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  618. data/spec/extensions/validation_helpers_spec.rb +0 -541
  619. data/spec/extensions/xml_serializer_spec.rb +0 -207
  620. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  621. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  622. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  623. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  624. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  625. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  626. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  627. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  628. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  629. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  630. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  631. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  632. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  633. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  634. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  635. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  636. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  637. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  638. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  639. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  640. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  641. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  642. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  643. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  644. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  645. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  646. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  647. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  648. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  649. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  650. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  651. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  652. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  653. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  654. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  655. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  656. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  657. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  658. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  659. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  660. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  661. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  662. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  663. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  664. data/spec/guards_helper.rb +0 -55
  665. data/spec/integration/associations_test.rb +0 -2454
  666. data/spec/integration/database_test.rb +0 -113
  667. data/spec/integration/dataset_test.rb +0 -1808
  668. data/spec/integration/eager_loader_test.rb +0 -687
  669. data/spec/integration/migrator_test.rb +0 -240
  670. data/spec/integration/model_test.rb +0 -226
  671. data/spec/integration/plugin_test.rb +0 -2240
  672. data/spec/integration/prepared_statement_test.rb +0 -467
  673. data/spec/integration/schema_test.rb +0 -817
  674. data/spec/integration/spec_helper.rb +0 -48
  675. data/spec/integration/timezone_test.rb +0 -86
  676. data/spec/integration/transaction_test.rb +0 -374
  677. data/spec/integration/type_test.rb +0 -133
  678. data/spec/model/association_reflection_spec.rb +0 -525
  679. data/spec/model/associations_spec.rb +0 -4426
  680. data/spec/model/base_spec.rb +0 -759
  681. data/spec/model/class_dataset_methods_spec.rb +0 -146
  682. data/spec/model/dataset_methods_spec.rb +0 -149
  683. data/spec/model/eager_loading_spec.rb +0 -2137
  684. data/spec/model/hooks_spec.rb +0 -604
  685. data/spec/model/inflector_spec.rb +0 -26
  686. data/spec/model/model_spec.rb +0 -982
  687. data/spec/model/plugins_spec.rb +0 -299
  688. data/spec/model/record_spec.rb +0 -2147
  689. data/spec/model/spec_helper.rb +0 -46
  690. data/spec/model/validations_spec.rb +0 -193
  691. data/spec/sequel_coverage.rb +0 -15
  692. data/spec/spec_config.rb +0 -10
@@ -1,254 +0,0 @@
1
- require 'rubygems'
2
- require 'rbconfig'
3
- require 'yaml'
4
-
5
- RUBY = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['RUBY_INSTALL_NAME'])
6
- OUTPUT = "spec/bin-sequel-spec-output-#{$$}.log"
7
- TMP_FILE = "spec/bin-sequel-tmp-#{$$}.rb"
8
- BIN_SPEC_DB = "spec/bin-sequel-spec-db-#{$$}.sqlite3"
9
- BIN_SPEC_DB2 = "spec/bin-sequel-spec-db2-#{$$}.sqlite3"
10
-
11
- if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
12
- CONN_PREFIX = 'jdbc:sqlite:'
13
- CONN_HASH = {:adapter=>'jdbc', :uri=>"#{CONN_PREFIX}#{BIN_SPEC_DB}"}
14
- else
15
- CONN_PREFIX = 'sqlite://'
16
- CONN_HASH = {:adapter=>'sqlite', :database=>BIN_SPEC_DB}
17
- end
18
-
19
- unless Object.const_defined?('Sequel') && Sequel.const_defined?('Model')
20
- $:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
21
- require 'sequel'
22
- end
23
-
24
- DB = Sequel.connect("#{CONN_PREFIX}#{BIN_SPEC_DB}")
25
- DB2 = Sequel.connect("#{CONN_PREFIX}#{BIN_SPEC_DB2}")
26
- File.delete(BIN_SPEC_DB) if File.file?(BIN_SPEC_DB)
27
- File.delete(BIN_SPEC_DB2) if File.file?(BIN_SPEC_DB2)
28
-
29
- require 'minitest/autorun'
30
-
31
- describe "bin/sequel" do
32
- def bin(opts={})
33
- cmd = "#{opts[:pre]}\"#{RUBY}\" -I lib bin/sequel #{opts[:args]} #{"#{CONN_PREFIX}#{BIN_SPEC_DB}" unless opts[:no_conn]} #{opts[:post]}> #{OUTPUT}#{" 2>&1" if opts[:stderr]}"
34
- system(cmd)
35
- File.read(OUTPUT)
36
- end
37
-
38
- after do
39
- DB.disconnect
40
- DB2.disconnect
41
- File.delete(BIN_SPEC_DB) if File.file?(BIN_SPEC_DB)
42
- File.delete(BIN_SPEC_DB2) if File.file?(BIN_SPEC_DB2)
43
- File.delete(TMP_FILE) if File.file?(TMP_FILE)
44
- File.delete(OUTPUT) if File.file?(OUTPUT)
45
- end
46
-
47
- it "-h should print the help" do
48
- help = bin(:args=>"-h", :no_conn=>true)
49
- help.must_match(/\ASequel: The Database Toolkit for Ruby/)
50
- help.must_match(/^Usage: sequel /)
51
- end
52
-
53
- it "-c should run code" do
54
- bin(:args=>'-c "print DB.tables.inspect"').must_equal '[]'
55
- DB.create_table(:a){Integer :a}
56
- bin(:args=>'-c "print DB.tables.inspect"').must_equal '[:a]'
57
- bin(:args=>'-v -c "print DB.tables.inspect"').strip.must_equal "sequel #{Sequel.version}\n[:a]"
58
- end
59
-
60
- it "-C should copy databases" do
61
- DB.create_table(:a) do
62
- primary_key :a
63
- String :name
64
- end
65
- DB.create_table(:b) do
66
- foreign_key :a, :a
67
- index :a
68
- end
69
- DB[:a].insert(1, 'foo')
70
- DB[:b].insert(1)
71
- bin(:args=>'-C', :post=>"#{CONN_PREFIX}#{BIN_SPEC_DB2}").must_match Regexp.new(<<END)
72
- Databases connections successful
73
- Migrations dumped successfully
74
- Tables created
75
- Begin copying data
76
- Begin copying records for table: a
77
- Finished copying 1 records for table: a
78
- Begin copying records for table: b
79
- Finished copying 1 records for table: b
80
- Finished copying data
81
- Begin creating indexes
82
- Finished creating indexes
83
- Begin adding foreign key constraints
84
- Finished adding foreign key constraints
85
- Database copy finished in \\d\\.\\d+ seconds
86
- END
87
- DB2.tables.sort_by{|t| t.to_s}.must_equal [:a, :b]
88
- DB[:a].all.must_equal [{:a=>1, :name=>'foo'}]
89
- DB[:b].all.must_equal [{:a=>1}]
90
- DB2.schema(:a).map{|col, sch| [col, *sch.values_at(:allow_null, :default, :primary_key, :db_type, :type, :ruby_default)]}.must_equal [[:a, false, nil, true, "integer", :integer, nil], [:name, true, nil, false, "varchar(255)", :string, nil]]
91
- DB2.schema(:b).map{|col, sch| [col, *sch.values_at(:allow_null, :default, :primary_key, :db_type, :type, :ruby_default)]}.must_equal [[:a, true, nil, false, "integer", :integer, nil]]
92
- DB2.indexes(:a).must_equal({})
93
- DB2.indexes(:b).must_equal(:b_a_index=>{:unique=>false, :columns=>[:a]})
94
- DB2.foreign_key_list(:a).must_equal []
95
- DB2.foreign_key_list(:b).must_equal [{:columns=>[:a], :table=>:a, :key=>nil, :on_update=>:no_action, :on_delete=>:no_action}]
96
- end
97
-
98
- it "-d and -D should dump generic and specific migrations" do
99
- DB.create_table(:a) do
100
- primary_key :a
101
- String :name
102
- end
103
- DB.create_table(:b) do
104
- foreign_key :a, :a
105
- index :a
106
- end
107
- bin(:args=>'-d').must_equal <<END
108
- Sequel.migration do
109
- change do
110
- create_table(:a) do
111
- primary_key :a
112
- String :name, :size=>255
113
- end
114
-
115
- create_table(:b, :ignore_index_errors=>true) do
116
- foreign_key :a, :a
117
-
118
- index [:a]
119
- end
120
- end
121
- end
122
- END
123
- bin(:args=>'-D').must_equal <<END
124
- Sequel.migration do
125
- change do
126
- create_table(:a) do
127
- primary_key :a
128
- column :name, "varchar(255)"
129
- end
130
-
131
- create_table(:b) do
132
- foreign_key :a, :a
133
-
134
- index [:a]
135
- end
136
- end
137
- end
138
- END
139
- end
140
-
141
- it "-E should echo SQL statements to stdout" do
142
- bin(:args=>'-E -c DB.tables').must_match %r{SELECT \* FROM `sqlite_master` WHERE \(type = 'table' AND NOT name = 'sqlite_sequence'\)\n}
143
- end
144
-
145
- it "-I should include directory in load path" do
146
- bin(:args=>'-Ifoo -c "p 1 if $:.include?(\'foo\')"').must_equal "1\n"
147
- end
148
-
149
- it "-l should log SQL statements to file" do
150
- bin(:args=>"-l #{TMP_FILE} -c DB.tables").must_equal ''
151
- File.read(TMP_FILE).must_match %r{SELECT \* FROM `sqlite_master` WHERE \(type = 'table' AND NOT name = 'sqlite_sequence'\)\n}
152
- end
153
-
154
- it "-L should load all *.rb files in given directory" do
155
- bin(:args=>'-L ./lib/sequel/connection_pool -c "p [Sequel::SingleConnectionPool, Sequel::ThreadedConnectionPool, Sequel::ShardedSingleConnectionPool, Sequel::ShardedThreadedConnectionPool].length"').must_equal "4\n"
156
- end
157
-
158
- it "-m should migrate database up" do
159
- bin(:args=>"-m spec/files/integer_migrations").must_equal ''
160
- DB.tables.sort_by{|t| t.to_s}.must_equal [:schema_info, :sm1111, :sm2222, :sm3333]
161
- end
162
-
163
- it "-M should specify version to migrate to" do
164
- bin(:args=>"-m spec/files/integer_migrations -M 2").must_equal ''
165
- DB.tables.sort_by{|t| t.to_s}.must_equal [:schema_info, :sm1111, :sm2222]
166
- end
167
-
168
- it "-N should not test for a valid connection" do
169
- bin(:no_conn=>true, :args=>"-c '' -N #{CONN_PREFIX}spec/nonexistent/foo").must_equal ''
170
- bin(:no_conn=>true, :args=>"-c '' #{CONN_PREFIX}spec/nonexistent/foo", :stderr=>true).must_match(/\AError: Sequel::DatabaseConnectionError: /)
171
- end
172
-
173
- it "-r should require a given library" do
174
- bin(:args=>'-rsequel/extensions/sql_expr -c "print DB.literal(1.sql_expr)"').must_equal "1"
175
- end
176
-
177
- it "-S should dump the schema cache" do
178
- bin(:args=>"-S #{TMP_FILE}").must_equal ''
179
- Marshal.load(File.read(TMP_FILE)).must_equal({})
180
- DB.create_table(:a){Integer :a}
181
- bin(:args=>"-S #{TMP_FILE}").must_equal ''
182
- Marshal.load(File.read(TMP_FILE)).must_equal("`a`"=>[[:a, {:type=>:integer, :db_type=>"integer", :ruby_default=>nil, :allow_null=>true, :default=>nil, :primary_key=>false}]])
183
- end
184
-
185
- it "-t should output full backtraces on error" do
186
- bin(:args=>'-c "lambda{lambda{lambda{raise \'foo\'}.call}.call}.call"', :stderr=>true).count("\n").must_be :<, 3
187
- bin(:args=>'-t -c "lambda{lambda{lambda{raise \'foo\'}.call}.call}.call"', :stderr=>true).count("\n").must_be :>, 3
188
- end
189
-
190
- it "-v should output the Sequel version and exit if database is not given" do
191
- bin(:args=>"-v", :no_conn=>true).strip.must_equal "sequel #{Sequel.version}"
192
- end
193
-
194
- it "should error if using -M without -m" do
195
- bin(:args=>'-M 2', :stderr=>true).must_equal "Error: Must specify -m if using -M\n"
196
- end
197
-
198
- it "should error if using mutually exclusive options together" do
199
- bin(:args=>'-c foo -d', :stderr=>true).must_equal "Error: Cannot specify -c and -d together\n"
200
- bin(:args=>'-D -d', :stderr=>true).must_equal "Error: Cannot specify -D and -d together\n"
201
- bin(:args=>'-m foo -d', :stderr=>true).must_equal "Error: Cannot specify -m and -d together\n"
202
- bin(:args=>'-S foo -d', :stderr=>true).must_equal "Error: Cannot specify -S and -d together\n"
203
- bin(:args=>'-S foo -C', :stderr=>true).must_equal "Error: Cannot specify -S and -C together\n"
204
- end
205
-
206
- it "should use a mock database if no database is given" do
207
- bin(:args=>'-c "print DB.adapter_scheme"', :no_conn=>true).must_equal "mock"
208
- end
209
-
210
- it "should work with a yaml config file" do
211
- File.open(TMP_FILE, 'wb'){|f| f.write(YAML.dump(CONN_HASH))}
212
- bin(:args=>"-c \"print DB.tables.inspect\" #{TMP_FILE}", :no_conn=>true).must_equal "[]"
213
- DB.create_table(:a){Integer :a}
214
- bin(:args=>"-c \"print DB.tables.inspect\" #{TMP_FILE}", :no_conn=>true).must_equal "[:a]"
215
- end
216
-
217
- it "should work with a yaml config file with string keys" do
218
- h = {}
219
- CONN_HASH.each{|k,v| h[k.to_s] = v}
220
- File.open(TMP_FILE, 'wb'){|f| f.write(YAML.dump(h))}
221
- DB.create_table(:a){Integer :a}
222
- bin(:args=>"-c \"print DB.tables.inspect\" #{TMP_FILE}", :no_conn=>true).must_equal "[:a]"
223
- end
224
-
225
- it "should work with a yaml config file with environments" do
226
- File.open(TMP_FILE, 'wb'){|f| f.write(YAML.dump(:development=>CONN_HASH))}
227
- bin(:args=>"-c \"print DB.tables.inspect\" #{TMP_FILE}", :no_conn=>true).must_equal "[]"
228
- DB.create_table(:a){Integer :a}
229
- bin(:args=>"-c \"print DB.tables.inspect\" #{TMP_FILE}", :no_conn=>true).must_equal "[:a]"
230
- end
231
-
232
- it "-e should set environment for yaml config file" do
233
- File.open(TMP_FILE, 'wb'){|f| f.write(YAML.dump(:foo=>CONN_HASH))}
234
- bin(:args=>"-c \"print DB.tables.inspect\" -e foo #{TMP_FILE}", :no_conn=>true).must_equal "[]"
235
- DB.create_table(:a){Integer :a}
236
- bin(:args=>"-c \"print DB.tables.inspect\" -e foo #{TMP_FILE}", :no_conn=>true).must_equal "[:a]"
237
- File.open(TMP_FILE, 'wb'){|f| f.write(YAML.dump('foo'=>CONN_HASH))}
238
- bin(:args=>"-c \"print DB.tables.inspect\" -e foo #{TMP_FILE}", :no_conn=>true).must_equal "[:a]"
239
- end
240
-
241
- it "should run code in given filenames" do
242
- File.open(TMP_FILE, 'wb'){|f| f.write('print DB.tables.inspect')}
243
- bin(:post=>TMP_FILE).must_equal '[]'
244
- DB.create_table(:a){Integer :a}
245
- bin(:post=>TMP_FILE).must_equal '[:a]'
246
- bin(:post=>TMP_FILE, :args=>'-v').strip.must_equal "sequel #{Sequel.version}\n[:a]"
247
- end
248
-
249
- it "should run code provided on stdin" do
250
- bin(:pre=>'echo print DB.tables.inspect | ').must_equal '[]'
251
- DB.create_table(:a){Integer :a}
252
- bin(:pre=>'echo print DB.tables.inspect | ').must_equal '[:a]'
253
- end
254
- end
@@ -1,1016 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
- CONNECTION_POOL_DEFAULTS = {:pool_timeout=>5, :pool_sleep_time=>0.001, :max_connections=>4}
3
-
4
- mock_db = lambda do |*a, &b|
5
- db = Sequel.mock
6
- (class << db; self end).send(:define_method, :connect){|c| b.arity == 1 ? b.call(c) : b.call} if b
7
- if b2 = a.shift
8
- (class << db; self end).send(:define_method, :disconnect_connection){|c| b2.arity == 1 ? b2.call(c) : b2.call}
9
- end
10
- db
11
- end
12
-
13
- describe "An empty ConnectionPool" do
14
- before do
15
- @cpool = Sequel::ConnectionPool.get_pool(mock_db.call, CONNECTION_POOL_DEFAULTS)
16
- end
17
-
18
- it "should have no available connections" do
19
- @cpool.available_connections.must_equal []
20
- end
21
-
22
- it "should have no allocated connections" do
23
- @cpool.allocated.must_equal({})
24
- end
25
-
26
- it "should have a created_count of zero" do
27
- @cpool.created_count.must_equal 0
28
- end
29
- end
30
-
31
- describe "ConnectionPool options" do
32
- it "should support string option values" do
33
- cpool = Sequel::ConnectionPool.get_pool(mock_db.call, {:max_connections=>'5', :pool_timeout=>'3', :pool_sleep_time=>'0.01'})
34
- cpool.max_size.must_equal 5
35
- cpool.instance_variable_get(:@timeout).must_equal 3
36
- cpool.instance_variable_get(:@sleep_time).must_equal 0.01 unless cpool.class::USE_WAITER
37
- end
38
-
39
- it "should raise an error unless size is positive" do
40
- lambda{Sequel::ConnectionPool.get_pool(mock_db.call{1}, :max_connections=>0)}.must_raise(Sequel::Error)
41
- lambda{Sequel::ConnectionPool.get_pool(mock_db.call{1}, :max_connections=>-10)}.must_raise(Sequel::Error)
42
- lambda{Sequel::ConnectionPool.get_pool(mock_db.call{1}, :max_connections=>'-10')}.must_raise(Sequel::Error)
43
- lambda{Sequel::ConnectionPool.get_pool(mock_db.call{1}, :max_connections=>'0')}.must_raise(Sequel::Error)
44
- end
45
- end
46
-
47
- describe "A connection pool handling connections" do
48
- before do
49
- @max_size = 2
50
- msp = proc{@max_size=3}
51
- @cpool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| msp.call}){:got_connection}, CONNECTION_POOL_DEFAULTS.merge(:max_connections=>@max_size))
52
- end
53
-
54
- it "#hold should increment #created_count" do
55
- @cpool.hold do
56
- @cpool.created_count.must_equal 1
57
- @cpool.hold {@cpool.hold {@cpool.created_count.must_equal 1}}
58
- Thread.new{@cpool.hold {_(@cpool.created_count).must_equal 2}}.join
59
- end
60
- end
61
-
62
- it "#hold should add the connection to the #allocated array" do
63
- @cpool.hold do
64
- @cpool.allocated.size.must_equal 1
65
-
66
- @cpool.allocated.must_equal(Thread.current=>:got_connection)
67
- end
68
- end
69
-
70
- it "#hold should yield a new connection" do
71
- @cpool.hold {|conn| conn.must_equal :got_connection}
72
- end
73
-
74
- it "a connection should be de-allocated after it has been used in #hold" do
75
- @cpool.hold {}
76
- @cpool.allocated.size.must_equal 0
77
- end
78
-
79
- it "#hold should return the value of its block" do
80
- @cpool.hold {:block_return}.must_equal :block_return
81
- end
82
-
83
- if RUBY_VERSION < '1.9.0' and !defined?(RUBY_ENGINE)
84
- it "#hold should remove dead threads from the pool if it reaches its max_size" do
85
- Thread.new{@cpool.hold{Thread.current.exit!}}.join
86
- @cpool.allocated.keys.map{|t| t.alive?}.must_equal [false]
87
-
88
- Thread.new{@cpool.hold{Thread.current.exit!}}.join
89
- @cpool.allocated.keys.map{|t| t.alive?}.must_equal [false, false]
90
-
91
- Thread.new{@cpool.hold{}}.join
92
- @cpool.allocated.must_equal({})
93
- end
94
- end
95
-
96
- it "#make_new should not make more than max_size connections" do
97
- q = Queue.new
98
- 50.times{Thread.new{@cpool.hold{q.pop}}}
99
- 50.times{q.push nil}
100
- @cpool.created_count.must_be :<=, @max_size
101
- end
102
-
103
- it "database's disconnect connection method should be called when a disconnect is detected" do
104
- @max_size.must_equal 2
105
- proc{@cpool.hold{raise Sequel::DatabaseDisconnectError}}.must_raise(Sequel::DatabaseDisconnectError)
106
- @max_size.must_equal 3
107
- end
108
-
109
- it "#hold should remove the connection if a DatabaseDisconnectError is raised" do
110
- @cpool.created_count.must_equal 0
111
- q, q1 = Queue.new, Queue.new
112
- @cpool.hold{Thread.new{@cpool.hold{q1.pop; q.push nil}; q1.pop; q.push nil}; q1.push nil; q.pop; q1.push nil; q.pop}
113
- @cpool.created_count.must_equal 2
114
- proc{@cpool.hold{raise Sequel::DatabaseDisconnectError}}.must_raise(Sequel::DatabaseDisconnectError)
115
- @cpool.created_count.must_equal 1
116
- proc{@cpool.hold{raise Sequel::DatabaseDisconnectError}}.must_raise(Sequel::DatabaseDisconnectError)
117
- @cpool.created_count.must_equal 0
118
- proc{@cpool.hold{raise Sequel::DatabaseDisconnectError}}.must_raise(Sequel::DatabaseDisconnectError)
119
- @cpool.created_count.must_equal 0
120
- end
121
- end
122
-
123
- describe "A connection pool handling connection errors" do
124
- it "#hold should raise a Sequel::DatabaseConnectionError if an exception is raised by the connection_proc" do
125
- cpool = Sequel::ConnectionPool.get_pool(CONNECTION_POOL_DEFAULTS){raise Interrupt}
126
- proc{cpool.hold{:block_return}}.must_raise(Sequel::DatabaseConnectionError)
127
- cpool.created_count.must_equal 0
128
- end
129
-
130
- it "#hold should raise a Sequel::DatabaseConnectionError if nil is returned by the connection_proc" do
131
- cpool = Sequel::ConnectionPool.get_pool(CONNECTION_POOL_DEFAULTS){nil}
132
- proc{cpool.hold{:block_return}}.must_raise(Sequel::DatabaseConnectionError)
133
- cpool.created_count.must_equal 0
134
- end
135
- end
136
-
137
- describe "ConnectionPool#hold" do
138
- before do
139
- value = 0
140
- c = @c = Class.new do
141
- define_method(:initialize){value += 1}
142
- define_method(:value){value}
143
- end
144
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call{c.new}, CONNECTION_POOL_DEFAULTS)
145
- end
146
-
147
- it "shoulda use the database's connect method to get new connections" do
148
- res = nil
149
- @pool.hold {|c| res = c}
150
- res.must_be_kind_of(@c)
151
- res.value.must_equal 1
152
- @pool.hold {|c| res = c}
153
- res.must_be_kind_of(@c)
154
- res.value.must_equal 1 # the connection maker is invoked only once
155
- end
156
-
157
- it "should be re-entrant by the same thread" do
158
- cc = nil
159
- @pool.hold {|c| @pool.hold {|c1| @pool.hold {|c2| cc = c2}}}
160
- cc.must_be_kind_of(@c)
161
- end
162
-
163
- it "should catch exceptions and reraise them" do
164
- proc {@pool.hold {|c| c.foobar}}.must_raise(NoMethodError)
165
- end
166
- end
167
-
168
- describe "A connection pool with a max size of 1" do
169
- before do
170
- @invoked_count = 0
171
- icp = proc{@invoked_count += 1}
172
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call{icp.call; 'herro'}, CONNECTION_POOL_DEFAULTS.merge(:max_connections=>1))
173
- end
174
-
175
- it "should let only one thread access the connection at any time" do
176
- cc,c1, c2 = nil
177
- q, q1 = Queue.new, Queue.new
178
-
179
- t1 = Thread.new {@pool.hold {|c| cc = c; c1 = c.dup; q1.push nil; q.pop}}
180
- q1.pop
181
- cc.must_equal 'herro'
182
- c1.must_equal 'herro'
183
-
184
- t2 = Thread.new {@pool.hold {|c| c2 = c.dup; q1.push nil; q.pop;}}
185
-
186
- # connection held by t1
187
- t1.must_be :alive?
188
- t2.must_be :alive?
189
-
190
- cc.must_equal 'herro'
191
- c1.must_equal 'herro'
192
- c2.must_equal nil
193
-
194
- @pool.available_connections.must_be :empty?
195
- @pool.allocated.must_equal(t1=>cc)
196
-
197
- cc.gsub!('rr', 'll')
198
- q.push nil
199
- q1.pop
200
-
201
- t1.join
202
- t2.must_be :alive?
203
-
204
- c2.must_equal 'hello'
205
-
206
- @pool.available_connections.must_be :empty?
207
- @pool.allocated.must_equal(t2=>cc)
208
-
209
- #connection released
210
- q.push nil
211
- t2.join
212
-
213
- @invoked_count.must_equal 1
214
- @pool.size.must_equal 1
215
- @pool.available_connections.must_equal [cc]
216
- @pool.allocated.must_be :empty?
217
- end
218
-
219
- it "should let the same thread reenter #hold" do
220
- c1, c2, c3 = nil
221
- @pool.hold do |c|
222
- c1 = c
223
- @pool.hold do |cc2|
224
- c2 = cc2
225
- @pool.hold do |cc3|
226
- c3 = cc3
227
- end
228
- end
229
- end
230
- c1.must_equal 'herro'
231
- c2.must_equal 'herro'
232
- c3.must_equal 'herro'
233
-
234
- @invoked_count.must_equal 1
235
- @pool.size.must_equal 1
236
- @pool.available_connections.size.must_equal 1
237
- @pool.allocated.must_be :empty?
238
- end
239
- end
240
-
241
- ThreadedConnectionPoolSpecs = shared_description do
242
- it "should not have all_connections yield connections allocated to other threads" do
243
- pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:max_connections=>2, :pool_timeout=>0))
244
- q, q1 = Queue.new, Queue.new
245
- t = Thread.new do
246
- pool.hold do |c1|
247
- q1.push nil
248
- q.pop
249
- end
250
- end
251
- pool.hold do |c1|
252
- q1.pop
253
- pool.all_connections{|c| c.must_equal c1}
254
- q.push nil
255
- end
256
- t.join
257
- end
258
-
259
- it "should wait until a connection is available if all are checked out" do
260
- pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:max_connections=>1, :pool_timeout=>0.1, :pool_sleep_time=>0))
261
- q, q1 = Queue.new, Queue.new
262
- t = Thread.new do
263
- pool.hold do |c|
264
- q1.push nil
265
- 3.times{Thread.pass}
266
- q.pop
267
- end
268
- end
269
- q1.pop
270
- proc{pool.hold{}}.must_raise(Sequel::PoolTimeout)
271
- q.push nil
272
- t.join
273
- end
274
-
275
- it "should not have all_connections yield all available connections" do
276
- pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:max_connections=>2, :pool_timeout=>0))
277
- q, q1 = Queue.new, Queue.new
278
- b = []
279
- t = Thread.new do
280
- pool.hold do |c1|
281
- b << c1
282
- q1.push nil
283
- q.pop
284
- end
285
- end
286
- pool.hold do |c1|
287
- q1.pop
288
- b << c1
289
- q.push nil
290
- end
291
- t.join
292
- a = []
293
- pool.all_connections{|c| a << c}
294
- a.sort.must_equal b.sort
295
- end
296
-
297
- it "should raise a PoolTimeout error if a connection couldn't be acquired before timeout" do
298
- q, q1 = Queue.new, Queue.new
299
- pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:max_connections=>1, :pool_timeout=>0))
300
- t = Thread.new{pool.hold{|c| q1.push nil; q.pop}}
301
- q1.pop
302
- proc{pool.hold{|c|}}.must_raise(Sequel::PoolTimeout)
303
- q.push nil
304
- t.join
305
- end
306
-
307
- it "should not add a disconnected connection back to the pool if the disconnection_proc raises an error" do
308
- pool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| raise Sequel::Error}, &@icpp), @cp_opts.merge(:max_connections=>1, :pool_timeout=>0))
309
- proc{pool.hold{raise Sequel::DatabaseDisconnectError}}.must_raise(Sequel::Error)
310
- pool.available_connections.length.must_equal 0
311
- end
312
-
313
- it "should let five threads simultaneously access separate connections" do
314
- cc = {}
315
- threads = []
316
- q, q1, q2 = Queue.new, Queue.new, Queue.new
317
-
318
- 5.times{|i| threads << Thread.new{@pool.hold{|c| q.pop; cc[i] = c; q1.push nil; q2.pop}}; q.push nil; q1.pop}
319
- threads.each {|t| t.must_be :alive?}
320
- cc.size.must_equal 5
321
- @invoked_count.must_equal 5
322
- @pool.size.must_equal 5
323
- @pool.available_connections.must_be :empty?
324
-
325
- h = {}
326
- i = 0
327
- threads.each{|t| h[t] = (i+=1)}
328
- @pool.allocated.must_equal h
329
- @pool.available_connections.must_equal []
330
- 5.times{q2.push nil}
331
- threads.each{|t| t.join}
332
-
333
- @pool.available_connections.size.must_equal 5
334
- @pool.allocated.must_be :empty?
335
- end
336
-
337
- it "should block threads until a connection becomes available" do
338
- cc = {}
339
- threads = []
340
- q, q1 = Queue.new, Queue.new
341
-
342
- 5.times{|i| threads << Thread.new{@pool.hold{|c| cc[i] = c; q1.push nil; q.pop}}}
343
- 5.times{q1.pop}
344
- threads.each {|t| t.must_be :alive?}
345
- @pool.available_connections.must_be :empty?
346
-
347
- 3.times {|i| threads << Thread.new {@pool.hold {|c| cc[i + 5] = c; q1.push nil}}}
348
-
349
- threads[5].must_be :alive?
350
- threads[6].must_be :alive?
351
- threads[7].must_be :alive?
352
- cc.size.must_equal 5
353
- cc[5].must_equal nil
354
- cc[6].must_equal nil
355
- cc[7].must_equal nil
356
-
357
- 5.times{q.push nil}
358
- 5.times{|i| threads[i].join}
359
- 3.times{q1.pop}
360
- 3.times{|i| threads[i+5].join}
361
-
362
- threads.each {|t| t.wont_be :alive?}
363
-
364
- @pool.size.must_equal 5
365
- @invoked_count.must_equal 5
366
- @pool.available_connections.size.must_equal 5
367
- @pool.allocated.must_be :empty?
368
- end
369
-
370
- it "should store connections in a stack if :connection_handling=>:stack" do
371
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:connection_handling=>:stack))
372
- c2 = nil
373
- c = @pool.hold{|cc| Thread.new{@pool.hold{|cc2| c2 = cc2}}.join; cc}
374
- @pool.size.must_equal 2
375
- @pool.hold{|cc| cc.must_equal c}
376
- @pool.hold{|cc| cc.must_equal c}
377
- @pool.hold do |cc|
378
- cc.must_equal c
379
- Thread.new{@pool.hold{|cc2| cc2.must_equal c2}}
380
- end
381
- end
382
-
383
- it "should store connections in a queue if :connection_handling=>:queue" do
384
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:connection_handling=>:queue))
385
- c2 = nil
386
- c = @pool.hold{|cc| Thread.new{@pool.hold{|cc2| c2 = cc2}}.join; cc}
387
- @pool.size.must_equal 2
388
- @pool.hold{|cc| cc.must_equal c2}
389
- @pool.hold{|cc| cc.must_equal c}
390
- @pool.hold do |cc|
391
- cc.must_equal c2
392
- Thread.new{@pool.hold{|cc2| cc2.must_equal c}}
393
- end
394
- end
395
-
396
- it "should not store connections if :connection_handling=>:disconnect" do
397
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:connection_handling=>:disconnect))
398
- d = []
399
- meta_def(@pool.db, :disconnect_connection){|c| d << c}
400
- @pool.hold do |cc|
401
- cc.must_equal 1
402
- Thread.new{@pool.hold{|cc2| _(cc2).must_equal 2}}.join
403
- d.must_equal [2]
404
- @pool.hold{|cc3| cc3.must_equal 1}
405
- end
406
- @pool.size.must_equal 0
407
- d.must_equal [2, 1]
408
-
409
- @pool.hold{|cc| cc.must_equal 3}
410
- @pool.size.must_equal 0
411
- d.must_equal [2, 1, 3]
412
-
413
- @pool.hold{|cc| cc.must_equal 4}
414
- @pool.size.must_equal 0
415
- d.must_equal [2, 1, 3, 4]
416
- end
417
- end
418
-
419
- describe "Threaded Unsharded Connection Pool" do
420
- before do
421
- @invoked_count = 0
422
- @icpp = proc{@invoked_count += 1}
423
- @cp_opts = CONNECTION_POOL_DEFAULTS.merge(:max_connections=>5)
424
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts)
425
- end
426
-
427
- include ThreadedConnectionPoolSpecs
428
- end
429
-
430
- describe "Threaded Sharded Connection Pool" do
431
- before do
432
- @invoked_count = 0
433
- @icpp = proc{@invoked_count += 1}
434
- @cp_opts = CONNECTION_POOL_DEFAULTS.merge(:max_connections=>5, :servers=>{})
435
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts)
436
- end
437
-
438
- include ThreadedConnectionPoolSpecs
439
- end
440
-
441
- describe "ConnectionPool#disconnect" do
442
- before do
443
- @count = 0
444
- cp = proc{@count += 1}
445
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call{{:id => cp.call}}, CONNECTION_POOL_DEFAULTS.merge(:max_connections=>5, :servers=>{}))
446
- threads = []
447
- q, q1 = Queue.new, Queue.new
448
- 5.times {|i| threads << Thread.new {@pool.hold {|c| q1.push nil; q.pop}}}
449
- 5.times{q1.pop}
450
- 5.times{q.push nil}
451
- threads.each {|t| t.join}
452
- end
453
-
454
- it "should invoke the given block for each available connection" do
455
- @pool.size.must_equal 5
456
- @pool.available_connections.size.must_equal 5
457
- @pool.available_connections.each {|c| c[:id].wont_equal nil}
458
- conns = []
459
- meta_def(@pool.db, :disconnect_connection){|c| conns << c}
460
- @pool.disconnect
461
- conns.size.must_equal 5
462
- end
463
-
464
- it "should remove all available connections" do
465
- @pool.size.must_equal 5
466
- @pool.disconnect
467
- @pool.size.must_equal 0
468
- end
469
-
470
- it "should disconnect connections in use as soon as they are no longer in use" do
471
- @pool.size.must_equal 5
472
- @pool.hold do |conn|
473
- @pool.available_connections.size.must_equal 4
474
- @pool.available_connections.each {|c| c.wont_be_same_as(conn)}
475
- conns = []
476
- meta_def(@pool.db, :disconnect_connection){|c| conns << c}
477
- @pool.disconnect
478
- conns.size.must_equal 4
479
- @pool.size.must_equal 1
480
- end
481
- @pool.size.must_equal 0
482
- end
483
- end
484
-
485
- describe "A connection pool with multiple servers" do
486
- before do
487
- ic = @invoked_counts = Hash.new(0)
488
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call{|server| "#{server}#{ic[server] += 1}"}, CONNECTION_POOL_DEFAULTS.merge(:servers=>{:read_only=>{}}))
489
- end
490
-
491
- it "should support preconnect method that immediately creates the maximum number of connections" do
492
- @pool.send(:preconnect)
493
- i = 0
494
- @pool.all_connections{|c1| i+=1}
495
- i.must_equal @pool.max_size * 2
496
- end
497
-
498
- it "#all_connections should return connections for all servers" do
499
- @pool.hold{}
500
- @pool.all_connections{|c1| c1.must_equal "default1"}
501
- a = []
502
- @pool.hold(:read_only) do |c|
503
- @pool.all_connections{|c1| a << c1}
504
- end
505
- a.sort_by{|c| c.to_s}.must_equal ["default1", "read_only1"]
506
- end
507
-
508
- it "#servers should return symbols for all servers" do
509
- @pool.servers.sort_by{|s| s.to_s}.must_equal [:default, :read_only]
510
- end
511
-
512
- it "should use the :default server by default" do
513
- @pool.size.must_equal 0
514
- @pool.hold do |c|
515
- c.must_equal "default1"
516
- @pool.allocated.must_equal(Thread.current=>"default1")
517
- end
518
- @pool.available_connections.must_equal ["default1"]
519
- @pool.size.must_equal 1
520
- @invoked_counts.must_equal(:default=>1)
521
- end
522
-
523
- it "should use the :default server an invalid server is used" do
524
- @pool.hold do |c1|
525
- c1.must_equal "default1"
526
- @pool.hold(:blah) do |c2|
527
- c2.must_equal c1
528
- @pool.hold(:blah2) do |c3|
529
- c2.must_equal c3
530
- end
531
- end
532
- end
533
- end
534
-
535
- it "should support a :servers_hash option used for converting the server argument" do
536
- ic = @invoked_counts
537
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call{|server| "#{server}#{ic[server] += 1}"}, CONNECTION_POOL_DEFAULTS.merge(:servers_hash=>Hash.new(:read_only), :servers=>{:read_only=>{}}))
538
- @pool.hold(:blah) do |c1|
539
- c1.must_equal "read_only1"
540
- @pool.hold(:blah) do |c2|
541
- c2.must_equal c1
542
- @pool.hold(:blah2) do |c3|
543
- c2.must_equal c3
544
- end
545
- end
546
- end
547
-
548
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call{|server| "#{server}#{ic[server] += 1}"}, CONNECTION_POOL_DEFAULTS.merge(:servers_hash=>Hash.new{|h,k| raise Sequel::Error}, :servers=>{:read_only=>{}}))
549
- proc{@pool.hold(:blah){|c1|}}.must_raise(Sequel::Error)
550
- end
551
-
552
- it "should use the requested server if server is given" do
553
- @pool.size(:read_only).must_equal 0
554
- @pool.hold(:read_only) do |c|
555
- c.must_equal "read_only1"
556
- @pool.allocated(:read_only).must_equal(Thread.current=>"read_only1")
557
- end
558
- @pool.available_connections(:read_only).must_equal ["read_only1"]
559
- @pool.size(:read_only).must_equal 1
560
- @invoked_counts.must_equal(:read_only=>1)
561
- end
562
-
563
- it "#hold should only yield connections for the server requested" do
564
- @pool.hold(:read_only) do |c|
565
- c.must_equal "read_only1"
566
- @pool.allocated(:read_only).must_equal(Thread.current=>"read_only1")
567
- @pool.hold do |d|
568
- d.must_equal "default1"
569
- @pool.hold do |e|
570
- e.must_equal d
571
- @pool.hold(:read_only){|b| b.must_equal c}
572
- end
573
- @pool.allocated.must_equal(Thread.current=>"default1")
574
- end
575
- end
576
- @invoked_counts.must_equal(:read_only=>1, :default=>1)
577
- end
578
-
579
- it "#disconnect should disconnect from all servers" do
580
- @pool.hold(:read_only){}
581
- @pool.hold{}
582
- conns = []
583
- @pool.size.must_equal 1
584
- @pool.size(:read_only).must_equal 1
585
- meta_def(@pool.db, :disconnect_connection){|c| conns << c}
586
- @pool.disconnect
587
- conns.sort.must_equal %w'default1 read_only1'
588
- @pool.size.must_equal 0
589
- @pool.size(:read_only).must_equal 0
590
- @pool.hold(:read_only){|c| c.must_equal 'read_only2'}
591
- @pool.hold{|c| c.must_equal 'default2'}
592
- end
593
-
594
- it "#add_servers should add new servers to the pool" do
595
- pool = Sequel::ConnectionPool.get_pool(mock_db.call{|s| s}, :servers=>{:server1=>{}})
596
-
597
- pool.hold{}
598
- pool.hold(:server2){}
599
- pool.hold(:server3){}
600
- pool.hold(:server1) do
601
- pool.allocated.length.must_equal 0
602
- pool.allocated(:server1).length.must_equal 1
603
- pool.allocated(:server2).must_equal nil
604
- pool.allocated(:server3).must_equal nil
605
- pool.available_connections.length.must_equal 1
606
- pool.available_connections(:server1).length.must_equal 0
607
- pool.available_connections(:server2).must_equal nil
608
- pool.available_connections(:server3).must_equal nil
609
-
610
- pool.add_servers([:server2, :server3])
611
- pool.hold(:server2){}
612
- pool.hold(:server3) do
613
- pool.allocated.length.must_equal 0
614
- pool.allocated(:server1).length.must_equal 1
615
- pool.allocated(:server2).length.must_equal 0
616
- pool.allocated(:server3).length.must_equal 1
617
- pool.available_connections.length.must_equal 1
618
- pool.available_connections(:server1).length.must_equal 0
619
- pool.available_connections(:server2).length.must_equal 1
620
- pool.available_connections(:server3).length.must_equal 0
621
- end
622
- end
623
- end
624
-
625
- it "#add_servers should ignore existing keys" do
626
- pool = Sequel::ConnectionPool.get_pool(mock_db.call{|s| s}, :servers=>{:server1=>{}})
627
-
628
- pool.allocated.length.must_equal 0
629
- pool.allocated(:server1).length.must_equal 0
630
- pool.available_connections.length.must_equal 0
631
- pool.available_connections(:server1).length.must_equal 0
632
- pool.hold do |c1|
633
- c1.must_equal :default
634
- pool.allocated.length.must_equal 1
635
- pool.allocated(:server1).length.must_equal 0
636
- pool.available_connections.length.must_equal 0
637
- pool.available_connections(:server1).length.must_equal 0
638
- pool.hold(:server1) do |c2|
639
- c2.must_equal :server1
640
- pool.allocated.length.must_equal 1
641
- pool.allocated(:server1).length.must_equal 1
642
- pool.available_connections.length.must_equal 0
643
- pool.available_connections(:server1).length.must_equal 0
644
- pool.add_servers([:default, :server1])
645
- pool.allocated.length.must_equal 1
646
- pool.allocated(:server1).length.must_equal 1
647
- pool.available_connections.length.must_equal 0
648
- pool.available_connections(:server1).length.must_equal 0
649
- end
650
- pool.allocated.length.must_equal 1
651
- pool.allocated(:server1).length.must_equal 0
652
- pool.available_connections.length.must_equal 0
653
- pool.available_connections(:server1).length.must_equal 1
654
- pool.add_servers([:default, :server1])
655
- pool.allocated.length.must_equal 1
656
- pool.allocated(:server1).length.must_equal 0
657
- pool.available_connections.length.must_equal 0
658
- pool.available_connections(:server1).length.must_equal 1
659
- end
660
- pool.allocated.length.must_equal 0
661
- pool.allocated(:server1).length.must_equal 0
662
- pool.available_connections.length.must_equal 1
663
- pool.available_connections(:server1).length.must_equal 1
664
- pool.add_servers([:default, :server1])
665
- pool.allocated.length.must_equal 0
666
- pool.allocated(:server1).length.must_equal 0
667
- pool.available_connections.length.must_equal 1
668
- pool.available_connections(:server1).length.must_equal 1
669
- end
670
-
671
- it "#remove_servers should disconnect available connections immediately" do
672
- pool = Sequel::ConnectionPool.get_pool(mock_db.call{|s| s}, :max_connections=>5, :servers=>{:server1=>{}})
673
- threads = []
674
- q, q1 = Queue.new, Queue.new
675
- 5.times {|i| threads << Thread.new {pool.hold(:server1){|c| q1.push nil; q.pop}}}
676
- 5.times{q1.pop}
677
- 5.times{q.push nil}
678
- threads.each {|t| t.join}
679
-
680
- pool.size(:server1).must_equal 5
681
- pool.remove_servers([:server1])
682
- pool.size(:server1).must_equal 0
683
- end
684
-
685
- it "#remove_servers should disconnect connections in use as soon as they are returned to the pool" do
686
- dc = []
687
- pool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| dc << c}){|c| c}, :servers=>{:server1=>{}})
688
- c1 = nil
689
- pool.hold(:server1) do |c|
690
- pool.size(:server1).must_equal 1
691
- dc.must_equal []
692
- pool.remove_servers([:server1])
693
- pool.size(:server1).must_equal 0
694
- dc.must_equal []
695
- c1 = c
696
- end
697
- pool.size(:server1).must_equal 0
698
- dc.must_equal [c1]
699
- end
700
-
701
- it "#remove_servers should remove server related data structures immediately" do
702
- pool = Sequel::ConnectionPool.get_pool(mock_db.call{|s| s}, :servers=>{:server1=>{}})
703
- pool.available_connections(:server1).must_equal []
704
- pool.allocated(:server1).must_equal({})
705
- pool.remove_servers([:server1])
706
- pool.available_connections(:server1).must_equal nil
707
- pool.allocated(:server1).must_equal nil
708
- end
709
-
710
- it "#remove_servers should not allow the removal of the default server" do
711
- pool = Sequel::ConnectionPool.get_pool(mock_db.call{|s| s}, :servers=>{:server1=>{}})
712
- pool.remove_servers([:server1])
713
- proc{pool.remove_servers([:default])}.must_raise(Sequel::Error)
714
- end
715
-
716
- it "#remove_servers should ignore servers that have already been removed" do
717
- dc = []
718
- pool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| dc << c}){|c| c}, :servers=>{:server1=>{}})
719
- c1 = nil
720
- pool.hold(:server1) do |c|
721
- pool.size(:server1).must_equal 1
722
- dc.must_equal []
723
- pool.remove_servers([:server1])
724
- pool.remove_servers([:server1])
725
- pool.size(:server1).must_equal 0
726
- dc.must_equal []
727
- c1 = c
728
- end
729
- pool.size(:server1).must_equal 0
730
- dc.must_equal [c1]
731
- end
732
- end
733
-
734
- ST_CONNECTION_POOL_DEFAULTS = CONNECTION_POOL_DEFAULTS.merge(:single_threaded=>true)
735
-
736
- describe "SingleConnectionPool" do
737
- before do
738
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call{1234}, ST_CONNECTION_POOL_DEFAULTS)
739
- end
740
-
741
- it "should provide a #hold method" do
742
- conn = nil
743
- @pool.hold{|c| conn = c}
744
- conn.must_equal 1234
745
- end
746
-
747
- it "should provide a #disconnect method" do
748
- conn = nil
749
- x = nil
750
- pool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| conn = c}){1234}, ST_CONNECTION_POOL_DEFAULTS)
751
- pool.hold{|c| x = c}
752
- x.must_equal 1234
753
- pool.disconnect
754
- conn.must_equal 1234
755
- end
756
- end
757
-
758
- describe "A single threaded pool with multiple servers" do
759
- before do
760
- @max_size=2
761
- msp = proc{@max_size += 1}
762
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| msp.call}){|c| c}, ST_CONNECTION_POOL_DEFAULTS.merge(:servers=>{:read_only=>{}}))
763
- end
764
-
765
- it "should support preconnect method that immediately creates the maximum number of connections" do
766
- @pool.send(:preconnect)
767
- i = 0
768
- @pool.all_connections{|c1| i+=1}
769
- i.must_equal 2
770
- end
771
-
772
- it "#all_connections should return connections for all servers" do
773
- @pool.hold{}
774
- @pool.all_connections{|c1| c1.must_equal :default}
775
- a = []
776
- @pool.hold(:read_only) do
777
- @pool.all_connections{|c1| a << c1}
778
- end
779
- a.sort_by{|c| c.to_s}.must_equal [:default, :read_only]
780
- end
781
-
782
- it "#servers should return symbols for all servers" do
783
- @pool.servers.sort_by{|s| s.to_s}.must_equal [:default, :read_only]
784
- end
785
-
786
- it "#add_servers should add new servers to the pool" do
787
- @pool.hold(:blah){|c| c.must_equal :default}
788
- @pool.add_servers([:blah])
789
- @pool.hold(:blah){|c| c.must_equal :blah}
790
- end
791
-
792
- it "#add_servers should ignore keys already existing" do
793
- @pool.hold{|c| c.must_equal :default}
794
- @pool.hold(:read_only){|c| c.must_equal :read_only}
795
- @pool.add_servers([:default, :read_only])
796
- @pool.conn.must_equal :default
797
- @pool.conn(:read_only).must_equal :read_only
798
- end
799
-
800
- it "#remove_servers should remove servers from the pool" do
801
- @pool.hold(:read_only){|c| c.must_equal :read_only}
802
- @pool.remove_servers([:read_only])
803
- @pool.hold(:read_only){|c| c.must_equal :default}
804
- end
805
-
806
- it "#remove_servers should not allow the removal of the default server" do
807
- proc{@pool.remove_servers([:default])}.must_raise(Sequel::Error)
808
- end
809
-
810
- it "#remove_servers should disconnect connection immediately" do
811
- @pool.hold(:read_only){|c| c.must_equal :read_only}
812
- @pool.conn(:read_only).must_equal :read_only
813
- @pool.remove_servers([:read_only])
814
- @pool.conn(:read_only).must_equal nil
815
- @pool.hold{}
816
- @pool.conn(:read_only).must_equal :default
817
- end
818
-
819
- it "#remove_servers should ignore keys that do not exist" do
820
- @pool.remove_servers([:blah])
821
- end
822
-
823
- it "should use the :default server by default" do
824
- @pool.hold{|c| c.must_equal :default}
825
- @pool.conn.must_equal :default
826
- end
827
-
828
- it "should use the :default server an invalid server is used" do
829
- @pool.hold do |c1|
830
- c1.must_equal :default
831
- @pool.hold(:blah) do |c2|
832
- c2.must_equal c1
833
- @pool.hold(:blah2) do |c3|
834
- c2.must_equal c3
835
- end
836
- end
837
- end
838
- end
839
-
840
- it "should use the requested server if server is given" do
841
- @pool.hold(:read_only){|c| c.must_equal :read_only}
842
- @pool.conn(:read_only).must_equal :read_only
843
- end
844
-
845
- it "#hold should only yield connections for the server requested" do
846
- @pool.hold(:read_only) do |c|
847
- c.must_equal :read_only
848
- @pool.hold do |d|
849
- d.must_equal :default
850
- @pool.hold do |e|
851
- e.must_equal d
852
- @pool.hold(:read_only){|b| b.must_equal c}
853
- end
854
- end
855
- end
856
- @pool.conn.must_equal :default
857
- @pool.conn(:read_only).must_equal :read_only
858
- end
859
-
860
- it "#disconnect should disconnect from all servers" do
861
- @pool.hold(:read_only){}
862
- @pool.hold{}
863
- @pool.conn.must_equal :default
864
- @pool.conn(:read_only).must_equal :read_only
865
- @pool.disconnect
866
- @max_size.must_equal 4
867
- @pool.conn.must_equal nil
868
- @pool.conn(:read_only).must_equal nil
869
- end
870
-
871
- it ":disconnection_proc option should set the disconnection proc to use" do
872
- @max_size.must_equal 2
873
- proc{@pool.hold{raise Sequel::DatabaseDisconnectError}}.must_raise(Sequel::DatabaseDisconnectError)
874
- @max_size.must_equal 3
875
- end
876
-
877
- it "#hold should remove the connection if a DatabaseDisconnectError is raised" do
878
- @pool.instance_variable_get(:@conns).length.must_equal 0
879
- @pool.hold{}
880
- @pool.instance_variable_get(:@conns).length.must_equal 1
881
- proc{@pool.hold{raise Sequel::DatabaseDisconnectError}}.must_raise(Sequel::DatabaseDisconnectError)
882
- @pool.instance_variable_get(:@conns).length.must_equal 0
883
- end
884
- end
885
-
886
- AllConnectionPoolClassesSpecs = shared_description do
887
- it "should have pool_type return a symbol" do
888
- @class.new(mock_db.call{123}, {}).pool_type.must_be_kind_of(Symbol)
889
- end
890
-
891
- it "should have all_connections yield current and available connections" do
892
- p = @class.new(mock_db.call{123}, {})
893
- p.hold{|c| p.all_connections{|c1| c.must_equal c1}}
894
- end
895
-
896
- it "should have a size method that gives the current size of the pool" do
897
- p = @class.new(mock_db.call{123}, {})
898
- p.size.must_equal 0
899
- p.hold{}
900
- p.size.must_equal 1
901
- end
902
-
903
- it "should have a max_size method that gives the maximum size of the pool" do
904
- @class.new(mock_db.call{123}, {}).max_size.must_be :>=, 1
905
- end
906
-
907
- it "should support preconnect method that immediately creates the maximum number of connections" do
908
- p = @class.new(mock_db.call{123}, {})
909
- p.send(:preconnect)
910
- i = 0
911
- p.all_connections{|c1| i+=1}
912
- i.must_equal p.max_size
913
- end
914
-
915
- it "should be able to modify after_connect proc after the pool is created" do
916
- a = []
917
- p = @class.new(mock_db.call{123}, {})
918
- p.after_connect = pr = proc{|c| a << c}
919
- p.after_connect.must_equal pr
920
- a.must_equal []
921
- p.hold{}
922
- a.must_equal [123]
923
- end
924
-
925
- it "should not raise an error when disconnecting twice" do
926
- c = @class.new(mock_db.call{123}, {})
927
- c.disconnect
928
- c.disconnect
929
- end
930
-
931
- it "should yield a connection created by the initialize block to hold" do
932
- x = nil
933
- @class.new(mock_db.call{123}, {}).hold{|c| x = c}
934
- x.must_equal 123
935
- end
936
-
937
- it "should have the initialize block accept a shard/server argument" do
938
- x = nil
939
- @class.new(mock_db.call{|c| [c, c]}, {}).hold{|c| x = c}
940
- x.must_equal [:default, :default]
941
- end
942
-
943
- it "should have respect an :after_connect proc that is called with each newly created connection" do
944
- x = nil
945
- @class.new(mock_db.call{123}, :after_connect=>proc{|c| x = [c, c]}).hold{}
946
- x.must_equal [123, 123]
947
- @class.new(mock_db.call{123}, :after_connect=>lambda{|c| x = [c, c]}).hold{}
948
- x.must_equal [123, 123]
949
- @class.new(mock_db.call{123}, :after_connect=>proc{|c, s| x = [c, s]}).hold{}
950
- x.must_equal [123, :default]
951
- @class.new(mock_db.call{123}, :after_connect=>lambda{|c, s| x = [c, s]}).hold{}
952
- x.must_equal [123, :default]
953
- end
954
-
955
- it "should raise a DatabaseConnectionError if the connection raises an exception" do
956
- proc{@class.new(mock_db.call{|c| raise Exception}, {}).hold{}}.must_raise(Sequel::DatabaseConnectionError)
957
- end
958
-
959
- it "should raise a DatabaseConnectionError if the initialize block returns nil" do
960
- proc{@class.new(mock_db.call{}, {}).hold{}}.must_raise(Sequel::DatabaseConnectionError)
961
- end
962
-
963
- it "should call the disconnection_proc option if the hold block raises a DatabaseDisconnectError" do
964
- x = nil
965
- proc{@class.new(mock_db.call(proc{|c| x = c}){123}).hold{raise Sequel::DatabaseDisconnectError}}.must_raise(Sequel::DatabaseDisconnectError)
966
- x.must_equal 123
967
- end
968
-
969
- it "should have a disconnect method that disconnects the connection" do
970
- x = nil
971
- c = @class.new(mock_db.call(proc{|c1| x = c1}){123})
972
- c.hold{}
973
- x.must_equal nil
974
- c.disconnect
975
- x.must_equal 123
976
- end
977
-
978
- it "should have a reentrent hold method" do
979
- o = Object.new
980
- c = @class.new(mock_db.call{o}, {})
981
- c.hold do |x|
982
- x.must_equal o
983
- c.hold do |x1|
984
- x1.must_equal o
985
- c.hold do |x2|
986
- x2.must_equal o
987
- end
988
- end
989
- end
990
- end
991
-
992
- it "should have a servers method that returns an array of shard/server symbols" do
993
- @class.new(mock_db.call{123}, {}).servers.must_equal [:default]
994
- end
995
-
996
- it "should have a servers method that returns an array of shard/server symbols" do
997
- c = @class.new(mock_db.call{123}, {})
998
- c.size.must_equal 0
999
- c.hold{}
1000
- c.size.must_equal 1
1001
- end
1002
- end
1003
-
1004
- Sequel::ConnectionPool::CONNECTION_POOL_MAP.keys.each do |k, v|
1005
- opts = {:single_threaded=>k, :servers=>(v ? {} : nil)}
1006
- describe "Connection pool with #{opts.inspect}" do
1007
- before(:all) do
1008
- Sequel::ConnectionPool.send(:get_pool, mock_db.call, opts)
1009
- end
1010
- before do
1011
- @class = Sequel::ConnectionPool.send(:connection_pool_class, opts)
1012
- end
1013
-
1014
- include AllConnectionPoolClassesSpecs
1015
- end
1016
- end