sequel 4.49.0 → 5.3.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 (484) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +130 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +6 -9
  6. data/doc/advanced_associations.rdoc +91 -168
  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/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.2.0.txt +33 -0
  30. data/doc/release_notes/5.3.0.txt +121 -0
  31. data/doc/schema_modification.rdoc +78 -64
  32. data/doc/security.rdoc +97 -88
  33. data/doc/sharding.rdoc +43 -30
  34. data/doc/sql.rdoc +53 -65
  35. data/doc/testing.rdoc +4 -5
  36. data/doc/thread_safety.rdoc +2 -4
  37. data/doc/transactions.rdoc +18 -17
  38. data/doc/validations.rdoc +48 -45
  39. data/doc/virtual_rows.rdoc +87 -115
  40. data/lib/sequel/adapters/ado/access.rb +7 -13
  41. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  42. data/lib/sequel/adapters/ado.rb +9 -25
  43. data/lib/sequel/adapters/amalgalite.rb +3 -18
  44. data/lib/sequel/adapters/ibmdb.rb +9 -45
  45. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  46. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  47. data/lib/sequel/adapters/jdbc/h2.rb +6 -26
  48. data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
  49. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  50. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  51. data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
  52. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  53. data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
  54. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  55. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  56. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  57. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  58. data/lib/sequel/adapters/jdbc.rb +18 -74
  59. data/lib/sequel/adapters/mock.rb +4 -30
  60. data/lib/sequel/adapters/mysql.rb +7 -44
  61. data/lib/sequel/adapters/mysql2.rb +5 -23
  62. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  63. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  64. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  65. data/lib/sequel/adapters/odbc.rb +0 -19
  66. data/lib/sequel/adapters/oracle.rb +8 -13
  67. data/lib/sequel/adapters/postgres.rb +28 -150
  68. data/lib/sequel/adapters/postgresql.rb +1 -1
  69. data/lib/sequel/adapters/shared/access.rb +11 -51
  70. data/lib/sequel/adapters/shared/db2.rb +3 -61
  71. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  72. data/lib/sequel/adapters/shared/mysql.rb +61 -227
  73. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  74. data/lib/sequel/adapters/shared/postgres.rb +58 -264
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  76. data/lib/sequel/adapters/shared/sqlite.rb +22 -101
  77. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  78. data/lib/sequel/adapters/sqlite.rb +2 -19
  79. data/lib/sequel/adapters/tinytds.rb +5 -15
  80. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
  82. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  83. data/lib/sequel/adapters/utils/replace.rb +0 -5
  84. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  85. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  86. data/lib/sequel/ast_transformer.rb +3 -94
  87. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  88. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  89. data/lib/sequel/connection_pool/single.rb +0 -2
  90. data/lib/sequel/connection_pool/threaded.rb +94 -110
  91. data/lib/sequel/connection_pool.rb +38 -28
  92. data/lib/sequel/core.rb +42 -101
  93. data/lib/sequel/database/connecting.rb +23 -60
  94. data/lib/sequel/database/dataset.rb +6 -9
  95. data/lib/sequel/database/dataset_defaults.rb +4 -48
  96. data/lib/sequel/database/features.rb +5 -4
  97. data/lib/sequel/database/logging.rb +2 -9
  98. data/lib/sequel/database/misc.rb +36 -55
  99. data/lib/sequel/database/query.rb +8 -13
  100. data/lib/sequel/database/schema_generator.rb +93 -64
  101. data/lib/sequel/database/schema_methods.rb +61 -79
  102. data/lib/sequel/database/transactions.rb +4 -24
  103. data/lib/sequel/database.rb +12 -2
  104. data/lib/sequel/dataset/actions.rb +57 -107
  105. data/lib/sequel/dataset/dataset_module.rb +4 -16
  106. data/lib/sequel/dataset/features.rb +35 -30
  107. data/lib/sequel/dataset/graph.rb +40 -49
  108. data/lib/sequel/dataset/misc.rb +12 -37
  109. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  110. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  111. data/lib/sequel/dataset/query.rb +91 -161
  112. data/lib/sequel/dataset/sql.rb +33 -225
  113. data/lib/sequel/dataset.rb +18 -10
  114. data/lib/sequel/deprecated.rb +18 -27
  115. data/lib/sequel/exceptions.rb +1 -17
  116. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  117. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  118. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  119. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  120. data/lib/sequel/extensions/connection_validator.rb +1 -1
  121. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  122. data/lib/sequel/extensions/core_extensions.rb +39 -49
  123. data/lib/sequel/extensions/core_refinements.rb +39 -45
  124. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  125. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  126. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  127. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  128. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  129. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  130. data/lib/sequel/extensions/from_block.rb +1 -35
  131. data/lib/sequel/extensions/graph_each.rb +2 -2
  132. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  133. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  134. data/lib/sequel/extensions/inflector.rb +4 -4
  135. data/lib/sequel/extensions/migration.rb +27 -43
  136. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  137. data/lib/sequel/extensions/null_dataset.rb +2 -8
  138. data/lib/sequel/extensions/pagination.rb +1 -17
  139. data/lib/sequel/extensions/pg_array.rb +20 -189
  140. data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
  141. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  142. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  143. data/lib/sequel/extensions/pg_inet.rb +3 -16
  144. data/lib/sequel/extensions/pg_interval.rb +1 -20
  145. data/lib/sequel/extensions/pg_json.rb +7 -27
  146. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  147. data/lib/sequel/extensions/pg_range.rb +6 -121
  148. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  149. data/lib/sequel/extensions/pg_row.rb +5 -77
  150. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  151. data/lib/sequel/extensions/query.rb +3 -4
  152. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  153. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  154. data/lib/sequel/extensions/select_remove.rb +3 -3
  155. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  156. data/lib/sequel/extensions/sql_comments.rb +2 -2
  157. data/lib/sequel/extensions/string_agg.rb +11 -8
  158. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  159. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  160. data/lib/sequel/model/associations.rb +129 -131
  161. data/lib/sequel/model/base.rb +133 -731
  162. data/lib/sequel/model/default_inflections.rb +1 -1
  163. data/lib/sequel/model/errors.rb +0 -3
  164. data/lib/sequel/model/exceptions.rb +2 -6
  165. data/lib/sequel/model/inflections.rb +1 -26
  166. data/lib/sequel/model/plugins.rb +1 -0
  167. data/lib/sequel/model.rb +27 -62
  168. data/lib/sequel/plugins/active_model.rb +2 -5
  169. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  170. data/lib/sequel/plugins/association_pks.rb +14 -28
  171. data/lib/sequel/plugins/association_proxies.rb +6 -7
  172. data/lib/sequel/plugins/auto_validations.rb +4 -4
  173. data/lib/sequel/plugins/before_after_save.rb +0 -43
  174. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  175. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  176. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  177. data/lib/sequel/plugins/caching.rb +5 -5
  178. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  179. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  180. data/lib/sequel/plugins/column_select.rb +2 -2
  181. data/lib/sequel/plugins/composition.rb +15 -24
  182. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  183. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  184. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  185. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  186. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  187. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  188. data/lib/sequel/plugins/finder.rb +16 -10
  189. data/lib/sequel/plugins/force_encoding.rb +1 -7
  190. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  191. data/lib/sequel/plugins/input_transformer.rb +10 -11
  192. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  193. data/lib/sequel/plugins/instance_filters.rb +5 -5
  194. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  195. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  196. data/lib/sequel/plugins/json_serializer.rb +19 -19
  197. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  198. data/lib/sequel/plugins/list.rb +6 -6
  199. data/lib/sequel/plugins/many_through_many.rb +11 -8
  200. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  201. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  202. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  203. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  204. data/lib/sequel/plugins/pg_row.rb +2 -11
  205. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  206. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  207. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  208. data/lib/sequel/plugins/serialization.rb +15 -33
  209. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  210. data/lib/sequel/plugins/sharding.rb +2 -8
  211. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  212. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  213. data/lib/sequel/plugins/static_cache.rb +8 -9
  214. data/lib/sequel/plugins/string_stripper.rb +3 -3
  215. data/lib/sequel/plugins/subclasses.rb +1 -1
  216. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  217. data/lib/sequel/plugins/table_select.rb +2 -2
  218. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  219. data/lib/sequel/plugins/timestamps.rb +6 -7
  220. data/lib/sequel/plugins/touch.rb +4 -8
  221. data/lib/sequel/plugins/tree.rb +3 -3
  222. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  223. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  224. data/lib/sequel/plugins/update_or_create.rb +3 -3
  225. data/lib/sequel/plugins/update_refresh.rb +3 -3
  226. data/lib/sequel/plugins/uuid.rb +7 -11
  227. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  228. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  229. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  230. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  231. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  232. data/lib/sequel/sql.rb +145 -276
  233. data/lib/sequel/timezones.rb +8 -23
  234. data/lib/sequel/version.rb +2 -2
  235. data/lib/sequel.rb +1 -1
  236. data/spec/adapter_spec.rb +1 -1
  237. data/spec/adapters/db2_spec.rb +2 -103
  238. data/spec/adapters/mssql_spec.rb +89 -68
  239. data/spec/adapters/mysql_spec.rb +111 -478
  240. data/spec/adapters/oracle_spec.rb +1 -9
  241. data/spec/adapters/postgres_spec.rb +459 -664
  242. data/spec/adapters/spec_helper.rb +12 -31
  243. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  244. data/spec/adapters/sqlite_spec.rb +8 -146
  245. data/spec/bin_spec.rb +11 -16
  246. data/spec/core/connection_pool_spec.rb +173 -74
  247. data/spec/core/database_spec.rb +96 -244
  248. data/spec/core/dataset_spec.rb +99 -414
  249. data/spec/core/deprecated_spec.rb +3 -3
  250. data/spec/core/expression_filters_spec.rb +37 -144
  251. data/spec/core/mock_adapter_spec.rb +241 -4
  252. data/spec/core/object_graph_spec.rb +11 -60
  253. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  254. data/spec/core/schema_generator_spec.rb +51 -40
  255. data/spec/core/schema_spec.rb +88 -77
  256. data/spec/core/spec_helper.rb +6 -24
  257. data/spec/core/version_spec.rb +1 -1
  258. data/spec/core_extensions_spec.rb +7 -83
  259. data/spec/core_model_spec.rb +2 -2
  260. data/spec/deprecation_helper.rb +2 -14
  261. data/spec/extensions/accessed_columns_spec.rb +1 -1
  262. data/spec/extensions/active_model_spec.rb +3 -3
  263. data/spec/extensions/after_initialize_spec.rb +1 -1
  264. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  265. data/spec/extensions/association_dependencies_spec.rb +1 -1
  266. data/spec/extensions/association_pks_spec.rb +30 -92
  267. data/spec/extensions/association_proxies_spec.rb +1 -1
  268. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  269. data/spec/extensions/auto_validations_spec.rb +1 -1
  270. data/spec/extensions/blacklist_security_spec.rb +1 -1
  271. data/spec/extensions/blank_spec.rb +1 -1
  272. data/spec/extensions/boolean_readers_spec.rb +1 -1
  273. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  274. data/spec/extensions/caching_spec.rb +1 -1
  275. data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
  276. data/spec/extensions/column_conflicts_spec.rb +1 -1
  277. data/spec/extensions/column_select_spec.rb +4 -4
  278. data/spec/extensions/columns_introspection_spec.rb +1 -1
  279. data/spec/extensions/columns_updated_spec.rb +1 -1
  280. data/spec/extensions/composition_spec.rb +8 -30
  281. data/spec/extensions/connection_expiration_spec.rb +3 -3
  282. data/spec/extensions/connection_validator_spec.rb +3 -3
  283. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  284. data/spec/extensions/constraint_validations_spec.rb +1 -1
  285. data/spec/extensions/core_refinements_spec.rb +1 -3
  286. data/spec/extensions/csv_serializer_spec.rb +4 -9
  287. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  288. data/spec/extensions/dataset_associations_spec.rb +2 -1
  289. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  290. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  291. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  292. data/spec/extensions/defaults_setter_spec.rb +2 -2
  293. data/spec/extensions/delay_add_association_spec.rb +8 -9
  294. data/spec/extensions/dirty_spec.rb +1 -1
  295. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  296. data/spec/extensions/eager_each_spec.rb +2 -2
  297. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  298. data/spec/extensions/error_splitter_spec.rb +1 -1
  299. data/spec/extensions/error_sql_spec.rb +1 -1
  300. data/spec/extensions/eval_inspect_spec.rb +1 -1
  301. data/spec/extensions/finder_spec.rb +1 -1
  302. data/spec/extensions/force_encoding_spec.rb +2 -5
  303. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  304. data/spec/extensions/graph_each_spec.rb +5 -5
  305. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  306. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  307. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  308. data/spec/extensions/inflector_spec.rb +1 -1
  309. data/spec/extensions/input_transformer_spec.rb +7 -2
  310. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  311. data/spec/extensions/instance_filters_spec.rb +1 -1
  312. data/spec/extensions/instance_hooks_spec.rb +1 -95
  313. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  314. data/spec/extensions/json_serializer_spec.rb +1 -1
  315. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  316. data/spec/extensions/list_spec.rb +5 -6
  317. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  318. data/spec/extensions/many_through_many_spec.rb +25 -33
  319. data/spec/extensions/migration_spec.rb +12 -2
  320. data/spec/extensions/modification_detection_spec.rb +1 -1
  321. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  322. data/spec/extensions/named_timezones_spec.rb +3 -3
  323. data/spec/extensions/nested_attributes_spec.rb +1 -29
  324. data/spec/extensions/null_dataset_spec.rb +1 -11
  325. data/spec/extensions/optimistic_locking_spec.rb +2 -2
  326. data/spec/extensions/pagination_spec.rb +1 -1
  327. data/spec/extensions/pg_array_associations_spec.rb +22 -26
  328. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_array_spec.rb +3 -48
  330. data/spec/extensions/pg_enum_spec.rb +1 -1
  331. data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
  332. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  333. data/spec/extensions/pg_hstore_spec.rb +22 -31
  334. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_inet_spec.rb +1 -14
  336. data/spec/extensions/pg_interval_spec.rb +3 -13
  337. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  338. data/spec/extensions/pg_json_spec.rb +1 -13
  339. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  340. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  341. data/spec/extensions/pg_range_spec.rb +3 -88
  342. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  343. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  344. data/spec/extensions/pg_row_spec.rb +1 -44
  345. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  346. data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
  347. data/spec/extensions/prepared_statements_spec.rb +13 -48
  348. data/spec/extensions/pretty_table_spec.rb +40 -9
  349. data/spec/extensions/query_spec.rb +1 -12
  350. data/spec/extensions/rcte_tree_spec.rb +23 -34
  351. data/spec/extensions/round_timestamps_spec.rb +1 -5
  352. data/spec/extensions/s_spec.rb +1 -1
  353. data/spec/extensions/schema_caching_spec.rb +1 -1
  354. data/spec/extensions/schema_dumper_spec.rb +43 -32
  355. data/spec/extensions/select_remove_spec.rb +1 -1
  356. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  357. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  358. data/spec/extensions/serialization_spec.rb +5 -17
  359. data/spec/extensions/server_block_spec.rb +1 -1
  360. data/spec/extensions/server_logging_spec.rb +2 -2
  361. data/spec/extensions/sharding_spec.rb +1 -1
  362. data/spec/extensions/shared_caching_spec.rb +1 -28
  363. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  364. data/spec/extensions/singular_table_names_spec.rb +1 -1
  365. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  366. data/spec/extensions/spec_helper.rb +5 -27
  367. data/spec/extensions/split_array_nil_spec.rb +1 -1
  368. data/spec/extensions/split_values_spec.rb +1 -1
  369. data/spec/extensions/sql_comments_spec.rb +1 -1
  370. data/spec/extensions/sql_expr_spec.rb +1 -1
  371. data/spec/extensions/static_cache_spec.rb +1 -1
  372. data/spec/extensions/string_agg_spec.rb +2 -2
  373. data/spec/extensions/string_date_time_spec.rb +1 -1
  374. data/spec/extensions/string_stripper_spec.rb +1 -1
  375. data/spec/extensions/subclasses_spec.rb +1 -1
  376. data/spec/extensions/subset_conditions_spec.rb +1 -1
  377. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  378. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  379. data/spec/extensions/synchronize_sql_spec.rb +124 -0
  380. data/spec/extensions/table_select_spec.rb +4 -4
  381. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  382. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  383. data/spec/extensions/timestamps_spec.rb +5 -7
  384. data/spec/extensions/to_dot_spec.rb +1 -1
  385. data/spec/extensions/touch_spec.rb +1 -1
  386. data/spec/extensions/tree_spec.rb +1 -1
  387. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  388. data/spec/extensions/unlimited_update_spec.rb +1 -1
  389. data/spec/extensions/update_or_create_spec.rb +12 -16
  390. data/spec/extensions/update_primary_key_spec.rb +4 -3
  391. data/spec/extensions/update_refresh_spec.rb +1 -1
  392. data/spec/extensions/uuid_spec.rb +10 -13
  393. data/spec/extensions/validate_associated_spec.rb +1 -1
  394. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  395. data/spec/extensions/validation_contexts_spec.rb +1 -1
  396. data/spec/extensions/validation_helpers_spec.rb +10 -44
  397. data/spec/extensions/whitelist_security_spec.rb +5 -5
  398. data/spec/extensions/xml_serializer_spec.rb +8 -13
  399. data/spec/guards_helper.rb +2 -1
  400. data/spec/integration/associations_test.rb +1 -23
  401. data/spec/integration/database_test.rb +7 -7
  402. data/spec/integration/dataset_test.rb +12 -47
  403. data/spec/integration/eager_loader_test.rb +1 -1
  404. data/spec/integration/migrator_test.rb +1 -1
  405. data/spec/integration/model_test.rb +4 -82
  406. data/spec/integration/plugin_test.rb +7 -23
  407. data/spec/integration/prepared_statement_test.rb +8 -88
  408. data/spec/integration/schema_test.rb +10 -10
  409. data/spec/integration/spec_helper.rb +17 -21
  410. data/spec/integration/timezone_test.rb +5 -5
  411. data/spec/integration/transaction_test.rb +3 -55
  412. data/spec/integration/type_test.rb +9 -9
  413. data/spec/model/association_reflection_spec.rb +24 -9
  414. data/spec/model/associations_spec.rb +124 -303
  415. data/spec/model/base_spec.rb +43 -137
  416. data/spec/model/class_dataset_methods_spec.rb +2 -20
  417. data/spec/model/dataset_methods_spec.rb +1 -20
  418. data/spec/model/eager_loading_spec.rb +48 -17
  419. data/spec/model/hooks_spec.rb +5 -300
  420. data/spec/model/inflector_spec.rb +1 -1
  421. data/spec/model/model_spec.rb +29 -339
  422. data/spec/model/plugins_spec.rb +2 -16
  423. data/spec/model/record_spec.rb +33 -129
  424. data/spec/model/spec_helper.rb +5 -15
  425. data/spec/model/validations_spec.rb +1 -1
  426. data/spec/sequel_warning.rb +1 -12
  427. metadata +19 -65
  428. data/doc/active_record.rdoc +0 -927
  429. data/lib/sequel/adapters/cubrid.rb +0 -160
  430. data/lib/sequel/adapters/do/mysql.rb +0 -69
  431. data/lib/sequel/adapters/do/postgres.rb +0 -46
  432. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  433. data/lib/sequel/adapters/do.rb +0 -166
  434. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  435. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  436. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  437. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  438. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  439. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  440. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  441. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  442. data/lib/sequel/adapters/shared/informix.rb +0 -63
  443. data/lib/sequel/adapters/shared/progress.rb +0 -40
  444. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  445. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  446. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  447. data/lib/sequel/adapters/swift.rb +0 -169
  448. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  449. data/lib/sequel/dataset/mutation.rb +0 -98
  450. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  451. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  452. data/lib/sequel/extensions/filter_having.rb +0 -65
  453. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  454. data/lib/sequel/extensions/meta_def.rb +0 -37
  455. data/lib/sequel/extensions/query_literals.rb +0 -86
  456. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  457. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  458. data/lib/sequel/extensions/set_overrides.rb +0 -82
  459. data/lib/sequel/no_core_ext.rb +0 -4
  460. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  461. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  462. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  463. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  464. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  465. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  466. data/lib/sequel/plugins/schema.rb +0 -84
  467. data/lib/sequel/plugins/scissors.rb +0 -37
  468. data/spec/core/dataset_mutation_spec.rb +0 -253
  469. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  470. data/spec/extensions/before_after_save_spec.rb +0 -40
  471. data/spec/extensions/filter_having_spec.rb +0 -42
  472. data/spec/extensions/from_block_spec.rb +0 -21
  473. data/spec/extensions/hash_aliases_spec.rb +0 -26
  474. data/spec/extensions/identifier_columns_spec.rb +0 -19
  475. data/spec/extensions/meta_def_spec.rb +0 -35
  476. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  477. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  478. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  479. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  480. data/spec/extensions/query_literals_spec.rb +0 -185
  481. data/spec/extensions/schema_spec.rb +0 -123
  482. data/spec/extensions/scissors_spec.rb +0 -27
  483. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  484. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -3,12 +3,8 @@
