sequel 4.49.0 → 5.0.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 (477) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +70 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +3 -5
  6. data/doc/advanced_associations.rdoc +86 -163
  7. data/doc/association_basics.rdoc +197 -274
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +66 -43
  10. data/doc/code_order.rdoc +1 -8
  11. data/doc/core_extensions.rdoc +81 -56
  12. data/doc/dataset_basics.rdoc +8 -17
  13. data/doc/dataset_filtering.rdoc +81 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +73 -30
  16. data/doc/migration.rdoc +19 -36
  17. data/doc/model_dataset_method_design.rdoc +14 -17
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +10 -10
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +52 -70
  22. data/doc/opening_databases.rdoc +39 -32
  23. data/doc/postgresql.rdoc +48 -38
  24. data/doc/prepared_statements.rdoc +27 -22
  25. data/doc/querying.rdoc +173 -150
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/schema_modification.rdoc +63 -60
  29. data/doc/security.rdoc +97 -88
  30. data/doc/sharding.rdoc +43 -30
  31. data/doc/sql.rdoc +53 -65
  32. data/doc/testing.rdoc +3 -5
  33. data/doc/thread_safety.rdoc +2 -4
  34. data/doc/transactions.rdoc +18 -17
  35. data/doc/validations.rdoc +48 -45
  36. data/doc/virtual_rows.rdoc +87 -115
  37. data/lib/sequel.rb +1 -1
  38. data/lib/sequel/adapters/ado.rb +9 -25
  39. data/lib/sequel/adapters/ado/access.rb +7 -13
  40. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  41. data/lib/sequel/adapters/amalgalite.rb +3 -18
  42. data/lib/sequel/adapters/ibmdb.rb +9 -45
  43. data/lib/sequel/adapters/jdbc.rb +13 -73
  44. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  45. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  46. data/lib/sequel/adapters/jdbc/h2.rb +4 -25
  47. data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
  48. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  49. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  50. data/lib/sequel/adapters/jdbc/mysql.rb +1 -15
  51. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  52. data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
  53. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  54. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  55. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  56. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  57. data/lib/sequel/adapters/mock.rb +4 -30
  58. data/lib/sequel/adapters/mysql.rb +7 -44
  59. data/lib/sequel/adapters/mysql2.rb +5 -23
  60. data/lib/sequel/adapters/odbc.rb +0 -19
  61. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  62. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  63. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  64. data/lib/sequel/adapters/oracle.rb +7 -13
  65. data/lib/sequel/adapters/postgres.rb +13 -57
  66. data/lib/sequel/adapters/postgresql.rb +1 -1
  67. data/lib/sequel/adapters/shared/access.rb +11 -51
  68. data/lib/sequel/adapters/shared/db2.rb +3 -61
  69. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  70. data/lib/sequel/adapters/shared/mysql.rb +23 -224
  71. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  72. data/lib/sequel/adapters/shared/postgres.rb +44 -259
  73. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  74. data/lib/sequel/adapters/shared/sqlite.rb +12 -101
  75. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  76. data/lib/sequel/adapters/sqlite.rb +2 -19
  77. data/lib/sequel/adapters/tinytds.rb +5 -15
  78. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  79. data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -4
  80. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  81. data/lib/sequel/adapters/utils/replace.rb +0 -5
  82. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  83. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  84. data/lib/sequel/ast_transformer.rb +3 -94
  85. data/lib/sequel/connection_pool.rb +26 -28
  86. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  87. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  88. data/lib/sequel/connection_pool/single.rb +0 -2
  89. data/lib/sequel/connection_pool/threaded.rb +94 -110
  90. data/lib/sequel/core.rb +42 -101
  91. data/lib/sequel/database.rb +12 -2
  92. data/lib/sequel/database/connecting.rb +23 -60
  93. data/lib/sequel/database/dataset.rb +6 -9
  94. data/lib/sequel/database/dataset_defaults.rb +4 -48
  95. data/lib/sequel/database/features.rb +5 -4
  96. data/lib/sequel/database/logging.rb +2 -9
  97. data/lib/sequel/database/misc.rb +23 -55
  98. data/lib/sequel/database/query.rb +8 -13
  99. data/lib/sequel/database/schema_generator.rb +89 -64
  100. data/lib/sequel/database/schema_methods.rb +61 -79
  101. data/lib/sequel/database/transactions.rb +4 -24
  102. data/lib/sequel/dataset.rb +18 -10
  103. data/lib/sequel/dataset/actions.rb +53 -107
  104. data/lib/sequel/dataset/dataset_module.rb +3 -15
  105. data/lib/sequel/dataset/features.rb +30 -30
  106. data/lib/sequel/dataset/graph.rb +40 -49
  107. data/lib/sequel/dataset/misc.rb +12 -37
  108. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  109. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  110. data/lib/sequel/dataset/query.rb +71 -155
  111. data/lib/sequel/dataset/sql.rb +30 -225
  112. data/lib/sequel/deprecated.rb +18 -27
  113. data/lib/sequel/exceptions.rb +1 -17
  114. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  115. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  116. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  117. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  118. data/lib/sequel/extensions/connection_validator.rb +1 -1
  119. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  120. data/lib/sequel/extensions/core_extensions.rb +39 -49
  121. data/lib/sequel/extensions/core_refinements.rb +39 -45
  122. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  123. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  124. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  125. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  126. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  127. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  128. data/lib/sequel/extensions/from_block.rb +1 -35
  129. data/lib/sequel/extensions/graph_each.rb +2 -2
  130. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  131. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  132. data/lib/sequel/extensions/inflector.rb +4 -4
  133. data/lib/sequel/extensions/migration.rb +23 -40
  134. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  135. data/lib/sequel/extensions/null_dataset.rb +2 -8
  136. data/lib/sequel/extensions/pagination.rb +1 -17
  137. data/lib/sequel/extensions/pg_array.rb +20 -189
  138. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  139. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  140. data/lib/sequel/extensions/pg_inet.rb +2 -15
  141. data/lib/sequel/extensions/pg_interval.rb +1 -20
  142. data/lib/sequel/extensions/pg_json.rb +7 -27
  143. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  144. data/lib/sequel/extensions/pg_range.rb +6 -121
  145. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  146. data/lib/sequel/extensions/pg_row.rb +5 -77
  147. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  148. data/lib/sequel/extensions/query.rb +3 -4
  149. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  150. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  151. data/lib/sequel/extensions/select_remove.rb +3 -3
  152. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  153. data/lib/sequel/extensions/sql_comments.rb +2 -2
  154. data/lib/sequel/extensions/string_agg.rb +11 -8
  155. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  156. data/lib/sequel/model.rb +27 -62
  157. data/lib/sequel/model/associations.rb +128 -131
  158. data/lib/sequel/model/base.rb +171 -711
  159. data/lib/sequel/model/default_inflections.rb +1 -1
  160. data/lib/sequel/model/errors.rb +0 -3
  161. data/lib/sequel/model/exceptions.rb +2 -6
  162. data/lib/sequel/model/inflections.rb +1 -26
  163. data/lib/sequel/model/plugins.rb +1 -0
  164. data/lib/sequel/plugins/active_model.rb +2 -5
  165. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  166. data/lib/sequel/plugins/association_pks.rb +14 -28
  167. data/lib/sequel/plugins/association_proxies.rb +6 -7
  168. data/lib/sequel/plugins/auto_validations.rb +4 -4
  169. data/lib/sequel/plugins/before_after_save.rb +0 -43
  170. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  171. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  172. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  173. data/lib/sequel/plugins/caching.rb +5 -5
  174. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  175. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  176. data/lib/sequel/plugins/column_select.rb +2 -2
  177. data/lib/sequel/plugins/composition.rb +15 -24
  178. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  179. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  180. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  181. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  182. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  183. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  184. data/lib/sequel/plugins/finder.rb +16 -10
  185. data/lib/sequel/plugins/force_encoding.rb +1 -7
  186. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  187. data/lib/sequel/plugins/input_transformer.rb +10 -11
  188. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  189. data/lib/sequel/plugins/instance_filters.rb +5 -5
  190. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  191. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  192. data/lib/sequel/plugins/json_serializer.rb +19 -19
  193. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  194. data/lib/sequel/plugins/list.rb +6 -6
  195. data/lib/sequel/plugins/many_through_many.rb +11 -8
  196. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  197. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  198. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  199. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  200. data/lib/sequel/plugins/pg_row.rb +2 -11
  201. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  202. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  203. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  204. data/lib/sequel/plugins/serialization.rb +15 -33
  205. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  206. data/lib/sequel/plugins/sharding.rb +2 -8
  207. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  208. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  209. data/lib/sequel/plugins/static_cache.rb +8 -9
  210. data/lib/sequel/plugins/string_stripper.rb +3 -3
  211. data/lib/sequel/plugins/subclasses.rb +1 -1
  212. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  213. data/lib/sequel/plugins/table_select.rb +2 -2
  214. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  215. data/lib/sequel/plugins/timestamps.rb +6 -7
  216. data/lib/sequel/plugins/touch.rb +4 -8
  217. data/lib/sequel/plugins/tree.rb +3 -3
  218. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  219. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  220. data/lib/sequel/plugins/update_or_create.rb +3 -3
  221. data/lib/sequel/plugins/update_refresh.rb +3 -3
  222. data/lib/sequel/plugins/uuid.rb +7 -11
  223. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  224. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  225. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  226. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  227. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  228. data/lib/sequel/sql.rb +145 -276
  229. data/lib/sequel/timezones.rb +8 -22
  230. data/lib/sequel/version.rb +2 -2
  231. data/spec/adapter_spec.rb +1 -1
  232. data/spec/adapters/db2_spec.rb +2 -103
  233. data/spec/adapters/mssql_spec.rb +89 -68
  234. data/spec/adapters/mysql_spec.rb +101 -480
  235. data/spec/adapters/oracle_spec.rb +1 -9
  236. data/spec/adapters/postgres_spec.rb +312 -565
  237. data/spec/adapters/spec_helper.rb +12 -31
  238. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  239. data/spec/adapters/sqlite_spec.rb +8 -146
  240. data/spec/bin_spec.rb +11 -16
  241. data/spec/core/connection_pool_spec.rb +173 -74
  242. data/spec/core/database_spec.rb +64 -244
  243. data/spec/core/dataset_spec.rb +81 -415
  244. data/spec/core/deprecated_spec.rb +3 -3
  245. data/spec/core/expression_filters_spec.rb +37 -144
  246. data/spec/core/mock_adapter_spec.rb +176 -4
  247. data/spec/core/object_graph_spec.rb +11 -60
  248. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  249. data/spec/core/schema_generator_spec.rb +51 -40
  250. data/spec/core/schema_spec.rb +74 -77
  251. data/spec/core/spec_helper.rb +6 -24
  252. data/spec/core/version_spec.rb +1 -1
  253. data/spec/core_extensions_spec.rb +7 -83
  254. data/spec/core_model_spec.rb +2 -2
  255. data/spec/deprecation_helper.rb +2 -14
  256. data/spec/extensions/accessed_columns_spec.rb +1 -1
  257. data/spec/extensions/active_model_spec.rb +3 -3
  258. data/spec/extensions/after_initialize_spec.rb +1 -1
  259. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  260. data/spec/extensions/association_dependencies_spec.rb +1 -1
  261. data/spec/extensions/association_pks_spec.rb +4 -59
  262. data/spec/extensions/association_proxies_spec.rb +1 -1
  263. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  264. data/spec/extensions/auto_validations_spec.rb +1 -1
  265. data/spec/extensions/blacklist_security_spec.rb +1 -1
  266. data/spec/extensions/blank_spec.rb +1 -1
  267. data/spec/extensions/boolean_readers_spec.rb +1 -1
  268. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  269. data/spec/extensions/caching_spec.rb +1 -1
  270. data/spec/extensions/class_table_inheritance_spec.rb +35 -1086
  271. data/spec/extensions/column_conflicts_spec.rb +1 -1
  272. data/spec/extensions/column_select_spec.rb +4 -4
  273. data/spec/extensions/columns_introspection_spec.rb +1 -1
  274. data/spec/extensions/columns_updated_spec.rb +1 -1
  275. data/spec/extensions/composition_spec.rb +1 -7
  276. data/spec/extensions/connection_expiration_spec.rb +3 -3
  277. data/spec/extensions/connection_validator_spec.rb +3 -3
  278. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  279. data/spec/extensions/constraint_validations_spec.rb +1 -1
  280. data/spec/extensions/core_refinements_spec.rb +1 -3
  281. data/spec/extensions/csv_serializer_spec.rb +4 -9
  282. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  283. data/spec/extensions/dataset_associations_spec.rb +2 -1
  284. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  285. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  286. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  287. data/spec/extensions/defaults_setter_spec.rb +2 -2
  288. data/spec/extensions/delay_add_association_spec.rb +8 -9
  289. data/spec/extensions/dirty_spec.rb +1 -1
  290. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  291. data/spec/extensions/eager_each_spec.rb +2 -2
  292. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  293. data/spec/extensions/error_splitter_spec.rb +1 -1
  294. data/spec/extensions/error_sql_spec.rb +1 -1
  295. data/spec/extensions/eval_inspect_spec.rb +1 -1
  296. data/spec/extensions/finder_spec.rb +1 -1
  297. data/spec/extensions/force_encoding_spec.rb +2 -5
  298. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  299. data/spec/extensions/graph_each_spec.rb +5 -5
  300. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  301. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  302. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  303. data/spec/extensions/inflector_spec.rb +1 -1
  304. data/spec/extensions/input_transformer_spec.rb +7 -2
  305. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  306. data/spec/extensions/instance_filters_spec.rb +1 -1
  307. data/spec/extensions/instance_hooks_spec.rb +1 -95
  308. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  309. data/spec/extensions/json_serializer_spec.rb +1 -1
  310. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  311. data/spec/extensions/list_spec.rb +1 -1
  312. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  313. data/spec/extensions/many_through_many_spec.rb +1 -1
  314. data/spec/extensions/migration_spec.rb +2 -2
  315. data/spec/extensions/modification_detection_spec.rb +1 -1
  316. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  317. data/spec/extensions/named_timezones_spec.rb +3 -3
  318. data/spec/extensions/nested_attributes_spec.rb +1 -29
  319. data/spec/extensions/null_dataset_spec.rb +1 -11
  320. data/spec/extensions/optimistic_locking_spec.rb +1 -1
  321. data/spec/extensions/pagination_spec.rb +1 -1
  322. data/spec/extensions/pg_array_associations_spec.rb +4 -1
  323. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  324. data/spec/extensions/pg_array_spec.rb +3 -48
  325. data/spec/extensions/pg_enum_spec.rb +1 -1
  326. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  327. data/spec/extensions/pg_hstore_spec.rb +23 -32
  328. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_inet_spec.rb +1 -14
  330. data/spec/extensions/pg_interval_spec.rb +3 -13
  331. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  332. data/spec/extensions/pg_json_spec.rb +1 -13
  333. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  334. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_range_spec.rb +3 -88
  336. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  337. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  338. data/spec/extensions/pg_row_spec.rb +1 -44
  339. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  340. data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
  341. data/spec/extensions/prepared_statements_spec.rb +13 -48
  342. data/spec/extensions/pretty_table_spec.rb +1 -1
  343. data/spec/extensions/query_spec.rb +1 -12
  344. data/spec/extensions/rcte_tree_spec.rb +1 -1
  345. data/spec/extensions/round_timestamps_spec.rb +1 -5
  346. data/spec/extensions/s_spec.rb +1 -1
  347. data/spec/extensions/schema_caching_spec.rb +1 -1
  348. data/spec/extensions/schema_dumper_spec.rb +1 -1
  349. data/spec/extensions/select_remove_spec.rb +1 -1
  350. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  351. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  352. data/spec/extensions/serialization_spec.rb +2 -14
  353. data/spec/extensions/server_block_spec.rb +1 -1
  354. data/spec/extensions/server_logging_spec.rb +2 -2
  355. data/spec/extensions/sharding_spec.rb +1 -1
  356. data/spec/extensions/shared_caching_spec.rb +1 -28
  357. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  358. data/spec/extensions/singular_table_names_spec.rb +1 -1
  359. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  360. data/spec/extensions/spec_helper.rb +5 -27
  361. data/spec/extensions/split_array_nil_spec.rb +1 -1
  362. data/spec/extensions/split_values_spec.rb +1 -1
  363. data/spec/extensions/sql_comments_spec.rb +1 -1
  364. data/spec/extensions/sql_expr_spec.rb +1 -1
  365. data/spec/extensions/static_cache_spec.rb +1 -1
  366. data/spec/extensions/string_agg_spec.rb +2 -2
  367. data/spec/extensions/string_date_time_spec.rb +1 -1
  368. data/spec/extensions/string_stripper_spec.rb +1 -1
  369. data/spec/extensions/subclasses_spec.rb +1 -1
  370. data/spec/extensions/subset_conditions_spec.rb +1 -1
  371. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  372. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  373. data/spec/extensions/table_select_spec.rb +4 -4
  374. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  375. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  376. data/spec/extensions/timestamps_spec.rb +3 -3
  377. data/spec/extensions/to_dot_spec.rb +1 -1
  378. data/spec/extensions/touch_spec.rb +1 -1
  379. data/spec/extensions/tree_spec.rb +1 -1
  380. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  381. data/spec/extensions/unlimited_update_spec.rb +1 -1
  382. data/spec/extensions/update_or_create_spec.rb +1 -1
  383. data/spec/extensions/update_primary_key_spec.rb +4 -3
  384. data/spec/extensions/update_refresh_spec.rb +1 -1
  385. data/spec/extensions/uuid_spec.rb +10 -12
  386. data/spec/extensions/validate_associated_spec.rb +1 -1
  387. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  388. data/spec/extensions/validation_contexts_spec.rb +1 -1
  389. data/spec/extensions/validation_helpers_spec.rb +10 -44
  390. data/spec/extensions/whitelist_security_spec.rb +5 -5
  391. data/spec/extensions/xml_serializer_spec.rb +3 -3
  392. data/spec/guards_helper.rb +2 -1
  393. data/spec/integration/associations_test.rb +1 -23
  394. data/spec/integration/database_test.rb +7 -7
  395. data/spec/integration/dataset_test.rb +5 -47
  396. data/spec/integration/eager_loader_test.rb +1 -1
  397. data/spec/integration/migrator_test.rb +1 -1
  398. data/spec/integration/model_test.rb +4 -82
  399. data/spec/integration/plugin_test.rb +6 -22
  400. data/spec/integration/prepared_statement_test.rb +8 -88
  401. data/spec/integration/schema_test.rb +6 -6
  402. data/spec/integration/spec_helper.rb +13 -21
  403. data/spec/integration/timezone_test.rb +5 -5
  404. data/spec/integration/transaction_test.rb +3 -55
  405. data/spec/integration/type_test.rb +9 -9
  406. data/spec/model/association_reflection_spec.rb +24 -9
  407. data/spec/model/associations_spec.rb +124 -303
  408. data/spec/model/base_spec.rb +18 -137
  409. data/spec/model/class_dataset_methods_spec.rb +2 -20
  410. data/spec/model/dataset_methods_spec.rb +1 -20
  411. data/spec/model/eager_loading_spec.rb +17 -11
  412. data/spec/model/hooks_spec.rb +5 -300
  413. data/spec/model/inflector_spec.rb +1 -1
  414. data/spec/model/model_spec.rb +15 -320
  415. data/spec/model/plugins_spec.rb +2 -16
  416. data/spec/model/record_spec.rb +29 -121
  417. data/spec/model/spec_helper.rb +5 -15
  418. data/spec/model/validations_spec.rb +1 -1
  419. data/spec/sequel_warning.rb +1 -12
  420. metadata +8 -64
  421. data/doc/active_record.rdoc +0 -927
  422. data/lib/sequel/adapters/cubrid.rb +0 -160
  423. data/lib/sequel/adapters/do.rb +0 -166
  424. data/lib/sequel/adapters/do/mysql.rb +0 -69
  425. data/lib/sequel/adapters/do/postgres.rb +0 -46
  426. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  427. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  428. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  429. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  430. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  431. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  432. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  433. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  434. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  435. data/lib/sequel/adapters/shared/informix.rb +0 -63
  436. data/lib/sequel/adapters/shared/progress.rb +0 -40
  437. data/lib/sequel/adapters/swift.rb +0 -169
  438. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  439. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  440. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  441. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  442. data/lib/sequel/dataset/mutation.rb +0 -98
  443. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  444. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  445. data/lib/sequel/extensions/filter_having.rb +0 -65
  446. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  447. data/lib/sequel/extensions/meta_def.rb +0 -37
  448. data/lib/sequel/extensions/query_literals.rb +0 -86
  449. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  450. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  451. data/lib/sequel/extensions/set_overrides.rb +0 -82
  452. data/lib/sequel/no_core_ext.rb +0 -4
  453. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  454. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  455. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  456. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  457. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  458. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  459. data/lib/sequel/plugins/schema.rb +0 -84
  460. data/lib/sequel/plugins/scissors.rb +0 -37
  461. data/spec/core/dataset_mutation_spec.rb +0 -253
  462. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  463. data/spec/extensions/before_after_save_spec.rb +0 -40
  464. data/spec/extensions/filter_having_spec.rb +0 -42
  465. data/spec/extensions/from_block_spec.rb +0 -21
  466. data/spec/extensions/hash_aliases_spec.rb +0 -26
  467. data/spec/extensions/identifier_columns_spec.rb +0 -19
  468. data/spec/extensions/meta_def_spec.rb +0 -35
  469. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  470. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  471. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  472. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  473. data/spec/extensions/query_literals_spec.rb +0 -185
  474. data/spec/extensions/schema_spec.rb +0 -123
  475. data/spec/extensions/scissors_spec.rb +0 -27
  476. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  477. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -1,31 +1,23 @@
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'
1
+ require_relative "spec_helper"
2
+ require_relative '../../lib/sequel/connection_pool/sharded_threaded'
3
+
4
+ connection_pool_defaults = {:pool_timeout=>5, :max_connections=>4}
5
+ st_connection_pool_defaults = connection_pool_defaults.merge(:single_threaded=>true)
4
6
 
