sequel 5.8.0 → 5.38.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 (510) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +409 -1795
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/bin/sequel +4 -0
  6. data/doc/advanced_associations.rdoc +136 -18
  7. data/doc/association_basics.rdoc +10 -5
  8. data/doc/cheat_sheet.rdoc +1 -0
  9. data/doc/code_order.rdoc +12 -2
  10. data/doc/dataset_filtering.rdoc +17 -2
  11. data/doc/mass_assignment.rdoc +3 -3
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +30 -8
  15. data/doc/postgresql.rdoc +107 -2
  16. data/doc/release_notes/5.10.0.txt +84 -0
  17. data/doc/release_notes/5.11.0.txt +83 -0
  18. data/doc/release_notes/5.12.0.txt +141 -0
  19. data/doc/release_notes/5.13.0.txt +27 -0
  20. data/doc/release_notes/5.14.0.txt +63 -0
  21. data/doc/release_notes/5.15.0.txt +39 -0
  22. data/doc/release_notes/5.16.0.txt +110 -0
  23. data/doc/release_notes/5.17.0.txt +31 -0
  24. data/doc/release_notes/5.18.0.txt +69 -0
  25. data/doc/release_notes/5.19.0.txt +28 -0
  26. data/doc/release_notes/5.20.0.txt +89 -0
  27. data/doc/release_notes/5.21.0.txt +87 -0
  28. data/doc/release_notes/5.22.0.txt +48 -0
  29. data/doc/release_notes/5.23.0.txt +56 -0
  30. data/doc/release_notes/5.24.0.txt +56 -0
  31. data/doc/release_notes/5.25.0.txt +32 -0
  32. data/doc/release_notes/5.26.0.txt +35 -0
  33. data/doc/release_notes/5.27.0.txt +21 -0
  34. data/doc/release_notes/5.28.0.txt +16 -0
  35. data/doc/release_notes/5.29.0.txt +22 -0
  36. data/doc/release_notes/5.30.0.txt +20 -0
  37. data/doc/release_notes/5.31.0.txt +148 -0
  38. data/doc/release_notes/5.32.0.txt +46 -0
  39. data/doc/release_notes/5.33.0.txt +24 -0
  40. data/doc/release_notes/5.34.0.txt +40 -0
  41. data/doc/release_notes/5.35.0.txt +56 -0
  42. data/doc/release_notes/5.36.0.txt +60 -0
  43. data/doc/release_notes/5.37.0.txt +30 -0
  44. data/doc/release_notes/5.38.0.txt +28 -0
  45. data/doc/release_notes/5.9.0.txt +99 -0
  46. data/doc/security.rdoc +10 -0
  47. data/doc/sharding.rdoc +42 -28
  48. data/doc/sql.rdoc +12 -0
  49. data/doc/testing.rdoc +24 -17
  50. data/doc/transactions.rdoc +78 -0
  51. data/doc/validations.rdoc +2 -2
  52. data/lib/sequel/adapters/ado.rb +26 -18
  53. data/lib/sequel/adapters/ado/access.rb +2 -2
  54. data/lib/sequel/adapters/ado/mssql.rb +5 -8
  55. data/lib/sequel/adapters/amalgalite.rb +1 -1
  56. data/lib/sequel/adapters/jdbc.rb +71 -27
  57. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  58. data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
  59. data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
  60. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
  61. data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
  62. data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
  63. data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
  64. data/lib/sequel/adapters/mysql.rb +14 -15
  65. data/lib/sequel/adapters/mysql2.rb +5 -3
  66. data/lib/sequel/adapters/odbc.rb +4 -6
  67. data/lib/sequel/adapters/oracle.rb +7 -7
  68. data/lib/sequel/adapters/postgres.rb +52 -16
  69. data/lib/sequel/adapters/shared/access.rb +16 -12
  70. data/lib/sequel/adapters/shared/db2.rb +5 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +41 -18
  72. data/lib/sequel/adapters/shared/mysql.rb +66 -19
  73. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  74. data/lib/sequel/adapters/shared/postgres.rb +341 -95
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
  76. data/lib/sequel/adapters/shared/sqlite.rb +174 -21
  77. data/lib/sequel/adapters/sqlanywhere.rb +33 -17
  78. data/lib/sequel/adapters/sqlite.rb +78 -68
  79. data/lib/sequel/adapters/tinytds.rb +14 -6
  80. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
  82. data/lib/sequel/connection_pool.rb +2 -6
  83. data/lib/sequel/connection_pool/sharded_single.rb +7 -4
  84. data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
  85. data/lib/sequel/connection_pool/single.rb +1 -1
  86. data/lib/sequel/connection_pool/threaded.rb +26 -11
  87. data/lib/sequel/core.rb +327 -319
  88. data/lib/sequel/database/connecting.rb +7 -8
  89. data/lib/sequel/database/logging.rb +7 -1
  90. data/lib/sequel/database/misc.rb +68 -34
  91. data/lib/sequel/database/query.rb +6 -4
  92. data/lib/sequel/database/schema_generator.rb +31 -11
  93. data/lib/sequel/database/schema_methods.rb +32 -22
  94. data/lib/sequel/database/transactions.rb +129 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/dataset/actions.rb +34 -23
  97. data/lib/sequel/dataset/features.rb +34 -0
  98. data/lib/sequel/dataset/graph.rb +27 -11
  99. data/lib/sequel/dataset/misc.rb +17 -3
  100. data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
  101. data/lib/sequel/dataset/prepared_statements.rb +96 -26
  102. data/lib/sequel/dataset/query.rb +43 -8
  103. data/lib/sequel/dataset/sql.rb +189 -41
  104. data/lib/sequel/deprecated.rb +3 -1
  105. data/lib/sequel/exceptions.rb +2 -0
  106. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  107. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  108. data/lib/sequel/extensions/caller_logging.rb +79 -0
  109. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  110. data/lib/sequel/extensions/connection_expiration.rb +6 -6
  111. data/lib/sequel/extensions/connection_validator.rb +7 -6
  112. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  113. data/lib/sequel/extensions/constraint_validations.rb +53 -28
  114. data/lib/sequel/extensions/core_refinements.rb +2 -0
  115. data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
  116. data/lib/sequel/extensions/escaped_like.rb +100 -0
  117. data/lib/sequel/extensions/eval_inspect.rb +3 -1
  118. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  119. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  120. data/lib/sequel/extensions/index_caching.rb +9 -7
  121. data/lib/sequel/extensions/integer64.rb +3 -1
  122. data/lib/sequel/extensions/looser_typecasting.rb +3 -3
  123. data/lib/sequel/extensions/migration.rb +13 -6
  124. data/lib/sequel/extensions/named_timezones.rb +84 -23
  125. data/lib/sequel/extensions/pg_array.rb +87 -79
  126. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  127. data/lib/sequel/extensions/pg_enum.rb +34 -18
  128. data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
  129. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  130. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
  131. data/lib/sequel/extensions/pg_inet.rb +15 -5
  132. data/lib/sequel/extensions/pg_interval.rb +2 -0
  133. data/lib/sequel/extensions/pg_json.rb +387 -123
  134. data/lib/sequel/extensions/pg_json_ops.rb +168 -0
  135. data/lib/sequel/extensions/pg_range.rb +20 -10
  136. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  137. data/lib/sequel/extensions/pg_row.rb +3 -2
  138. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  139. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  140. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  141. data/lib/sequel/extensions/query.rb +1 -0
  142. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  143. data/lib/sequel/extensions/s.rb +2 -0
  144. data/lib/sequel/extensions/schema_dumper.rb +13 -7
  145. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
  146. data/lib/sequel/extensions/server_block.rb +18 -7
  147. data/lib/sequel/extensions/sql_comments.rb +2 -2
  148. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  149. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  150. data/lib/sequel/extensions/to_dot.rb +9 -3
  151. data/lib/sequel/model.rb +3 -1
  152. data/lib/sequel/model/associations.rb +403 -69
  153. data/lib/sequel/model/base.rb +170 -90
  154. data/lib/sequel/model/plugins.rb +105 -0
  155. data/lib/sequel/plugins/after_initialize.rb +1 -1
  156. data/lib/sequel/plugins/association_dependencies.rb +3 -3
  157. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  158. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  159. data/lib/sequel/plugins/association_pks.rb +74 -22
  160. data/lib/sequel/plugins/association_proxies.rb +6 -2
  161. data/lib/sequel/plugins/auto_validations.rb +36 -17
  162. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  163. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  164. data/lib/sequel/plugins/caching.rb +3 -0
  165. data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
  166. data/lib/sequel/plugins/composition.rb +13 -9
  167. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  168. data/lib/sequel/plugins/defaults_setter.rb +2 -2
  169. data/lib/sequel/plugins/dirty.rb +60 -22
  170. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  171. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  172. data/lib/sequel/plugins/finder.rb +2 -2
  173. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  174. data/lib/sequel/plugins/hook_class_methods.rb +17 -5
  175. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  176. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  177. data/lib/sequel/plugins/inverted_subsets.rb +2 -2
  178. data/lib/sequel/plugins/json_serializer.rb +21 -14
  179. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  180. data/lib/sequel/plugins/list.rb +22 -10
  181. data/lib/sequel/plugins/many_through_many.rb +1 -1
  182. data/lib/sequel/plugins/nested_attributes.rb +27 -5
  183. data/lib/sequel/plugins/pg_array_associations.rb +12 -9
  184. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
  185. data/lib/sequel/plugins/prepared_statements.rb +6 -12
  186. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  187. data/lib/sequel/plugins/rcte_tree.rb +20 -22
  188. data/lib/sequel/plugins/sharding.rb +13 -7
  189. data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
  190. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  191. data/lib/sequel/plugins/static_cache.rb +36 -17
  192. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  193. data/lib/sequel/plugins/string_stripper.rb +1 -1
  194. data/lib/sequel/plugins/subclasses.rb +2 -0
  195. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  196. data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
  197. data/lib/sequel/plugins/throw_failures.rb +110 -0
  198. data/lib/sequel/plugins/tree.rb +49 -31
  199. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  200. data/lib/sequel/plugins/validation_class_methods.rb +11 -5
  201. data/lib/sequel/plugins/validation_helpers.rb +2 -2
  202. data/lib/sequel/sql.rb +120 -30
  203. data/lib/sequel/timezones.rb +55 -14
  204. data/lib/sequel/version.rb +6 -1
  205. metadata +101 -361
  206. data/Rakefile +0 -151
  207. data/doc/release_notes/4.0.0.txt +0 -262
  208. data/doc/release_notes/4.1.0.txt +0 -85
  209. data/doc/release_notes/4.10.0.txt +0 -226
  210. data/doc/release_notes/4.11.0.txt +0 -147
  211. data/doc/release_notes/4.12.0.txt +0 -105
  212. data/doc/release_notes/4.13.0.txt +0 -169
  213. data/doc/release_notes/4.14.0.txt +0 -68
  214. data/doc/release_notes/4.15.0.txt +0 -56
  215. data/doc/release_notes/4.16.0.txt +0 -36
  216. data/doc/release_notes/4.17.0.txt +0 -38
  217. data/doc/release_notes/4.18.0.txt +0 -36
  218. data/doc/release_notes/4.19.0.txt +0 -45
  219. data/doc/release_notes/4.2.0.txt +0 -129
  220. data/doc/release_notes/4.20.0.txt +0 -79
  221. data/doc/release_notes/4.21.0.txt +0 -94
  222. data/doc/release_notes/4.22.0.txt +0 -72
  223. data/doc/release_notes/4.23.0.txt +0 -65
  224. data/doc/release_notes/4.24.0.txt +0 -99
  225. data/doc/release_notes/4.25.0.txt +0 -181
  226. data/doc/release_notes/4.26.0.txt +0 -44
  227. data/doc/release_notes/4.27.0.txt +0 -78
  228. data/doc/release_notes/4.28.0.txt +0 -57
  229. data/doc/release_notes/4.29.0.txt +0 -41
  230. data/doc/release_notes/4.3.0.txt +0 -40
  231. data/doc/release_notes/4.30.0.txt +0 -37
  232. data/doc/release_notes/4.31.0.txt +0 -57
  233. data/doc/release_notes/4.32.0.txt +0 -132
  234. data/doc/release_notes/4.33.0.txt +0 -88
  235. data/doc/release_notes/4.34.0.txt +0 -86
  236. data/doc/release_notes/4.35.0.txt +0 -130
  237. data/doc/release_notes/4.36.0.txt +0 -116
  238. data/doc/release_notes/4.37.0.txt +0 -50
  239. data/doc/release_notes/4.38.0.txt +0 -67
  240. data/doc/release_notes/4.39.0.txt +0 -127
  241. data/doc/release_notes/4.4.0.txt +0 -92
  242. data/doc/release_notes/4.40.0.txt +0 -179
  243. data/doc/release_notes/4.41.0.txt +0 -77
  244. data/doc/release_notes/4.42.0.txt +0 -221
  245. data/doc/release_notes/4.43.0.txt +0 -87
  246. data/doc/release_notes/4.44.0.txt +0 -125
  247. data/doc/release_notes/4.45.0.txt +0 -370
  248. data/doc/release_notes/4.46.0.txt +0 -404
  249. data/doc/release_notes/4.47.0.txt +0 -56
  250. data/doc/release_notes/4.48.0.txt +0 -293
  251. data/doc/release_notes/4.49.0.txt +0 -222
  252. data/doc/release_notes/4.5.0.txt +0 -34
  253. data/doc/release_notes/4.6.0.txt +0 -30
  254. data/doc/release_notes/4.7.0.txt +0 -103
  255. data/doc/release_notes/4.8.0.txt +0 -175
  256. data/doc/release_notes/4.9.0.txt +0 -190
  257. data/spec/adapter_spec.rb +0 -4
  258. data/spec/adapters/db2_spec.rb +0 -170
  259. data/spec/adapters/mssql_spec.rb +0 -804
  260. data/spec/adapters/mysql_spec.rb +0 -1041
  261. data/spec/adapters/oracle_spec.rb +0 -327
  262. data/spec/adapters/postgres_spec.rb +0 -4000
  263. data/spec/adapters/spec_helper.rb +0 -43
  264. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  265. data/spec/adapters/sqlite_spec.rb +0 -600
  266. data/spec/bin_spec.rb +0 -269
  267. data/spec/core/connection_pool_spec.rb +0 -1228
  268. data/spec/core/database_spec.rb +0 -2673
  269. data/spec/core/dataset_spec.rb +0 -5419
  270. data/spec/core/deprecated_spec.rb +0 -70
  271. data/spec/core/expression_filters_spec.rb +0 -1344
  272. data/spec/core/mock_adapter_spec.rb +0 -722
  273. data/spec/core/object_graph_spec.rb +0 -306
  274. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  275. data/spec/core/schema_generator_spec.rb +0 -214
  276. data/spec/core/schema_spec.rb +0 -1820
  277. data/spec/core/spec_helper.rb +0 -23
  278. data/spec/core/version_spec.rb +0 -7
  279. data/spec/core_extensions_spec.rb +0 -762
  280. data/spec/core_model_spec.rb +0 -2
  281. data/spec/core_spec.rb +0 -1
  282. data/spec/deprecation_helper.rb +0 -30
  283. data/spec/extensions/accessed_columns_spec.rb +0 -51
  284. data/spec/extensions/active_model_spec.rb +0 -99
  285. data/spec/extensions/after_initialize_spec.rb +0 -24
  286. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  287. data/spec/extensions/association_dependencies_spec.rb +0 -125
  288. data/spec/extensions/association_pks_spec.rb +0 -423
  289. data/spec/extensions/association_proxies_spec.rb +0 -100
  290. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  291. data/spec/extensions/auto_validations_spec.rb +0 -202
  292. data/spec/extensions/blacklist_security_spec.rb +0 -95
  293. data/spec/extensions/blank_spec.rb +0 -69
  294. data/spec/extensions/boolean_readers_spec.rb +0 -93
  295. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  296. data/spec/extensions/caching_spec.rb +0 -273
  297. data/spec/extensions/class_table_inheritance_spec.rb +0 -568
  298. data/spec/extensions/column_conflicts_spec.rb +0 -75
  299. data/spec/extensions/column_select_spec.rb +0 -129
  300. data/spec/extensions/columns_introspection_spec.rb +0 -90
  301. data/spec/extensions/columns_updated_spec.rb +0 -35
  302. data/spec/extensions/composition_spec.rb +0 -248
  303. data/spec/extensions/connection_expiration_spec.rb +0 -133
  304. data/spec/extensions/connection_validator_spec.rb +0 -127
  305. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  306. data/spec/extensions/constraint_validations_spec.rb +0 -395
  307. data/spec/extensions/core_refinements_spec.rb +0 -528
  308. data/spec/extensions/csv_serializer_spec.rb +0 -183
  309. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  310. data/spec/extensions/dataset_associations_spec.rb +0 -365
  311. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  312. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  313. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  314. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  315. data/spec/extensions/defaults_setter_spec.rb +0 -141
  316. data/spec/extensions/delay_add_association_spec.rb +0 -73
  317. data/spec/extensions/dirty_spec.rb +0 -189
  318. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  319. data/spec/extensions/eager_each_spec.rb +0 -62
  320. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  321. data/spec/extensions/error_splitter_spec.rb +0 -18
  322. data/spec/extensions/error_sql_spec.rb +0 -20
  323. data/spec/extensions/eval_inspect_spec.rb +0 -74
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -380
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -275
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -840
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -109
  348. data/spec/extensions/nested_attributes_spec.rb +0 -703
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
  356. data/spec/extensions/pg_enum_spec.rb +0 -113
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -487
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -182
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -868
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -61
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -410
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/timestamps_spec.rb +0 -209
  411. data/spec/extensions/to_dot_spec.rb +0 -153
  412. data/spec/extensions/touch_spec.rb +0 -226
  413. data/spec/extensions/tree_spec.rb +0 -284
  414. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  415. data/spec/extensions/unlimited_update_spec.rb +0 -21
  416. data/spec/extensions/update_or_create_spec.rb +0 -83
  417. data/spec/extensions/update_primary_key_spec.rb +0 -105
  418. data/spec/extensions/update_refresh_spec.rb +0 -59
  419. data/spec/extensions/uuid_spec.rb +0 -101
  420. data/spec/extensions/validate_associated_spec.rb +0 -52
  421. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  422. data/spec/extensions/validation_contexts_spec.rb +0 -31
  423. data/spec/extensions/validation_helpers_spec.rb +0 -525
  424. data/spec/extensions/whitelist_security_spec.rb +0 -157
  425. data/spec/extensions/xml_serializer_spec.rb +0 -213
  426. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  427. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  428. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  429. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  431. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  432. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  433. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  434. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  436. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  437. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  438. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  439. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  440. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  441. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  443. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  444. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  446. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  447. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  448. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  449. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  450. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  451. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  452. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  453. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  457. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  458. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  459. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  460. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  461. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  462. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  466. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  468. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  469. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  471. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  473. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  474. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  475. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  476. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  478. data/spec/guards_helper.rb +0 -58
  479. data/spec/integration/associations_test.rb +0 -2513
  480. data/spec/integration/database_test.rb +0 -113
  481. data/spec/integration/dataset_test.rb +0 -1880
  482. data/spec/integration/eager_loader_test.rb +0 -687
  483. data/spec/integration/migrator_test.rb +0 -262
  484. data/spec/integration/model_test.rb +0 -203
  485. data/spec/integration/plugin_test.rb +0 -2302
  486. data/spec/integration/prepared_statement_test.rb +0 -398
  487. data/spec/integration/schema_test.rb +0 -869
  488. data/spec/integration/spec_helper.rb +0 -64
  489. data/spec/integration/timezone_test.rb +0 -86
  490. data/spec/integration/transaction_test.rb +0 -354
  491. data/spec/integration/type_test.rb +0 -127
  492. data/spec/model/association_reflection_spec.rb +0 -803
  493. data/spec/model/associations_spec.rb +0 -4538
  494. data/spec/model/base_spec.rb +0 -817
  495. data/spec/model/class_dataset_methods_spec.rb +0 -146
  496. data/spec/model/dataset_methods_spec.rb +0 -198
  497. data/spec/model/eager_loading_spec.rb +0 -2262
  498. data/spec/model/hooks_spec.rb +0 -370
  499. data/spec/model/inflector_spec.rb +0 -26
  500. data/spec/model/model_spec.rb +0 -953
  501. data/spec/model/plugins_spec.rb +0 -318
  502. data/spec/model/record_spec.rb +0 -2107
  503. data/spec/model/spec_helper.rb +0 -45
  504. data/spec/model/validations_spec.rb +0 -193
  505. data/spec/model_no_assoc_spec.rb +0 -1
  506. data/spec/model_spec.rb +0 -1
  507. data/spec/plugin_spec.rb +0 -1
  508. data/spec/sequel_coverage.rb +0 -15
  509. data/spec/sequel_warning.rb +0 -4
  510. data/spec/spec_config.rb +0 -12