3
3
  # A connection pool allowing multi-threaded access to a pool of connections.
4
4
  # This is the default connection pool used by Sequel.
5
5
  class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
6
- # Whether or not a ConditionVariable should be used to wait for connections.
7
- # True except on ruby 1.8, where ConditionVariable#wait does not support a
8
- # timeout.
9
- unless defined?(USE_WAITER)
10
- USE_WAITER = RUBY_VERSION >= '1.9'
11
- end
6
+ USE_WAITER = true
7
+ Sequel::Deprecation.deprecate_constant(self, :USE_WAITER)
12
8
 
13
9
  # The maximum number of connections this pool will create (per shard/server
14
10
  # if sharding).
@@ -22,15 +18,10 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
22
18
  attr_reader :allocated
23
19
 
24
20
  # The following additional options are respected:
25
- # * :connection_handling - Set how to handle available connections. By default,
26
- # uses a a queue for fairness. Can be set to :stack to use a stack, which may
27
- # offer better performance.
28
- # * :max_connections - The maximum number of connections the connection pool
29
- # will open (default 4)
30
- # * :pool_sleep_time - The amount of time to sleep before attempting to acquire
31
- # a connection again, only used on ruby 1.8. (default 0.001)
32
- # * :pool_timeout - The amount of seconds to wait to acquire a connection
33
- # before raising a PoolTimeoutError (default 5)
21
+ # :max_connections :: The maximum number of connections the connection pool
22
+ # will open (default 4)
23
+ # :pool_timeout :: The amount of seconds to wait to acquire a connection
24
+ # before raising a PoolTimeoutError (default 5)
34
25
  def initialize(db, opts = OPTS)