5
7
  mock_db = lambda do |*a, &b|
6
8
  db = Sequel.mock
7
- (class << db; self end).send(:define_method, :connect){|c| b.arity == 1 ? b.call(c) : b.call} if b
9
+ db.define_singleton_method(:connect){|c| b.arity == 1 ? b.call(c) : b.call} if b
8
10
  if b2 = a.shift
9
- (class << db; self end).send(:define_method, :disconnect_connection){|c| b2.arity == 1 ? b2.call(c) : b2.call}
11
+ db.define_singleton_method(:disconnect_connection){|c| b2.arity == 1 ? b2.call(c) : b2.call}
10
12
  end
11
13
  # Work around JRuby Issue #3854
12
- (class << db; self end).send(:public, :connect, :disconnect_connection)
14
+ db.singleton_class.send(:public, :connect, :disconnect_connection)
13
15
  db
14
16
  end
15
17
 
16
18
  describe "An empty ConnectionPool" do
17
19
  before do
18
- @cpool = Sequel::ConnectionPool.get_pool(mock_db.call, CONNECTION_POOL_DEFAULTS)
19
- end
20
-
21
- deprecated "should support :pool_class option with string" do
22
- begin
23
- c = Class.new(Sequel::ConnectionPool)
24
- Sequel::ConnectionPool::CONNECTION_POOL__MAP[:foo] = c
25
- Sequel::ConnectionPool.get_pool(mock_db.call, :pool_class=>:foo).must_be_instance_of c
26
- ensure
27
- Sequel::ConnectionPool::CONNECTION_POOL__MAP.delete(c)
28
- end
20
+ @cpool = Sequel::ConnectionPool.get_pool(mock_db.call, connection_pool_defaults)
29
21
  end