@@ -11,7 +11,7 @@ class Sequel::SingleConnectionPool < Sequel::ConnectionPool
11
11
 
12
12
  # Yield the connection if one has been made.
13
13
  def all_connections
14
- yield @conn.first if @conn
14
+ yield @conn.first unless @conn.empty?
15
15
  end
16
16
 
17
17
  # Disconnect the connection from the database.
@@ -11,10 +11,11 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
11
11
  attr_reader :max_size
12
12
 
13
13
  # An array of connections that are available for use by the pool.
14
+ # The calling code should already have the mutex before calling this.
14
15
  attr_reader :available_connections
15
16
 
16
- # A hash with thread keys and connection values for currently allocated
17
- # connections.
17
+ # A hash with thread keys and connection values for currently allocated connections.
18
+ # The calling code should already have the mutex before calling this.
18
19
  attr_reader :allocated
19
20
 
20
21
  # The following additional options are respected:
@@ -82,7 +83,7 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
82
83
  # is available or the timeout expires. If the timeout expires before a
83
84
  # connection can be acquired, a Sequel::PoolTimeout is raised.
84
85
  def hold(server=nil)
85
- t = Thread.current
86
+ t = Sequel.current
86
87
  if conn = owned_connection(t)
87
88
  return yield(conn)
88
89
  end