35
26
  super
36
27
  @max_size = Integer(opts[:max_connections] || 4)
@@ -40,14 +31,7 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
40
31
  @available_connections = []
41
32
  @allocated = {}
42
33
  @timeout = Float(opts[:pool_timeout] || 5)
43
-
44
- if USE_WAITER
45
- @waiter = ConditionVariable.new
46
- else
47
- # :nocov:
48
- @sleep_time = Float(opts[:pool_sleep_time] || 0.001)
49
- # :nocov:
50
- end
34
+ @waiter = ConditionVariable.new
51
35
  end
52
36
 
53
37
  # Yield all of the available connections, and the one currently allocated to
@@ -70,7 +54,7 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
70
54
  # being used. If you want to be able to disconnect connections that are
71
55
  # currently in use, use the ShardedThreadedConnectionPool, which can do that.
72
56
  # This connection pool does not, for performance reasons. To use the sharded pool,
73
- # pass the <tt>:servers=>{}</tt> option when connecting to the database.
57
+ # pass the <tt>servers: {}</tt> option when connecting to the database.
74
58
  #
75
59
  # Once a connection is requested using #hold, the connection pool
76
60
  # creates new connections to the database.
@@ -79,6 +63,7 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
79
63
  sync do
80
64
  conns = @available_connections.dup