30
22
 
31
23
  it "should have no available connections" do
@@ -36,21 +28,20 @@ describe "An empty ConnectionPool" do
36
28
  @cpool.allocated.must_equal({})
37
29
  end
38
30
 
39
- deprecated "should have a created_count of zero" do
40
- @cpool.created_count.must_equal 0
41
- end
42
-
43
31
  it "should have a size of zero" do
44
32
  @cpool.size.must_equal 0
45
33
  end
34
+
35
+ it "should raise Error for bad pool class" do
36
+ proc{Sequel::ConnectionPool.get_pool(mock_db.call, :pool_class=>:foo)}.must_raise Sequel::Error
37
+ end
46
38
  end
47
39
 
48
40
  describe "ConnectionPool options" do
49
41
  it "should support string option values" do
50
- cpool = Sequel::ConnectionPool.get_pool(mock_db.call, {:max_connections=>'5', :pool_timeout=>'3', :pool_sleep_time=>'0.01'})
42
+ cpool = Sequel::ConnectionPool.get_pool(mock_db.call, {:max_connections=>'5', :pool_timeout=>'3'})
51
43
  cpool.max_size.must_equal 5
52
44
  cpool.instance_variable_get(:@timeout).must_equal 3
53
- cpool.instance_variable_get(:@sleep_time).must_equal 0.01 unless cpool.class::USE_WAITER
54
45
  end