@@ -101,7 +102,12 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
101
102
  end
102
103
  raise
103
104
  ensure
104
- sync{release(t)} if conn
105
+ if conn
106
+ sync{release(t)}
107
+ if @connection_handling == :disconnect
108
+ disconnect_connection(conn)
109
+ end
110
+ end
105
111
  end
106
112
  end
107
113
 
@@ -146,11 +152,11 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
146
152
 
147
153
  until conn = assign_connection(thread)
148
154
  elapsed = Sequel.elapsed_seconds_since(timer)
155
+ # :nocov:
149
156
  raise_pool_timeout(elapsed) if elapsed > timeout
150
157
 
151
- # :nocov:
152
158
  # 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
159
+ # where a connection cannot be acquired even after the thread is signalled by the condition variable
154
160
  sync do
155
161
  @waiter.wait(@mutex, timeout - elapsed)
156
162
  if conn = next_available
@@ -166,16 +172,23 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
166
172
  # Assign a connection to the thread, or return nil if one cannot be assigned.
167
173
  # The caller should NOT have the mutex before calling this.
168
174
  def assign_connection(thread)
175
+ # Thread safe as instance variable is only assigned to local variable
176
+ # and not operated on outside mutex.
169
177
  allocated = @allocated
170
-
171
178
  do_make_new = false