81
65
  @available_connections.clear
66
+ @waiter.signal
82
67
  end
83
68
  conns.each{|conn| disconnect_connection(conn)}
84
69
  end
@@ -95,8 +80,7 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
95
80
  # If no connection is immediately available and the pool is already using the maximum
96
81
  # number of connections, Pool#hold will block until a connection
97
82
  # is available or the timeout expires. If the timeout expires before a
98
- # connection can be acquired, a Sequel::PoolTimeout is
99
- # raised.
83
+ # connection can be acquired, a Sequel::PoolTimeout is raised.
100
84
  def hold(server=nil)
101
85
  t = Thread.current
102
86
  if conn = owned_connection(t)
@@ -110,7 +94,10 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
110
94
  oconn = conn
111
95
  conn = nil
112
96
  disconnect_connection(oconn) if oconn
113
- @allocated.delete(t)
97
+ sync do
98
+ @allocated.delete(t)
99
+ @waiter.signal
100
+ end
114
101
  end
115
102
  raise
116
103
  ensure
@@ -123,111 +110,104 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
123
110
  end
124
111
 
125
112
  # The total number of connections opened, either available or allocated.
126
- # This may not be completely accurate as it isn't protected by the mutex.
113
+ # The calling code should not have the mutex before calling this.
127
114
  def size