55
46
 
56
47
  it "should raise an error unless size is positive" do
@@ -65,7 +56,7 @@ describe "A connection pool handling connections" do
65
56
  before do
66
57
  @max_size = 2
67
58
  msp = proc{@max_size=3}
68
- @cpool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| msp.call}){:got_connection}, CONNECTION_POOL_DEFAULTS.merge(:max_connections=>@max_size))
59
+ @cpool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| msp.call}){:got_connection}, connection_pool_defaults.merge(:max_connections=>@max_size))
69
60
  end
70
61
 
71
62
  it "#hold should increment #size" do
@@ -97,19 +88,6 @@ describe "A connection pool handling connections" do
97
88
  @cpool.hold {:block_return}.must_equal :block_return
98
89
  end
99
90
 
100
- if RUBY_VERSION < '1.9.0' and !defined?(RUBY_ENGINE)
101
- it "#hold should remove dead threads from the pool if it reaches its max_size" do
102
- Thread.new{@cpool.hold{Thread.current.exit!}}.join
103
- @cpool.allocated.keys.map{|t| t.alive?}.must_equal [false]
104
-
105
- Thread.new{@cpool.hold{Thread.current.exit!}}.join
106
- @cpool.allocated.keys.map{|t| t.alive?}.must_equal [false, false]
107
-
108
- Thread.new{@cpool.hold{}}.join
109
- @cpool.allocated.must_equal({})
110
- end
111
- end
112
-
113
91
  it "#make_new should not make more than max_size connections" do