179
+ to_disconnect = nil
180
+
172
181
  sync do
173
182
  if conn = next_available
174
183
  return(allocated[thread] = conn)
175
184
  end
176
185
 
177
186
  if (n = _size) >= (max = @max_size)
178
- allocated.keys.each{|t| release(t) unless t.alive?}
187
+ allocated.keys.each do |t|
188
+ unless t.alive?
189
+ (to_disconnect ||= []) << allocated.delete(t)
190
+ end
191
+ end
179
192
  n = nil
180
193
  end
181
194
 
@@ -184,6 +197,10 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
184
197
  end
185
198
  end
186
199
 
200
+ if to_disconnect
201
+ to_disconnect.each{|dconn| disconnect_connection(dconn)}
202
+ end
203
+
187
204
  # Connect to the database outside of the connection pool mutex,
188
205
  # as that can take a long time and the connection pool mutex
189
206
  # shouldn't be locked while the connection takes place.
@@ -252,9 +269,7 @@ class Sequel::ThreadedConnectionPool < Sequel::ConnectionPool
252
269
  def release(thread)
253
270
  conn = @allocated.delete(thread)
254
271
 
255
- if @connection_handling == :disconnect
256
- disconnect_connection(conn)
257
- else
272
+ unless @connection_handling == :disconnect
258
273
  checkin_connection(conn)
259
274
  end
260
275
 
@@ -30,7 +30,15 @@ module Sequel
30
30
  @split_symbols = false
31
31
  @single_threaded = false
32
32
 
33
- class << self
33
+ # Mutex used to protect mutable data structures
34
+ @data_mutex = Mutex.new
35
+
36
+ # Frozen hash used as the default options hash for most options.
37
+ OPTS = {}.freeze
38
+
39
+ SPLIT_SYMBOL_CACHE = {}
40
+
41
+ module SequelMethods
34
42
  # Sequel converts two digit years in <tt>Date</tt>s and <tt>DateTime</tt>s by default,
35
43
  # so 01/02/03 is interpreted at January 2nd, 2003, and 12/13/99 is interpreted
36
44
  # as December 13, 1999. You can override this to treat those dates as
@@ -44,13 +52,12 @@ module Sequel
44
52
  #
45
53
  # Sequel.datetime_class = DateTime
46
54
  #
47
- # Note that +Time+ and +DateTime+ objects
48
- # have a different API, and in cases where they implement the same methods,
49
- # they often implement them differently (e.g. + using seconds on +Time+ and
50
- # days on +DateTime+).
55
+ # Note that +Time+ and +DateTime+ objects have a different API, and in
56
+ # cases where they implement the same methods, they often implement them
57
+ # differently (e.g. + using seconds on +Time+ and days on +DateTime+).
51
58
  attr_accessor :datetime_class
52
59
 
53
- # Set whether Sequel is being used in single threaded mode. by default,
60
+ # Set whether Sequel is being used in single threaded mode. By default,
54
61
  # Sequel uses a thread-safe connection pool, which isn't as fast as the
55
62
  # single threaded connection pool, and also has some additional thread
56
63
  # safety checks. If your program will only have one thread,
@@ -58,361 +65,362 @@ module Sequel
58
65
  #
59
66
  # Sequel.single_threaded = true
60
67
  attr_accessor :single_threaded
61
- end
62
68
 
63
- # Returns true if the passed object could be a specifier of conditions, false otherwise.
64
- # Currently, Sequel considers hashes and arrays of two element arrays as
65
- # condition specifiers.
66
- #
67
- # Sequel.condition_specifier?({}) # => true
68
- # Sequel.condition_specifier?([[1, 2]]) # => true
69
- # Sequel.condition_specifier?([]) # => false
70
- # Sequel.condition_specifier?([1]) # => false
71
- # Sequel.condition_specifier?(1) # => false
72
- def self.condition_specifier?(obj)
73
- case obj
74
- when Hash
75
- true
76
- when Array
77
- !obj.empty? && !obj.is_a?(SQL::ValueList) && obj.all?{|i| i.is_a?(Array) && (i.length == 2)}
78
- else
79
- false
69
+ # Alias of original require method, as Sequel.require does a relative
70
+ # require for backwards compatibility.
71
+ alias orig_require require
72
+ private :orig_require
73
+
74
+ # Returns true if the passed object could be a specifier of conditions, false otherwise.
75
+ # Currently, Sequel considers hashes and arrays of two element arrays as
76
+ # condition specifiers.
77
+ #
78
+ # Sequel.condition_specifier?({}) # => true
79
+ # Sequel.condition_specifier?([[1, 2]]) # => true
80
+ # Sequel.condition_specifier?([]) # => false
81
+ # Sequel.condition_specifier?([1]) # => false
82
+ # Sequel.condition_specifier?(1) # => false
83
+ def condition_specifier?(obj)
84
+ case obj
85
+ when Hash
86
+ true
87
+ when Array
88
+ !obj.empty? && !obj.is_a?(SQL::ValueList) && obj.all?{|i| i.is_a?(Array) && (i.length == 2)}
89
+ else
90
+ false
91
+ end
80
92
  end