128
- @allocated.length + @available_connections.length
115
+ @mutex.synchronize{_size}
129
116
  end
130
117
 
131
118
  private
132
119
 
120
+ # The total number of connections opened, either available or allocated.
121
+ # The calling code should already have the mutex before calling this.
122
+ def _size
123
+ @allocated.length + @available_connections.length
124
+ end
125
+
133
126
  # Assigns a connection to the supplied thread, if one
134
- # is available. The calling code should already have the mutex when
127
+ # is available. The calling code should NOT already have the mutex when
135
128
  # calling this.
136
- def _acquire(thread)
137
- if conn = available
138
- @allocated[thread] = conn
129
+ #
130
+ # This should return a connection is one is available within the timeout,
131
+ # or nil if a connection could not be acquired within the timeout.
132
+ def acquire(thread)
133
+ if conn = assign_connection(thread)
134
+ return conn
139
135
  end
140
- end
141
-
142
- if USE_WAITER
143
- # Assigns a connection to the supplied thread, if one
144
- # is available. The calling code should NOT already have the mutex when
145
- # calling this.
146
- #
147
- # This should return a connection is one is available within the timeout,
148
- # or nil if a connection could not be acquired within the timeout.
149
- def acquire(thread)
136
+
137
+ time = Time.now
138
+
139
+ sync do
140
+ @waiter.wait(@mutex, @timeout)
141
+ if conn = next_available
142
+ return(@allocated[thread] = conn)
143
+ end
144
+ end
145
+
146
+ until conn = assign_connection(thread)
147
+ deadline ||= time + @timeout
148
+ current_time = Time.now
149
+ raise_pool_timeout(current_time - time) if current_time > deadline
150
+
151
+ # :nocov:
152
+ # It's difficult to get to this point, it can only happen if there is a race condition
153
+ # where a connection cannot be acquired even after the thread is signalled by the condition
150
154
  sync do