114
92
  q = Queue.new
115
93
  50.times{Thread.new{@cpool.hold{q.pop}}}
@@ -139,13 +117,13 @@ end
139
117
 
140
118
  describe "A connection pool handling connection errors" do
141
119
  it "#hold should raise a Sequel::DatabaseConnectionError if an exception is raised by the connection_proc" do
142
- cpool = Sequel::ConnectionPool.get_pool(mock_db.call{raise Interrupt}, CONNECTION_POOL_DEFAULTS)
120
+ cpool = Sequel::ConnectionPool.get_pool(mock_db.call{raise Interrupt}, connection_pool_defaults)
143
121
  proc{cpool.hold{:block_return}}.must_raise(Sequel::DatabaseConnectionError)
144
122
  cpool.size.must_equal 0
145
123
  end
146
124
 
147
125
  it "#hold should raise a Sequel::DatabaseConnectionError if nil is returned by the connection_proc" do
148
- cpool = Sequel::ConnectionPool.get_pool(mock_db.call{nil}, CONNECTION_POOL_DEFAULTS)
126
+ cpool = Sequel::ConnectionPool.get_pool(mock_db.call{nil}, connection_pool_defaults)
149
127
  proc{cpool.hold{:block_return}}.must_raise(Sequel::DatabaseConnectionError)
150
128
  cpool.size.must_equal 0
151
129
  end
@@ -158,7 +136,7 @@ describe "ConnectionPool#hold" do
158
136
  define_method(:initialize){value += 1}
159
137
  define_method(:value){value}
160
138
  end
161
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call{c.new}, CONNECTION_POOL_DEFAULTS)
139
+ @pool = Sequel::ConnectionPool.get_pool(mock_db.call{c.new}, connection_pool_defaults)
162
140
  end
163
141
 
164
142
  it "shoulda use the database's connect method to get new connections" do
@@ -186,7 +164,7 @@ describe "A connection pool with a max size of 1" do
186
164
  before do
187
165
  @invoked_count = 0
188
166
  icp = proc{@invoked_count += 1}
189
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call{icp.call; 'herro'.dup}, CONNECTION_POOL_DEFAULTS.merge(:max_connections=>1))
167
+ @pool = Sequel::ConnectionPool.get_pool(mock_db.call{icp.call; 'herro'.dup}, connection_pool_defaults.merge(:max_connections=>1))
190
168
  end
191
169
 
192
170
  it "should let only one thread access the connection at any time" do
@@ -291,7 +269,7 @@ ThreadedConnectionPoolSpecs = shared_description do
291
269
  end