81
- end
82
93
 
83
- # Frozen hash used as the default options hash for most options.
84
- OPTS = {}.freeze
94
+ # Creates a new database object based on the supplied connection string
95
+ # and optional arguments. The specified scheme determines the database
96
+ # class used, and the rest of the string specifies the connection options.
97
+ # For example:
98
+ #
99
+ # DB = Sequel.connect('sqlite:/') # Memory database
100
+ # DB = Sequel.connect('sqlite://blog.db') # ./blog.db
101
+ # DB = Sequel.connect('sqlite:///blog.db') # /blog.db
102
+ # DB = Sequel.connect('postgres://user:password@host:port/database_name')
103
+ # DB = Sequel.connect('sqlite:///blog.db', max_connections: 10)
104
+ #
105
+ # You can also pass a single options hash:
106
+ #
107
+ # DB = Sequel.connect(adapter: 'sqlite', database: './blog.db')
108
+ #
109
+ # If a block is given, it is passed the opened +Database+ object, which is
110
+ # closed when the block exits. For example:
111
+ #
112
+ # Sequel.connect('sqlite://blog.db'){|db| puts db[:users].count}
113
+ #
114
+ # If a block is not given, a reference to this database will be held in
115
+ # <tt>Sequel::DATABASES</tt> until it is removed manually. This is by
116
+ # design, and used by <tt>Sequel::Model</tt> to pick the default
117
+ # database. It is recommended to pass a block if you do not want the
118
+ # resulting Database object to remain in memory until the process
119
+ # terminates, or use the <tt>keep_reference: false</tt> Database option.
120
+ #
121
+ # For details, see the {"Connecting to a Database" guide}[rdoc-ref:doc/opening_databases.rdoc].
122
+ # To set up a primary/replica or sharded database connection, see the {"Primary/Replica Database Configurations and Sharding" guide}[rdoc-ref:doc/sharding.rdoc].
123
+ def connect(*args, &block)
124
+ Database.connect(*args, &block)
125
+ end
85
126
 
86
- # Creates a new database object based on the supplied connection string
87
- # and optional arguments. The specified scheme determines the database
88
- # class used, and the rest of the string specifies the connection options.
89
- # For example:
90
- #
91
- # DB = Sequel.connect('sqlite:/') # Memory database
92
- # DB = Sequel.connect('sqlite://blog.db') # ./blog.db
93
- # DB = Sequel.connect('sqlite:///blog.db') # /blog.db
94
- # DB = Sequel.connect('postgres://user:password@host:port/database_name')
95
- # DB = Sequel.connect('sqlite:///blog.db', max_connections: 10)
96
- #
97
- # You can also pass a single options hash:
98
- #
99
- # DB = Sequel.connect(adapter: 'sqlite', database: './blog.db')
100
- #
101
- # If a block is given, it is passed the opened +Database+ object, which is
102
- # closed when the block exits. For example:
103
- #
104
- # Sequel.connect('sqlite://blog.db'){|db| puts db[:users].count}
105
- #
106
- # If a block is not given, a reference to this database will be held in
107
- # <tt>Sequel::DATABASES</tt> until it is removed manually. This is by
108
- # design, and used by <tt>Sequel::Model</tt> to pick the default
109
- # database. It is recommended to pass a block if you do not want the
110
- # resulting Database object to remain in memory until the process
111
- # terminates, or use the <tt>keep_reference: false</tt> Database option.
112
- #
113
- # For details, see the {"Connecting to a Database" guide}[rdoc-ref:doc/opening_databases.rdoc].
114
- # To set up a master/slave or sharded database connection, see the {"Master/Slave Databases and Sharding" guide}[rdoc-ref:doc/sharding.rdoc].
115
- def self.connect(*args, &block)
116
- Database.connect(*args, &block)
117
- end
127
+ # Assume the core extensions are not loaded by default, if the core_extensions
128
+ # extension is loaded, this will be overridden.
129
+ def core_extensions?
130
+ false
131
+ end
118
132
 
119
- # Assume the core extensions are not loaded by default, if the core_extensions
120
- # extension is loaded, this will be overridden.
121
- def self.core_extensions?
122
- false
123
- end
133
+ # Convert the +exception+ to the given class. The given class should be
134
+ # <tt>Sequel::Error</tt> or a subclass. Returns an instance of +klass+ with
135
+ # the message and backtrace of +exception+.
136
+ def convert_exception_class(exception, klass)
137
+ return exception if exception.is_a?(klass)
138
+ e = klass.new("#{exception.class}: #{exception.message}")
139
+ e.wrapped_exception = exception
140
+ e.set_backtrace(exception.backtrace)
141
+ e
142
+ end
124
143
 
125
- # Convert the +exception+ to the given class. The given class should be
126
- # <tt>Sequel::Error</tt> or a subclass. Returns an instance of +klass+ with
127
- # the message and backtrace of +exception+.
128
- def self.convert_exception_class(exception, klass)
129
- return exception if exception.is_a?(klass)
130
- e = klass.new("#{exception.class}: #{exception.message}")
131
- e.wrapped_exception = exception
132
- e.set_backtrace(exception.backtrace)
133
- e
134
- end
144
+ # The current concurrency primitive, Thread.current by default.
145
+ def current
146
+ Thread.current
147
+ end
135
148
 
136
- # Load all Sequel extensions given. Extensions are just files that exist under
137
- # <tt>sequel/extensions</tt> in the load path, and are just required.
138
- # In some cases, requiring an extension modifies classes directly, and in others,
139
- # it just loads a module that you can extend other classes with. Consult the documentation
140
- # for each extension you plan on using for usage.
141
- #
142
- # Sequel.extension(:blank)
143
- # Sequel.extension(:core_extensions, :named_timezones)
144
- def self.extension(*extensions)
145
- extensions.each{|e| Kernel.require "sequel/extensions/#{e}"}
146
- end
147
-
148
- # The exception classed raised if there is an error parsing JSON.
149
- # This can be overridden to use an alternative json implementation.
150
- def self.json_parser_error_class
151
- JSON::ParserError
152
- end
149
+ # Load all Sequel extensions given. Extensions are just files that exist under
150
+ # <tt>sequel/extensions</tt> in the load path, and are just required.
151
+ # In some cases, requiring an extension modifies classes directly, and in others,
152
+ # it just loads a module that you can extend other classes with. Consult the documentation
153
+ # for each extension you plan on using for usage.
154
+ #
155
+ # Sequel.extension(:blank)
156
+ # Sequel.extension(:core_extensions, :named_timezones)
157
+ def extension(*extensions)
158
+ extensions.each{|e| orig_require("sequel/extensions/#{e}")}
159
+ end
160
+
161
+ # The exception classed raised if there is an error parsing JSON.
162
+ # This can be overridden to use an alternative json implementation.
163
+ def json_parser_error_class
164
+ JSON::ParserError
165
+ end
153
166
 