151
- if conn = _acquire(thread)
152
- return conn
155
+ @waiter.wait(@mutex, deadline - current_time)
156
+ if conn = next_available
157
+ return(@allocated[thread] = conn)
153
158
  end
159
+ end
160
+ # :nocov:
161
+ end
154
162
 
155
- time = Time.now
156
- @waiter.wait(@mutex, @timeout)
163
+ conn
164
+ end
157
165
 
158
- # Not sure why this is helpful, but calling Thread.pass after conditional
159
- # variable access dramatically increases reliability when under heavy
160
- # resource contention (almost eliminating timeouts), at a small cost to
161
- # runtime performance.
162
- Thread.pass
166
+ # Assign a connection to the thread, or return nil if one cannot be assigned.
167
+ # The caller should NOT have the mutex before calling this.
168
+ def assign_connection(thread)
169
+ allocated = @allocated
163
170
 
164
- until conn = _acquire(thread)
165
- deadline ||= time + @timeout
166
- current_time = Time.now
167
- raise_pool_timeout(current_time - time) if current_time > deadline
168
- # :nocov:
169
- # It's difficult to get to this point, it can only happen if there is a race condition
170
- # where a connection cannot be acquired even after the thread is signalled by the condition
171
- @waiter.wait(@mutex, deadline - current_time)
172
- Thread.pass
173
- # :nocov:
174
- end
171
+ do_make_new = false
172
+ sync do
173
+ if conn = next_available
174
+ return(allocated[thread] = conn)
175
+ end
176
+
177
+ if (n = _size) >= (max = @max_size)
178
+ allocated.keys.each{|t| release(t) unless t.alive?}
179
+ n = nil
180
+ end
175
181
 
176
- conn
182
+ if (n || _size) < max
183
+ do_make_new = allocated[thread] = true
177
184
  end