292
270
 
293
271
  it "should wait until a connection is available if all are checked out" do
294
- pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:max_connections=>1, :pool_timeout=>0.1, :pool_sleep_time=>0))
272
+ pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:max_connections=>1, :pool_timeout=>0.1))
295
273
  q, q1 = Queue.new, Queue.new
296
274
  t = Thread.new do
297
275
  pool.hold do |c|
@@ -312,14 +290,14 @@ ThreadedConnectionPoolSpecs = shared_description do
312
290
  b = []
313
291
  t = Thread.new do
314
292
  pool.hold do |c1|
315
- b << c1
293
+ @m.synchronize{b << c1}
316
294
  q1.push nil
317
295
  q.pop
318
296
  end
319
297
  end
320
298
  pool.hold do |c1|
321
299
  q1.pop
322
- b << c1
300
+ @m.synchronize{b << c1}
323
301
  q.push nil
324
302
  end
325
303
  t.join
@@ -353,7 +331,7 @@ ThreadedConnectionPoolSpecs = shared_description do
353
331
  threads = []
354
332
  q, q1, q2 = Queue.new, Queue.new, Queue.new
355
333
 
356
- 5.times{|i| threads << Thread.new{@pool.hold{|c| q.pop; cc[i] = c; q1.push nil; q2.pop}}; q.push nil; q1.pop}
334
+ 5.times{|i| threads << Thread.new{@pool.hold{|c| q.pop; @m.synchronize{cc[i] = c}; q1.push nil; q2.pop}}; q.push nil; q1.pop}
357
335
  threads.each {|t| t.must_be :alive?}
358
336
  cc.size.must_equal 5
359
337
  @invoked_count.must_equal 5
@@ -371,18 +349,93 @@ ThreadedConnectionPoolSpecs = shared_description do
371
349
  @pool.available_connections.size.must_equal 5
372
350
  @pool.allocated.must_be :empty?
373
351
  end
352
+
353
+ it "should allow simultaneous connections without preconnecting" do
354
+ @pool.disconnect
355
+ b = @icpp
356
+
357
+ t = Time.now
358
+ cc = {}
359
+ threads = []
360
+ results = []
361
+ i = 0
362
+ q, q1, q2, q3, q4 = Queue.new, Queue.new, Queue.new, Queue.new, Queue.new
363
+ m = @m
364
+ @pool.db.define_singleton_method(:connect) do |server|
365
+ q1.pop
366
+ m.synchronize{q3.push(i += 1)}
367
+ q4.pop
368
+ b.call
369
+ end
370
+ 5.times{|i| threads << Thread.new{@pool.hold{|c| m.synchronize{i -= 1; cc[i] = c}; q2.pop; q.push nil}}}
371
+ 5.times{|i| q1.push nil}
372
+ 5.times{|i| results << q3.pop}
373
+ 5.times{|i| q4.push nil}
374
+ 5.times{|i| q2.push nil}
375
+ 5.times{|i| q.pop}
376
+ results.sort.must_equal (1..5).to_a
377
+ threads.each(&:join)
378
+ (Time.now - t).must_be :<, 0.75
379
+
380
+ threads.each{|t| t.wont_be :alive?}
381
+ cc.size.must_equal 5
382
+ @invoked_count.must_equal 5
383
+ @pool.size.must_equal 5
384
+ @pool.available_connections.sort.must_equal (1..5).to_a
385
+ end
374
386
 
375
387
  it "should block threads until a connection becomes available" do
376
388
  cc = {}
377
389
  threads = []
378
390
  q, q1 = Queue.new, Queue.new
379
391
 
380
- 5.times{|i| threads << Thread.new{@pool.hold{|c| cc[i] = c; q1.push nil; q.pop}}}
392
+ 5.times{|i| threads << Thread.new{@pool.hold{|c| @m.synchronize{cc[i] = c}; q1.push nil; q.pop}}}
393
+ 5.times{q1.pop}
394
+ threads.each {|t| t.must_be :alive?}
395
+ @pool.available_connections.must_be :empty?
396
+
397
+ 3.times {|i| threads << Thread.new {@pool.hold {|c| @m.synchronize{cc[i + 5] = c}; q1.push nil}}}
398
+
399
+ threads[5].must_be :alive?
400
+ threads[6].must_be :alive?
401
+ threads[7].must_be :alive?
402
+ cc.size.must_equal 5
403
+ cc[5].must_be_nil
404
+ cc[6].must_be_nil
405
+ cc[7].must_be_nil
406
+
407
+ 5.times{q.push nil}
408
+ 5.times{|i| threads[i].join}
409
+ 3.times{q1.pop}
410
+ 3.times{|i| threads[i+5].join}
411
+
412
+ threads.each {|t| t.wont_be :alive?}
413
+ cc.values.uniq.length.must_equal 5
414
+
415
+ @pool.size.must_equal 5
416
+ @invoked_count.must_equal 5
417
+ @pool.available_connections.size.must_equal 5
418
+ @pool.allocated.must_be :empty?
419
+ end
420
+
421
+ it "should block threads until a connection becomes available, when assign connection returns nil" do
422
+ # Shorten pool timeout, as making assign_connection return nil when there are
423
+ # connections in the pool can make the pool later block until the timeout expires,
424
+ # since then the pool will not be signalled correctly.
425
+ # This spec is only added for coverage purposes, to ensure that fallback code is tested.
426
+ @pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:pool_timeout=>0.25))
427
+
428
+ cc = {}
429
+ threads = []
430
+ q, q1 = Queue.new, Queue.new
431
+
432
+ 5.times{|i| threads << Thread.new{@pool.hold{|c| @m.synchronize{cc[i] = c}; q1.push nil; q.pop}}}
381
433
  5.times{q1.pop}
382
434
  threads.each {|t| t.must_be :alive?}
383
435
  @pool.available_connections.must_be :empty?
384
436
 