154
- # Convert given object to json and return the result.
155
- # This can be overridden to use an alternative json implementation.
156
- def self.object_to_json(obj, *args, &block)
157
- obj.to_json(*args, &block)
158
- end
167
+ # Convert given object to json and return the result.
168
+ # This can be overridden to use an alternative json implementation.
169
+ def object_to_json(obj, *args, &block)
170
+ obj.to_json(*args, &block)
171
+ end
159
172
 
160
- # Parse the string as JSON and return the result.
161
- # This can be overridden to use an alternative json implementation.
162
- def self.parse_json(json)
163
- JSON.parse(json, :create_additions=>false)
164
- end
173
+ # Parse the string as JSON and return the result.
174
+ # This can be overridden to use an alternative json implementation.
175
+ def parse_json(json)
176
+ JSON.parse(json, :create_additions=>false)
177
+ end
165
178
 
166
- # Convert each item in the array to the correct type, handling multi-dimensional
167
- # arrays. For each element in the array or subarrays, call the converter,
168
- # unless the value is nil.
169
- def self.recursive_map(array, converter)
170
- array.map do |i|
171
- if i.is_a?(Array)
172
- recursive_map(i, converter)
173
- elsif !i.nil?
174
- converter.call(i)
179
+ # Convert each item in the array to the correct type, handling multi-dimensional
180
+ # arrays. For each element in the array or subarrays, call the converter,
181
+ # unless the value is nil.
182
+ def recursive_map(array, converter)
183
+ array.map do |i|
184
+ if i.is_a?(Array)
185
+ recursive_map(i, converter)
186
+ elsif !i.nil?
187
+ converter.call(i)
188
+ end
175
189
  end
176
190
  end
177
- end
178
191
 