178
185
  end
179
- else
180
- # :nocov:
181
- def acquire(thread)
182
- unless conn = sync{_acquire(thread)}
183
- time = Time.now
184
- timeout = time + @timeout
185
- sleep_time = @sleep_time
186
- sleep sleep_time
187
- until conn = sync{_acquire(thread)}
188
- raise_pool_timeout(Time.now - time) if Time.now > timeout
189
- sleep sleep_time
186
+
187
+ # Connect to the database outside of the connection pool mutex,
188
+ # as that can take a long time and the connection pool mutex
189
+ # shouldn't be locked while the connection takes place.
190
+ if do_make_new
191
+ begin
192
+ conn = make_new(:default)
193
+ sync{allocated[thread] = conn}
194
+ ensure
195
+ unless conn
196
+ sync{allocated.delete(thread)}
190
197
  end
191
198
  end
192
- conn
193
199
  end
194
- # :nocov:
195
- end
196
200
 
197
- # Returns an available connection. If no connection is
198
- # available, tries to create a new connection. The calling code should already
199
- # have the mutex before calling this.
200
- def available
201
- next_available || make_new(:default)
201
+ conn
202
202
  end
203
203
 
204
204
  # Return a connection to the pool of available connections, returns the connection.
205
205
  # The calling code should already have the mutex before calling this.
206
206
  def checkin_connection(conn)
207
207
  @available_connections << conn
208
- if USE_WAITER
209
- @waiter.signal
210
- Thread.pass
211
- end
212
208
  conn
213
209
  end
214
210
 
215
- unless method_defined?(:default_make_new)
216
- # Alias the default make_new method, so subclasses can call it directly.
217
- alias default_make_new make_new
218
- end
219
-
220
- # Creates a new connection to the given server if the size of the pool for
221
- # the server is less than the maximum size of the pool. The calling code
222
- # should already have the mutex before calling this.
223
- def make_new(server)
224
- if (n = size) >= @max_size
225
- @allocated.keys.each{|t| release(t) unless t.alive?}
226
- n = nil
227
- end
228
- super if (n || size) < @max_size
229
- end
230
-
231
211
  # Return the next available connection in the pool, or nil if there
232
212
  # is not currently an available connection. The calling code should already
233
213
  # have the mutex before calling this.
@@ -246,15 +226,18 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
246
226
  sync{@allocated[thread]}
247
227
  end
248
228
 
249
- # Create the maximum number of connections immediately.
229
+ # Create the maximum number of connections immediately. The calling code should
230
+ # NOT have the mutex before calling this.
250
231
  def preconnect(concurrent = false)
251
- enum = (max_size - size).times
232
+ enum = (max_size - _size).times
252
233
 
253
- if concurrent
254
- enum.map{Thread.new{make_new(nil)}}.map(&:join).each{|t| checkin_connection(t.value)}
234
+ conns = if concurrent
235
+ enum.map{Thread.new{make_new(:default)}}.map(&:value)
255
236
  else
256
- enum.each{checkin_connection(make_new(nil))}
237
+ enum.map{make_new(:default)}
257
238
  end
239
+
240
+ sync{conns.each{|conn| checkin_connection(conn)}}
258
241
  end
259
242
 
260
243
  # Raise a PoolTimeout error showing the current timeout, the elapsed time, and the
@@ -274,6 +257,9 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
274
257
  else
275
258
  checkin_connection(conn)
276
259
  end
260
+
261
+ @waiter.signal
262
+ nil
277
263
  end
278
264
 
279
265
  # Yield to the block while inside the mutex. The calling code should NOT
@@ -281,6 +267,4 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
281
267
  def sync
282
268
  @mutex.synchronize{yield}
283
269
  end
284
-
285
- CONNECTION_POOL__MAP[[false, false]] = self
286
270
  end
@@ -26,19 +26,13 @@
26
26
  # specified by the array of symbols.
27
27
  class Sequel::ConnectionPool
28
28
  OPTS = Sequel::OPTS
29
+ POOL_CLASS_MAP = {
30
+ :threaded => :ThreadedConnectionPool,
31
+ :single => :SingleConnectionPool,
32
+ :sharded_threaded => :ShardedThreadedConnectionPool,
33
+ :sharded_single => :ShardedSingleConnectionPool
34
+ }.freeze
29
35
 
30
- # The default server to use
31
- DEFAULT_SERVER = :default
32
- Sequel::Deprecation.deprecate_constant(self, :DEFAULT_SERVER)
33
-
34
- # A map of [single threaded, sharded] values to symbols or ConnectionPool subclasses.
35
- CONNECTION_POOL_MAP = {[true, false] => :single,
36
- [true, true] => :sharded_single,
37
- [false, false] => :threaded,
38
- [false, true] => :sharded_threaded}
39
- CONNECTION_POOL__MAP = CONNECTION_POOL_MAP
40
- Sequel::Deprecation.deprecate_constant(self, :CONNECTION_POOL_MAP)
41
-
42
36
  # Class methods used to return an appropriate pool subclass, separated
43
37
  # into a module for easier overridding by extensions.
44
38
  module ClassMethods
@@ -47,23 +41,33 @@ class Sequel::ConnectionPool
47
41
  # use a new instance of an appropriate pool subclass based on the
48
42
  # <tt>:single_threaded</tt> and <tt>:servers</tt> options.
49
43
  def get_pool(db, opts = OPTS)
50
- case v = connection_pool_class(opts)
51
- when Class
52
- v.new(db, opts)
53
- when Symbol
54
- require("sequel/connection_pool/#{v}")
55
- connection_pool_class(opts).new(db, opts) || raise(Sequel::Error, "No connection pool class found")
56
- end
44
+ connection_pool_class(opts).new(db, opts)
57
45
  end
58
46
 
59
47
  private
60
48
 
61
49
  # Return a connection pool class based on the given options.
62
50
  def connection_pool_class(opts)
63
- if opts[:pool_class] && !opts[:pool_class].is_a?(Class) && ![:threaded, :single, :sharded_threaded, :sharded_single].include?(opts[:pool_class])
64
- Sequel::Deprecation.deprecate("Using an unrecognized :pool_class option", "Use a class for the :pool_class option to select a custom pool class, or one of the following symbols for one of the default pool classes: :threaded, :single, :sharded_threaded, :sharded_single")
51
+ if pc = opts[:pool_class]
52
+ unless pc.is_a?(Class)
53
+ unless name = POOL_CLASS_MAP[pc]
54
+ raise Sequel::Error, "unsupported connection pool type, please pass appropriate class as the :pool_class option"
55
+ end
56
+
57
+ require_relative "connection_pool/#{pc}"
58
+ pc = Sequel.const_get(name)
59
+ end
60
+
61
+ pc
62
+ else
63
+ pc = if opts[:single_threaded]
64
+ opts[:servers] ? :sharded_single : :single
65
+ else
66
+ opts[:servers] ? :sharded_threaded : :threaded
67
+ end
68
+
69
+ connection_pool_class(:pool_class=>pc)
65
70
  end
66
- CONNECTION_POOL__MAP[opts[:pool_class]] || opts[:pool_class] || CONNECTION_POOL__MAP[[!!opts[:single_threaded], !!opts[:servers]]]
67
71
  end
68
72
  end
69
73
  extend ClassMethods
@@ -72,6 +76,9 @@ class Sequel::ConnectionPool
72
76
  # connection made, and is usually used to set custom per-connection settings.
73
77
  attr_accessor :after_connect
74
78
 
79
+ # An array of sql strings to execute on each new connection.
80
+ attr_accessor :connect_sqls
81
+
75
82
  # The Sequel::Database object tied to this connection pool.
76
83
  attr_accessor :db
77
84
 
@@ -82,6 +89,7 @@ class Sequel::ConnectionPool
82
89
  # :after_connect :: A callable object called after each new connection is made, with the
83
90
  # connection object (and server argument if the callable accepts 2 arguments),
84
91
  # useful for customizations that you want to apply to all connections.
92
+ # :connect_sqls :: An array of sql strings to execute on each new connection, after :after_connect runs.
85
93
  # :preconnect :: Automatically create the maximum number of connections, so that they don't
86
94
  # need to be created as needed. This is useful when connecting takes a long time
87
95
  # and you want to avoid possible latency during runtime.
@@ -90,15 +98,10 @@ class Sequel::ConnectionPool
90
98
  def initialize(db, opts=OPTS)
91
99
  @db = db
92
100
  @after_connect = opts[:after_connect]
101
+ @connect_sqls = opts[:connect_sqls]
93
102
  @error_classes = db.send(:database_error_classes).dup.freeze
94
103
  end
95
104
 
96
- # Alias for +size+, not aliased directly for ease of subclass implementation
97
- def created_count(*args)
98
- Sequel::Deprecation.deprecate("Sequel::ConnectionPool#created_count", "Use #size instead")
99
- size(*args)
100
- end
101
-
102
105
  # An array of symbols for all shards/servers, which is a single <tt>:default</tt> by default.
103
106
  def servers
104
107
  [:default]
@@ -121,6 +124,7 @@ class Sequel::ConnectionPool
121
124
  def make_new(server)
122
125
  begin
123
126
  conn = @db.connect(server)
127
+
124
128
  if ac = @after_connect
125
129
  if ac.arity == 2
126
130
  ac.call(conn, server)
@@ -128,6 +132,12 @@ class Sequel::ConnectionPool
128
132
  ac.call(conn)
129
133
  end
130
134
  end
135
+
136
+ if cs = @connect_sqls
137
+ cs.each do |sql|
138
+ db.send(:log_connection_execute, conn, sql)
139
+ end
140
+ end
131
141
  rescue Exception=>exception
132
142
  raise Sequel.convert_exception_class(exception, Sequel::DatabaseConnectionError)
133
143
  end