385
- 3.times {|i| threads << Thread.new {@pool.hold {|c| cc[i + 5] = c; q1.push nil}}}
437
+ def @pool.assign_connection(*) nil end
438
+ 3.times {|i| threads << Thread.new {@pool.hold {|c| @m.synchronize{cc[i + 5] = c}; q1.push nil}}}
386
439
 
387
440
  threads[5].must_be :alive?
388
441
  threads[6].must_be :alive?
@@ -398,6 +451,7 @@ ThreadedConnectionPoolSpecs = shared_description do
398
451
  3.times{|i| threads[i+5].join}
399
452
 
400
453
  threads.each {|t| t.wont_be :alive?}
454
+ cc.values.uniq.length.must_equal 5
401
455
 
402
456
  @pool.size.must_equal 5
403
457
  @invoked_count.must_equal 5
@@ -405,6 +459,48 @@ ThreadedConnectionPoolSpecs = shared_description do
405
459
  @pool.allocated.must_be :empty?
406
460
  end
407
461
 
462
+ it "should block threads until a connection becomes available, and reconnect on disconnection" do
463
+ cc = {}
464
+ threads = []
465
+ exceptions = []
466
+ q, q1, q2, q3 = Queue.new, Queue.new, Queue.new, Queue.new
467
+ b = @icpp
468
+ @pool.db.define_singleton_method(:connect) do |server|
469
+ b.call
470
+ Object.new
471
+ end
472
+ 5.times{|i| threads << Thread.new{@pool.hold{|c| @m.synchronize{cc[i] = c}; q1.push nil; q.pop; raise Sequel::DatabaseDisconnectError} rescue q2.push($!)}}
473
+ 5.times{q1.pop}
474
+ threads.each {|t| t.must_be :alive?}
475
+ @pool.available_connections.must_be :empty?
476
+
477
+ 3.times {|i| threads << Thread.new {@pool.hold {|c| @m.synchronize{cc[i + 5] = c}; q1.push nil; q3.pop}}}
478
+
479
+ threads[5].must_be :alive?
480
+ threads[6].must_be :alive?
481
+ threads[7].must_be :alive?
482
+ cc.size.must_equal 5
483
+ cc[5].must_be_nil
484
+ cc[6].must_be_nil
485
+ cc[7].must_be_nil
486
+
487
+ 5.times{q.push nil}
488
+ 5.times{|i| threads[i].join}
489
+ 5.times{exceptions << q2.pop}
490
+ 3.times{q1.pop}
491
+ 3.times{q3.push nil}
492
+ 3.times{|i| threads[i+5].join}
493
+
494
+ threads.each {|t| t.wont_be :alive?}
495
+ exceptions.length.must_equal 5
496
+ cc.values.uniq.length.must_equal 8
497
+
498
+ @pool.size.must_equal 3
499
+ @invoked_count.must_equal 8
500
+ @pool.available_connections.size.must_equal 3
501
+ @pool.allocated.must_be :empty?
502
+ end
503
+
408
504
  it "should store connections in a stack if :connection_handling=>:stack" do
409
505
  @pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:connection_handling=>:stack))
410
506
  c2 = nil
@@ -434,7 +530,8 @@ ThreadedConnectionPoolSpecs = shared_description do
434
530
  it "should not store connections if :connection_handling=>:disconnect" do
435
531
  @pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts.merge(:connection_handling=>:disconnect))
436
532
  d = []
437
- meta_def(@pool.db, :disconnect_connection){|c| d << c}
533
+ m = @m
534
+ @pool.db.define_singleton_method(:disconnect_connection){|c| m.synchronize{d << c}}
438
535
  @pool.hold do |cc|
439
536
  cc.must_equal 1
440
537
  Thread.new{@pool.hold{|cc2| _(cc2).must_equal 2}}.join
@@ -456,9 +553,10 @@ end
456
553
 
457
554
  describe "Threaded Unsharded Connection Pool" do
458
555
  before do
556
+ @m = Mutex.new
459
557
  @invoked_count = 0
460
- @icpp = proc{@invoked_count += 1}
461
- @cp_opts = CONNECTION_POOL_DEFAULTS.merge(:max_connections=>5)
558
+ @icpp = proc{@m.synchronize{@invoked_count += 1}}
559
+ @cp_opts = connection_pool_defaults.merge(:max_connections=>5)
462
560
  @pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts)
463
561
  end
464
562
 
@@ -467,9 +565,10 @@ end
467
565
 
468
566
  describe "Threaded Sharded Connection Pool" do
469
567
  before do
568
+ @m = Mutex.new
470
569
  @invoked_count = 0
471
- @icpp = proc{@invoked_count += 1}
472
- @cp_opts = CONNECTION_POOL_DEFAULTS.merge(:max_connections=>5, :servers=>{})
570
+ @icpp = proc{@m.synchronize{@invoked_count += 1}}
571
+ @cp_opts = connection_pool_defaults.merge(:max_connections=>5, :servers=>{})
473
572
  @pool = Sequel::ConnectionPool.get_pool(mock_db.call(&@icpp), @cp_opts)
474
573
  end
475
574
 
@@ -480,7 +579,7 @@ describe "ConnectionPool#disconnect" do
480
579
  before do
481
580
  @count = 0
482
581
  cp = proc{@count += 1}
483
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call{{:id => cp.call}}, CONNECTION_POOL_DEFAULTS.merge(:max_connections=>5, :servers=>{}))
582
+ @pool = Sequel::ConnectionPool.get_pool(mock_db.call{{:id => cp.call}}, connection_pool_defaults.merge(:max_connections=>5, :servers=>{}))
484
583
  threads = []
485
584
  q, q1 = Queue.new, Queue.new
486
585
  5.times {|i| threads << Thread.new {@pool.hold {|c| q1.push nil; q.pop}}}
@@ -494,7 +593,7 @@ describe "ConnectionPool#disconnect" do
494
593
  @pool.available_connections.size.must_equal 5
495
594
  @pool.available_connections.each {|c| c[:id].wont_equal nil}
496
595
  conns = []
497
- meta_def(@pool.db, :disconnect_connection){|c| conns << c}
596
+ @pool.db.define_singleton_method(:disconnect_connection){|c| conns << c}
498
597
  @pool.disconnect
499
598
  conns.size.must_equal 5
500
599
  end
@@ -511,7 +610,7 @@ describe "ConnectionPool#disconnect" do
511
610
  @pool.available_connections.size.must_equal 4
512
611
  @pool.available_connections.each {|c| c.wont_be_same_as(conn)}
513
612
  conns = []
514
- meta_def(@pool.db, :disconnect_connection){|c| conns << c}
613
+ @pool.db.define_singleton_method(:disconnect_connection){|c| conns << c}
515
614
  @pool.disconnect
516
615
  conns.size.must_equal 4
517
616
  @pool.size.must_equal 1
@@ -523,7 +622,7 @@ end
523
622
  describe "A connection pool with multiple servers" do
524
623
  before do
525
624
  ic = @invoked_counts = Hash.new(0)
526
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call{|server| "#{server}#{ic[server] += 1}"}, CONNECTION_POOL_DEFAULTS.merge(:servers=>{:read_only=>{}}))
625
+ @pool = Sequel::ConnectionPool.get_pool(mock_db.call{|server| "#{server}#{ic[server] += 1}"}, connection_pool_defaults.merge(:servers=>{:read_only=>{}}))
527
626
  end
528
627
 
529
628
  it "should support preconnect method that immediately creates the maximum number of connections" do
@@ -579,7 +678,7 @@ describe "A connection pool with multiple servers" do
579
678
 
580
679
  it "should support a :servers_hash option used for converting the server argument" do
581
680
  ic = @invoked_counts
582
- @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=>{}}))
681
+ @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=>{}}))
583
682
  @pool.hold(:blah) do |c1|
584
683
  c1.must_equal "read_only1"
585
684
  @pool.hold(:blah) do |c2|
@@ -590,7 +689,7 @@ describe "A connection pool with multiple servers" do
590
689
  end
591
690
  end
592
691
 
593
- @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=>{}}))
692
+ @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=>{}}))
594
693
  proc{@pool.hold(:blah){|c1|}}.must_raise(Sequel::Error)
595
694
  end
596
695
 
@@ -627,7 +726,7 @@ describe "A connection pool with multiple servers" do
627
726
  conns = []
628
727
  @pool.size.must_equal 1
629
728
  @pool.size(:read_only).must_equal 1
630
- meta_def(@pool.db, :disconnect_connection){|c| conns << c}
729
+ @pool.db.define_singleton_method(:disconnect_connection){|c| conns << c}
631
730
  @pool.disconnect
632
731
  conns.sort.must_equal %w'default1 read_only1'
633
732
  @pool.size.must_equal 0
@@ -776,11 +875,9 @@ describe "A connection pool with multiple servers" do
776
875
  end
777
876
  end
778
877
 
779
- ST_CONNECTION_POOL_DEFAULTS = CONNECTION_POOL_DEFAULTS.merge(:single_threaded=>true)
780
-
781
878
  describe "SingleConnectionPool" do
782
879
  before do
783
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call{1234}, ST_CONNECTION_POOL_DEFAULTS)
880
+ @pool = Sequel::ConnectionPool.get_pool(mock_db.call{1234}, st_connection_pool_defaults)
784
881
  end
785
882
 
786
883
  it "should provide a #hold method" do
@@ -792,7 +889,7 @@ describe "SingleConnectionPool" do
792
889
  it "should provide a #disconnect method" do
793
890
  conn = nil
794
891
  x = nil
795
- pool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| conn = c; c.must_be_kind_of(Integer)}){1234}, ST_CONNECTION_POOL_DEFAULTS)
892
+ pool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| conn = c; c.must_be_kind_of(Integer)}){1234}, st_connection_pool_defaults)
796
893
  pool.hold{|c| x = c}
797
894
  x.must_equal 1234
798
895
  pool.disconnect
@@ -805,7 +902,7 @@ describe "A single threaded pool with multiple servers" do
805
902
  before do
806
903
  @max_size=2
807
904
  msp = proc{@max_size += 1}
808
- @pool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| msp.call}){|c| c}, ST_CONNECTION_POOL_DEFAULTS.merge(:servers=>{:read_only=>{}}))
905
+ @pool = Sequel::ConnectionPool.get_pool(mock_db.call(proc{|c| msp.call}){|c| c}, st_connection_pool_defaults.merge(:servers=>{:read_only=>{}}))
809
906
  end
810
907
 
811
908
  it "should support preconnect method that immediately creates the maximum number of connections" do
@@ -1114,16 +1211,18 @@ AllConnectionPoolClassesSpecs = shared_description do
1114
1211
  end
1115
1212
  end
1116
1213
 
1117
- Sequel::ConnectionPool::CONNECTION_POOL__MAP.keys.each do |k, v|
1118
- opts = {:single_threaded=>k, :servers=>(v ? {} : nil)}
1119
- describe "Connection pool with #{opts.inspect}" do
1120
- before(:all) do
1121
- Sequel::ConnectionPool.send(:get_pool, mock_db.call, opts)
1122
- end
1123
- before do
1124
- @class = Sequel::ConnectionPool.send(:connection_pool_class, opts)
1125
- end
1214
+ [true, false].each do |k|
1215
+ [true, false].each do |v|
1216
+ opts = {:single_threaded=>k, :servers=>(v ? {} : nil)}
1217
+ describe "Connection pool with #{opts.inspect}" do
1218
+ before(:all) do
1219
+ Sequel::ConnectionPool.send(:get_pool, mock_db.call, opts)
1220
+ end
1221
+ before do
1222
+ @class = Sequel::ConnectionPool.send(:connection_pool_class, opts)
1223
+ end
1126
1224
 
1127
- include AllConnectionPoolClassesSpecs
1225
+ include AllConnectionPoolClassesSpecs
1226
+ end
1128
1227
  end
1129
1228
  end