179
- # For backwards compatibility only. require_relative should be used instead.
180
- def self.require(files, subdir=nil)
181
- # Use Kernel.require_relative to work around JRuby 9.0 bug
182
- Array(files).each{|f| Kernel.require_relative "#{"#{subdir}/" if subdir}#{f}"}
183
- end
184
-
185
- SPLIT_SYMBOL_CACHE = {}
192
+ # For backwards compatibility only. require_relative should be used instead.
193
+ def require(files, subdir=nil)
194
+ # Use Kernel.require_relative to work around JRuby 9.0 bug
195
+ Array(files).each{|f| Kernel.require_relative "#{"#{subdir}/" if subdir}#{f}"}
196
+ end
186
197
 
187
- # Splits the symbol into three parts, if symbol splitting is enabled (not the default).
188
- # Each part will either be a string or nil. If symbol splitting
189
- # is disabled, returns an array with the first and third parts
190
- # being nil, and the second part beind a string version of the symbol.
191
- #
192
- # For columns, these parts are the table, column, and alias.
193
- # For tables, these parts are the schema, table, and alias.
194
- def self.split_symbol(sym)
195
- unless v = Sequel.synchronize{SPLIT_SYMBOL_CACHE[sym]}
196
- if split_symbols?
197
- v = case s = sym.to_s
198
- when /\A((?:(?!__).)+)__((?:(?!___).)+)___(.+)\z/
199
- [$1.freeze, $2.freeze, $3.freeze].freeze
200
- when /\A((?:(?!___).)+)___(.+)\z/
201
- [nil, $1.freeze, $2.freeze].freeze
202
- when /\A((?:(?!__).)+)__(.+)\z/
203
- [$1.freeze, $2.freeze, nil].freeze
198
+ # Splits the symbol into three parts, if symbol splitting is enabled (not the default).
199
+ # Each part will either be a string or nil. If symbol splitting
200
+ # is disabled, returns an array with the first and third parts
201
+ # being nil, and the second part beind a string version of the symbol.
202
+ #
203
+ # For columns, these parts are the table, column, and alias.
204
+ # For tables, these parts are the schema, table, and alias.
205
+ def split_symbol(sym)
206
+ unless v = Sequel.synchronize{SPLIT_SYMBOL_CACHE[sym]}
207
+ if split_symbols?
208
+ v = case s = sym.to_s
209
+ when /\A((?:(?!__).)+)__((?:(?!___).)+)___(.+)\z/
210
+ [$1.freeze, $2.freeze, $3.freeze].freeze
211
+ when /\A((?:(?!___).)+)___(.+)\z/
212
+ [nil, $1.freeze, $2.freeze].freeze
213
+ when /\A((?:(?!__).)+)__(.+)\z/
214
+ [$1.freeze, $2.freeze, nil].freeze
215
+ else
216
+ [nil, s.freeze, nil].freeze
217
+ end
204
218
  else
205
- [nil, s.freeze, nil].freeze
219
+ v = [nil,sym.to_s.freeze,nil].freeze
206
220
  end
207
- else
208
- v = [nil,sym.to_s.freeze,nil].freeze
221
+ Sequel.synchronize{SPLIT_SYMBOL_CACHE[sym] = v}
209
222
  end
210
- Sequel.synchronize{SPLIT_SYMBOL_CACHE[sym] = v}
223
+ v
211
224
  end
212
- v
213
- end
214
225
 
215
- # Setting this to true enables Sequel's historical behavior of splitting
216
- # symbols on double or triple underscores:
217
- #
218
- # :table__column # table.column
219
- # :column___alias # column AS alias
220
- # :table__column___alias # table.column AS alias
221
- #
222
- # It is only recommended to turn this on for backwards compatibility until
223
- # such symbols have been converted to use newer Sequel APIs such as:
224
- #
225
- # Sequel[:table][:column] # table.column
226
- # Sequel[:column].as(:alias) # column AS alias
227
- # Sequel[:table][:column].as(:alias) # table.column AS alias
228
- #
229
- # Sequel::Database instances do their own caching of literalized
230
- # symbols, and changing this setting does not affect those caches. It is
231
- # recommended that if you want to change this setting, you do so directly
232
- # after requiring Sequel, before creating any Sequel::Database instances.
233
- #
234
- # Disabling symbol splitting will also disable the handling
235
- # of double underscores in virtual row methods, causing such methods to
236
- # yield regular identifers instead of qualified identifiers:
237
- #
238
- # # Sequel.split_symbols = true
239
- # Sequel.expr{table__column} # table.column
240
- # Sequel.expr{table[:column]} # table.column
241
- #
242
- # # Sequel.split_symbols = false
243
- # Sequel.expr{table__column} # table__column
244
- # Sequel.expr{table[:column]} # table.column
245
- def self.split_symbols=(v)
246
- Sequel.synchronize{SPLIT_SYMBOL_CACHE.clear}
247
- @split_symbols = v
248
- end
249
-
250
- # Whether Sequel currently splits symbols into qualified/aliased identifiers.
251
- def self.split_symbols?
252
- @split_symbols
253
- end
226
+ # Setting this to true enables Sequel's historical behavior of splitting
227
+ # symbols on double or triple underscores:
228
+ #
229
+ # :table__column # table.column
230
+ # :column___alias # column AS alias
231
+ # :table__column___alias # table.column AS alias
232
+ #
233
+ # It is only recommended to turn this on for backwards compatibility until
234
+ # such symbols have been converted to use newer Sequel APIs such as:
235
+ #
236
+ # Sequel[:table][:column] # table.column
237
+ # Sequel[:column].as(:alias) # column AS alias
238
+ # Sequel[:table][:column].as(:alias) # table.column AS alias
239
+ #
240
+ # Sequel::Database instances do their own caching of literalized
241
+ # symbols, and changing this setting does not affect those caches. It is
242
+ # recommended that if you want to change this setting, you do so directly
243
+ # after requiring Sequel, before creating any Sequel::Database instances.
244
+ #
245
+ # Disabling symbol splitting will also disable the handling
246
+ # of double underscores in virtual row methods, causing such methods to
247
+ # yield regular identifers instead of qualified identifiers:
248
+ #
249
+ # # Sequel.split_symbols = true
250
+ # Sequel.expr{table__column} # table.column
251
+ # Sequel.expr{table[:column]} # table.column
252
+ #
253
+ # # Sequel.split_symbols = false
254
+ # Sequel.expr{table__column} # table__column
255
+ # Sequel.expr{table[:column]} # table.column
256
+ def split_symbols=(v)
257
+ Sequel.synchronize{SPLIT_SYMBOL_CACHE.clear}
258
+ @split_symbols = v
259
+ end
254
260
 
255
- # Converts the given +string+ into a +Date+ object.
256
- #
257
- # Sequel.string_to_date('2010-09-10') # Date.civil(2010, 09, 10)
258
- def self.string_to_date(string)
259
- begin
260
- Date.parse(string, Sequel.convert_two_digit_years)
261
- rescue => e
262
- raise convert_exception_class(e, InvalidValue)
261
+ # Whether Sequel currently splits symbols into qualified/aliased identifiers.
262
+ def split_symbols?
263
+ @split_symbols
263
264
  end
264
- end
265
265
 
266
- # Converts the given +string+ into a +Time+ or +DateTime+ object, depending on the
267
- # value of <tt>Sequel.datetime_class</tt>.
268
- #
269
- # Sequel.string_to_datetime('2010-09-10 10:20:30') # Time.local(2010, 09, 10, 10, 20, 30)
270
- def self.string_to_datetime(string)
271
- begin
272
- if datetime_class == DateTime
273
- DateTime.parse(string, convert_two_digit_years)
274
- else
275
- datetime_class.parse(string)
266
+ # Converts the given +string+ into a +Date+ object.
267
+ #
268
+ # Sequel.string_to_date('2010-09-10') # Date.civil(2010, 09, 10)
269
+ def string_to_date(string)
270
+ begin
271
+ Date.parse(string, Sequel.convert_two_digit_years)
272
+ rescue => e
273
+ raise convert_exception_class(e, InvalidValue)
276
274
  end
277
- rescue => e
278
- raise convert_exception_class(e, InvalidValue)
279
275
  end
280
- end
281
276
 
282
- # Converts the given +string+ into a <tt>Sequel::SQLTime</tt> object.
283
- #
284
- # v = Sequel.string_to_time('10:20:30') # Sequel::SQLTime.parse('10:20:30')
285
- # DB.literal(v) # => '10:20:30'
286
- def self.string_to_time(string)
287
- begin
288
- SQLTime.parse(string)
289
- rescue => e
290
- raise convert_exception_class(e, InvalidValue)
277
+ # Converts the given +string+ into a +Time+ or +DateTime+ object, depending on the
278
+ # value of <tt>Sequel.datetime_class</tt>.
279
+ #
280
+ # Sequel.string_to_datetime('2010-09-10 10:20:30') # Time.local(2010, 09, 10, 10, 20, 30)
281
+ def string_to_datetime(string)
282
+ begin
283
+ if datetime_class == DateTime
284
+ DateTime.parse(string, convert_two_digit_years)
285
+ else
286
+ datetime_class.parse(string)
287
+ end
288
+ rescue => e
289
+ raise convert_exception_class(e, InvalidValue)
290
+ end
291
291
  end
292
- end
293
-
294
- # Mutex used to protect mutable data structures
295
- @data_mutex = Mutex.new
296
292
 
297
- # Unless in single threaded mode, protects access to any mutable
298
- # global data structure in Sequel.
299
- # Uses a non-reentrant mutex, so calling code should be careful.
300
- # In general, this should only be used around the minimal possible code
301
- # such as Hash#[], Hash#[]=, Hash#delete, Array#<<, and Array#delete.
302
- def self.synchronize(&block)
303
- @single_threaded ? yield : @data_mutex.synchronize(&block)
304
- end
305
-
306
- if RUBY_VERSION >= '2.1'
307
- # A timer object that can be passed to Sequel.elapsed_seconds_since
308
- # to return the number of seconds elapsed.
309
- def self.start_timer
310
- Process.clock_gettime(Process::CLOCK_MONOTONIC)
293
+ # Converts the given +string+ into a <tt>Sequel::SQLTime</tt> object.
294
+ #
295
+ # v = Sequel.string_to_time('10:20:30') # Sequel::SQLTime.parse('10:20:30')
296
+ # DB.literal(v) # => '10:20:30'
297
+ def string_to_time(string)
298
+ begin
299
+ SQLTime.parse(string)
300
+ rescue => e
301
+ raise convert_exception_class(e, InvalidValue)
302
+ end
311
303
  end
312
- else
313
- # :nocov:
314
- def self.start_timer # :nodoc:
315
- Time.now
304
+
305
+ # Unless in single threaded mode, protects access to any mutable
306
+ # global data structure in Sequel.
307
+ # Uses a non-reentrant mutex, so calling code should be careful.
308
+ # In general, this should only be used around the minimal possible code
309
+ # such as Hash#[], Hash#[]=, Hash#delete, Array#<<, and Array#delete.
310
+ def synchronize(&block)
311
+ @single_threaded ? yield : @data_mutex.synchronize(&block)
316
312
  end
317
- # :nocov:
318
- end
319
313
 
320
- # The elapsed seconds since the given timer object was created. The
321
- # timer object should have been created via Sequel.start_timer.
322
- def self.elapsed_seconds_since(timer)
323
- start_timer - timer
324
- end
314
+ if RUBY_VERSION >= '2.1'
315
+ # A timer object that can be passed to Sequel.elapsed_seconds_since
316
+ # to return the number of seconds elapsed.
317
+ def start_timer
318
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
319
+ end
320
+ else
321
+ # :nocov:
322
+ def start_timer # :nodoc:
323
+ Time.now
324
+ end
325
+ # :nocov:
326
+ end
325
327
 
326
- # Uses a transaction on all given databases with the given options. This:
327
- #
328
- # Sequel.transaction([DB1, DB2, DB3]){}
329
- #
330
- # is equivalent to:
331
- #
332
- # DB1.transaction do
333
- # DB2.transaction do
334
- # DB3.transaction do
335
- # end
336
- # end
337
- # end
338
- #
339
- # except that if Sequel::Rollback is raised by the block, the transaction is
340
- # rolled back on all databases instead of just the last one.
341
- #
342
- # Note that this method cannot guarantee that all databases will commit or
343
- # rollback. For example, if DB3 commits but attempting to commit on DB2
344
- # fails (maybe because foreign key checks are deferred), there is no way
345
- # to uncommit the changes on DB3. For that kind of support, you need to
346
- # have two-phase commit/prepared transactions (which Sequel supports on
347
- # some databases).
348
- def self.transaction(dbs, opts=OPTS, &block)
349
- unless opts[:rollback]
350
- rescue_rollback = true
351
- opts = Hash[opts].merge!(:rollback=>:reraise)
328
+ # The elapsed seconds since the given timer object was created. The
329
+ # timer object should have been created via Sequel.start_timer.
330
+ def elapsed_seconds_since(timer)
331
+ start_timer - timer
352
332
  end
353
- pr = dbs.reverse.inject(block){|bl, db| proc{db.transaction(opts, &bl)}}
354
- if rescue_rollback
355
- begin
333
+
334
+ # Uses a transaction on all given databases with the given options. This:
335
+ #
336
+ # Sequel.transaction([DB1, DB2, DB3]){}
337
+ #
338
+ # is equivalent to:
339
+ #
340
+ # DB1.transaction do
341
+ # DB2.transaction do
342
+ # DB3.transaction do
343
+ # end
344
+ # end
345
+ # end
346
+ #
347
+ # except that if Sequel::Rollback is raised by the block, the transaction is
348
+ # rolled back on all databases instead of just the last one.
349
+ #
350
+ # Note that this method cannot guarantee that all databases will commit or
351
+ # rollback. For example, if DB3 commits but attempting to commit on DB2
352
+ # fails (maybe because foreign key checks are deferred), there is no way
353
+ # to uncommit the changes on DB3. For that kind of support, you need to
354
+ # have two-phase commit/prepared transactions (which Sequel supports on
355
+ # some databases).
356
+ def transaction(dbs, opts=OPTS, &block)
357
+ unless opts[:rollback]
358
+ rescue_rollback = true
359
+ opts = Hash[opts].merge!(:rollback=>:reraise)
360
+ end
361
+ pr = dbs.reverse.inject(block){|bl, db| proc{db.transaction(opts, &bl)}}
362
+ if rescue_rollback
363
+ begin
364
+ pr.call
365
+ rescue Sequel::Rollback
366
+ nil
367
+ end
368
+ else
356
369
  pr.call
357
- rescue Sequel::Rollback
358
- nil
359
370
  end
360
- else
361
- pr.call
362
371
  end
363
- end
364
372
 
365
- # If the supplied block takes a single argument,
366
- # yield an <tt>SQL::VirtualRow</tt> instance to the block
367
- # argument. Otherwise, evaluate the block in the context of a
368
- # <tt>SQL::VirtualRow</tt> instance.
369
- #
370
- # Sequel.virtual_row{a} # Sequel::SQL::Identifier.new(:a)
371
- # Sequel.virtual_row{|o| o.a} # Sequel::SQL::Function.new(:a)
372
- def self.virtual_row(&block)
373
- vr = VIRTUAL_ROW
374
- case block.arity
375
- when -1, 0
376
- vr.instance_exec(&block)
377
- else
378
- block.call(vr)
379
- end
380
- end
373
+ # If the supplied block takes a single argument,
374
+ # yield an <tt>SQL::VirtualRow</tt> instance to the block
375
+ # argument. Otherwise, evaluate the block in the context of a
376
+ # <tt>SQL::VirtualRow</tt> instance.
377
+ #
378
+ # Sequel.virtual_row{a} # Sequel::SQL::Identifier.new(:a)
379
+ # Sequel.virtual_row{|o| o.a} # Sequel::SQL::Function.new(:a)
380
+ def virtual_row(&block)
381
+ vr = VIRTUAL_ROW
382
+ case block.arity
383
+ when -1, 0
384
+ vr.instance_exec(&block)
385
+ else
386
+ block.call(vr)
387
+ end
388
+ end
381
389
 
382
- ### Private Class Methods ###
390
+ private
383
391
 
384
- # Helper method that the database adapter class methods that are added to Sequel via
385
- # metaprogramming use to parse arguments.
386
- def self.adapter_method(adapter, *args, &block)
387
- options = args.last.is_a?(Hash) ? args.pop : {}
388
- opts = {:adapter => adapter.to_sym}
389
- opts[:database] = args.shift if args.first.is_a?(String)
390
- if args.any?
391
- raise ::Sequel::Error, "Wrong format of arguments, either use (), (String), (Hash), or (String, Hash)"
392
- end
392
+ # Helper method that the database adapter class methods that are added to Sequel via
393
+ # metaprogramming use to parse arguments.
394
+ def adapter_method(adapter, *args, &block)
395
+ options = args.last.is_a?(Hash) ? args.pop : OPTS
396
+ opts = {:adapter => adapter.to_sym}
397
+ opts[:database] = args.shift if args.first.is_a?(String)
398
+ if args.any?
399
+ raise ::Sequel::Error, "Wrong format of arguments, either use (), (String), (Hash), or (String, Hash)"
400
+ end
393
401
 
394
- connect(opts.merge(options), &block)
395
- end
402
+ connect(opts.merge(options), &block)
403
+ end
396
404
 
397
- # Method that adds a database adapter class method to Sequel that calls
398
- # Sequel.adapter_method.
399
- def self.def_adapter_method(*adapters) # :nodoc:
400
- adapters.each do |adapter|
401
- define_singleton_method(adapter){|*args, &block| adapter_method(adapter, *args, &block)}
405
+ # Method that adds a database adapter class method to Sequel that calls
406
+ # Sequel.adapter_method.
407
+ def def_adapter_method(*adapters) # :nodoc:
408
+ adapters.each do |adapter|
409
+ define_singleton_method(adapter){|*args, &block| adapter_method(adapter, *args, &block)}
410
+ end
402
411
  end
403
412
  end
404
-
405
- private_class_method :adapter_method, :def_adapter_method
406
-
407
- require_relative "deprecated"
408
- require_relative "sql"
409
- require_relative "connection_pool"
410
- require_relative "exceptions"
411
- require_relative "dataset"
412
- require_relative "database"
413
- require_relative "timezones"
414
- require_relative "ast_transformer"
415
- require_relative "version"
413
+ extend SequelMethods
414
+
415
+ require_relative "deprecated"
416
+ require_relative "sql"
417
+ require_relative "connection_pool"
418
+ require_relative "exceptions"
419
+ require_relative "dataset"
420
+ require_relative "database"
421
+ require_relative "timezones"
422
+ require_relative "ast_transformer"
423
+ require_relative "version"
416
424
 
417
425
  class << self
418
426
  # Allow nicer syntax for creating Sequel expressions: