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