sequel 4.49.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (477) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +70 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +3 -5
  6. data/doc/advanced_associations.rdoc +86 -163
  7. data/doc/association_basics.rdoc +197 -274
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +66 -43
  10. data/doc/code_order.rdoc +1 -8
  11. data/doc/core_extensions.rdoc +81 -56
  12. data/doc/dataset_basics.rdoc +8 -17
  13. data/doc/dataset_filtering.rdoc +81 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +73 -30
  16. data/doc/migration.rdoc +19 -36
  17. data/doc/model_dataset_method_design.rdoc +14 -17
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +10 -10
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +52 -70
  22. data/doc/opening_databases.rdoc +39 -32
  23. data/doc/postgresql.rdoc +48 -38
  24. data/doc/prepared_statements.rdoc +27 -22
  25. data/doc/querying.rdoc +173 -150
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/schema_modification.rdoc +63 -60
  29. data/doc/security.rdoc +97 -88
  30. data/doc/sharding.rdoc +43 -30
  31. data/doc/sql.rdoc +53 -65
  32. data/doc/testing.rdoc +3 -5
  33. data/doc/thread_safety.rdoc +2 -4
  34. data/doc/transactions.rdoc +18 -17
  35. data/doc/validations.rdoc +48 -45
  36. data/doc/virtual_rows.rdoc +87 -115
  37. data/lib/sequel.rb +1 -1
  38. data/lib/sequel/adapters/ado.rb +9 -25
  39. data/lib/sequel/adapters/ado/access.rb +7 -13
  40. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  41. data/lib/sequel/adapters/amalgalite.rb +3 -18
  42. data/lib/sequel/adapters/ibmdb.rb +9 -45
  43. data/lib/sequel/adapters/jdbc.rb +13 -73
  44. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  45. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  46. data/lib/sequel/adapters/jdbc/h2.rb +4 -25
  47. data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
  48. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  49. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  50. data/lib/sequel/adapters/jdbc/mysql.rb +1 -15
  51. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  52. data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
  53. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  54. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  55. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  56. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  57. data/lib/sequel/adapters/mock.rb +4 -30
  58. data/lib/sequel/adapters/mysql.rb +7 -44
  59. data/lib/sequel/adapters/mysql2.rb +5 -23
  60. data/lib/sequel/adapters/odbc.rb +0 -19
  61. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  62. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  63. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  64. data/lib/sequel/adapters/oracle.rb +7 -13
  65. data/lib/sequel/adapters/postgres.rb +13 -57
  66. data/lib/sequel/adapters/postgresql.rb +1 -1
  67. data/lib/sequel/adapters/shared/access.rb +11 -51
  68. data/lib/sequel/adapters/shared/db2.rb +3 -61
  69. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  70. data/lib/sequel/adapters/shared/mysql.rb +23 -224
  71. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  72. data/lib/sequel/adapters/shared/postgres.rb +44 -259
  73. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  74. data/lib/sequel/adapters/shared/sqlite.rb +12 -101
  75. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  76. data/lib/sequel/adapters/sqlite.rb +2 -19
  77. data/lib/sequel/adapters/tinytds.rb +5 -15
  78. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  79. data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -4
  80. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  81. data/lib/sequel/adapters/utils/replace.rb +0 -5
  82. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  83. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  84. data/lib/sequel/ast_transformer.rb +3 -94
  85. data/lib/sequel/connection_pool.rb +26 -28
  86. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  87. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  88. data/lib/sequel/connection_pool/single.rb +0 -2
  89. data/lib/sequel/connection_pool/threaded.rb +94 -110
  90. data/lib/sequel/core.rb +42 -101
  91. data/lib/sequel/database.rb +12 -2
  92. data/lib/sequel/database/connecting.rb +23 -60
  93. data/lib/sequel/database/dataset.rb +6 -9
  94. data/lib/sequel/database/dataset_defaults.rb +4 -48
  95. data/lib/sequel/database/features.rb +5 -4
  96. data/lib/sequel/database/logging.rb +2 -9
  97. data/lib/sequel/database/misc.rb +23 -55
  98. data/lib/sequel/database/query.rb +8 -13
  99. data/lib/sequel/database/schema_generator.rb +89 -64
  100. data/lib/sequel/database/schema_methods.rb +61 -79
  101. data/lib/sequel/database/transactions.rb +4 -24
  102. data/lib/sequel/dataset.rb +18 -10
  103. data/lib/sequel/dataset/actions.rb +53 -107
  104. data/lib/sequel/dataset/dataset_module.rb +3 -15
  105. data/lib/sequel/dataset/features.rb +30 -30
  106. data/lib/sequel/dataset/graph.rb +40 -49
  107. data/lib/sequel/dataset/misc.rb +12 -37
  108. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  109. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  110. data/lib/sequel/dataset/query.rb +71 -155
  111. data/lib/sequel/dataset/sql.rb +30 -225
  112. data/lib/sequel/deprecated.rb +18 -27
  113. data/lib/sequel/exceptions.rb +1 -17
  114. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  115. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  116. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  117. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  118. data/lib/sequel/extensions/connection_validator.rb +1 -1
  119. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  120. data/lib/sequel/extensions/core_extensions.rb +39 -49
  121. data/lib/sequel/extensions/core_refinements.rb +39 -45
  122. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  123. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  124. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  125. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  126. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  127. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  128. data/lib/sequel/extensions/from_block.rb +1 -35
  129. data/lib/sequel/extensions/graph_each.rb +2 -2
  130. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  131. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  132. data/lib/sequel/extensions/inflector.rb +4 -4
  133. data/lib/sequel/extensions/migration.rb +23 -40
  134. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  135. data/lib/sequel/extensions/null_dataset.rb +2 -8
  136. data/lib/sequel/extensions/pagination.rb +1 -17
  137. data/lib/sequel/extensions/pg_array.rb +20 -189
  138. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  139. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  140. data/lib/sequel/extensions/pg_inet.rb +2 -15
  141. data/lib/sequel/extensions/pg_interval.rb +1 -20
  142. data/lib/sequel/extensions/pg_json.rb +7 -27
  143. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  144. data/lib/sequel/extensions/pg_range.rb +6 -121
  145. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  146. data/lib/sequel/extensions/pg_row.rb +5 -77
  147. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  148. data/lib/sequel/extensions/query.rb +3 -4
  149. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  150. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  151. data/lib/sequel/extensions/select_remove.rb +3 -3
  152. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  153. data/lib/sequel/extensions/sql_comments.rb +2 -2
  154. data/lib/sequel/extensions/string_agg.rb +11 -8
  155. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  156. data/lib/sequel/model.rb +27 -62
  157. data/lib/sequel/model/associations.rb +128 -131
  158. data/lib/sequel/model/base.rb +171 -711
  159. data/lib/sequel/model/default_inflections.rb +1 -1
  160. data/lib/sequel/model/errors.rb +0 -3
  161. data/lib/sequel/model/exceptions.rb +2 -6
  162. data/lib/sequel/model/inflections.rb +1 -26
  163. data/lib/sequel/model/plugins.rb +1 -0
  164. data/lib/sequel/plugins/active_model.rb +2 -5
  165. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  166. data/lib/sequel/plugins/association_pks.rb +14 -28
  167. data/lib/sequel/plugins/association_proxies.rb +6 -7
  168. data/lib/sequel/plugins/auto_validations.rb +4 -4
  169. data/lib/sequel/plugins/before_after_save.rb +0 -43
  170. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  171. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  172. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  173. data/lib/sequel/plugins/caching.rb +5 -5
  174. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  175. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  176. data/lib/sequel/plugins/column_select.rb +2 -2
  177. data/lib/sequel/plugins/composition.rb +15 -24
  178. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  179. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  180. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  181. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  182. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  183. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  184. data/lib/sequel/plugins/finder.rb +16 -10
  185. data/lib/sequel/plugins/force_encoding.rb +1 -7
  186. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  187. data/lib/sequel/plugins/input_transformer.rb +10 -11
  188. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  189. data/lib/sequel/plugins/instance_filters.rb +5 -5
  190. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  191. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  192. data/lib/sequel/plugins/json_serializer.rb +19 -19
  193. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  194. data/lib/sequel/plugins/list.rb +6 -6
  195. data/lib/sequel/plugins/many_through_many.rb +11 -8
  196. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  197. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  198. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  199. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  200. data/lib/sequel/plugins/pg_row.rb +2 -11
  201. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  202. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  203. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  204. data/lib/sequel/plugins/serialization.rb +15 -33
  205. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  206. data/lib/sequel/plugins/sharding.rb +2 -8
  207. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  208. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  209. data/lib/sequel/plugins/static_cache.rb +8 -9
  210. data/lib/sequel/plugins/string_stripper.rb +3 -3
  211. data/lib/sequel/plugins/subclasses.rb +1 -1
  212. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  213. data/lib/sequel/plugins/table_select.rb +2 -2
  214. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  215. data/lib/sequel/plugins/timestamps.rb +6 -7
  216. data/lib/sequel/plugins/touch.rb +4 -8
  217. data/lib/sequel/plugins/tree.rb +3 -3
  218. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  219. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  220. data/lib/sequel/plugins/update_or_create.rb +3 -3
  221. data/lib/sequel/plugins/update_refresh.rb +3 -3
  222. data/lib/sequel/plugins/uuid.rb +7 -11
  223. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  224. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  225. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  226. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  227. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  228. data/lib/sequel/sql.rb +145 -276
  229. data/lib/sequel/timezones.rb +8 -22
  230. data/lib/sequel/version.rb +2 -2
  231. data/spec/adapter_spec.rb +1 -1
  232. data/spec/adapters/db2_spec.rb +2 -103
  233. data/spec/adapters/mssql_spec.rb +89 -68
  234. data/spec/adapters/mysql_spec.rb +101 -480
  235. data/spec/adapters/oracle_spec.rb +1 -9
  236. data/spec/adapters/postgres_spec.rb +312 -565
  237. data/spec/adapters/spec_helper.rb +12 -31
  238. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  239. data/spec/adapters/sqlite_spec.rb +8 -146
  240. data/spec/bin_spec.rb +11 -16
  241. data/spec/core/connection_pool_spec.rb +173 -74
  242. data/spec/core/database_spec.rb +64 -244
  243. data/spec/core/dataset_spec.rb +81 -415
  244. data/spec/core/deprecated_spec.rb +3 -3
  245. data/spec/core/expression_filters_spec.rb +37 -144
  246. data/spec/core/mock_adapter_spec.rb +176 -4
  247. data/spec/core/object_graph_spec.rb +11 -60
  248. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  249. data/spec/core/schema_generator_spec.rb +51 -40
  250. data/spec/core/schema_spec.rb +74 -77
  251. data/spec/core/spec_helper.rb +6 -24
  252. data/spec/core/version_spec.rb +1 -1
  253. data/spec/core_extensions_spec.rb +7 -83
  254. data/spec/core_model_spec.rb +2 -2
  255. data/spec/deprecation_helper.rb +2 -14
  256. data/spec/extensions/accessed_columns_spec.rb +1 -1
  257. data/spec/extensions/active_model_spec.rb +3 -3
  258. data/spec/extensions/after_initialize_spec.rb +1 -1
  259. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  260. data/spec/extensions/association_dependencies_spec.rb +1 -1
  261. data/spec/extensions/association_pks_spec.rb +4 -59
  262. data/spec/extensions/association_proxies_spec.rb +1 -1
  263. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  264. data/spec/extensions/auto_validations_spec.rb +1 -1
  265. data/spec/extensions/blacklist_security_spec.rb +1 -1
  266. data/spec/extensions/blank_spec.rb +1 -1
  267. data/spec/extensions/boolean_readers_spec.rb +1 -1
  268. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  269. data/spec/extensions/caching_spec.rb +1 -1
  270. data/spec/extensions/class_table_inheritance_spec.rb +35 -1086
  271. data/spec/extensions/column_conflicts_spec.rb +1 -1
  272. data/spec/extensions/column_select_spec.rb +4 -4
  273. data/spec/extensions/columns_introspection_spec.rb +1 -1
  274. data/spec/extensions/columns_updated_spec.rb +1 -1
  275. data/spec/extensions/composition_spec.rb +1 -7
  276. data/spec/extensions/connection_expiration_spec.rb +3 -3
  277. data/spec/extensions/connection_validator_spec.rb +3 -3
  278. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  279. data/spec/extensions/constraint_validations_spec.rb +1 -1
  280. data/spec/extensions/core_refinements_spec.rb +1 -3
  281. data/spec/extensions/csv_serializer_spec.rb +4 -9
  282. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  283. data/spec/extensions/dataset_associations_spec.rb +2 -1
  284. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  285. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  286. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  287. data/spec/extensions/defaults_setter_spec.rb +2 -2
  288. data/spec/extensions/delay_add_association_spec.rb +8 -9
  289. data/spec/extensions/dirty_spec.rb +1 -1
  290. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  291. data/spec/extensions/eager_each_spec.rb +2 -2
  292. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  293. data/spec/extensions/error_splitter_spec.rb +1 -1
  294. data/spec/extensions/error_sql_spec.rb +1 -1
  295. data/spec/extensions/eval_inspect_spec.rb +1 -1
  296. data/spec/extensions/finder_spec.rb +1 -1
  297. data/spec/extensions/force_encoding_spec.rb +2 -5
  298. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  299. data/spec/extensions/graph_each_spec.rb +5 -5
  300. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  301. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  302. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  303. data/spec/extensions/inflector_spec.rb +1 -1
  304. data/spec/extensions/input_transformer_spec.rb +7 -2
  305. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  306. data/spec/extensions/instance_filters_spec.rb +1 -1
  307. data/spec/extensions/instance_hooks_spec.rb +1 -95
  308. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  309. data/spec/extensions/json_serializer_spec.rb +1 -1
  310. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  311. data/spec/extensions/list_spec.rb +1 -1
  312. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  313. data/spec/extensions/many_through_many_spec.rb +1 -1
  314. data/spec/extensions/migration_spec.rb +2 -2
  315. data/spec/extensions/modification_detection_spec.rb +1 -1
  316. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  317. data/spec/extensions/named_timezones_spec.rb +3 -3
  318. data/spec/extensions/nested_attributes_spec.rb +1 -29
  319. data/spec/extensions/null_dataset_spec.rb +1 -11
  320. data/spec/extensions/optimistic_locking_spec.rb +1 -1
  321. data/spec/extensions/pagination_spec.rb +1 -1
  322. data/spec/extensions/pg_array_associations_spec.rb +4 -1
  323. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  324. data/spec/extensions/pg_array_spec.rb +3 -48
  325. data/spec/extensions/pg_enum_spec.rb +1 -1
  326. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  327. data/spec/extensions/pg_hstore_spec.rb +23 -32
  328. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_inet_spec.rb +1 -14
  330. data/spec/extensions/pg_interval_spec.rb +3 -13
  331. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  332. data/spec/extensions/pg_json_spec.rb +1 -13
  333. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  334. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_range_spec.rb +3 -88
  336. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  337. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  338. data/spec/extensions/pg_row_spec.rb +1 -44
  339. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  340. data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
  341. data/spec/extensions/prepared_statements_spec.rb +13 -48
  342. data/spec/extensions/pretty_table_spec.rb +1 -1
  343. data/spec/extensions/query_spec.rb +1 -12
  344. data/spec/extensions/rcte_tree_spec.rb +1 -1
  345. data/spec/extensions/round_timestamps_spec.rb +1 -5
  346. data/spec/extensions/s_spec.rb +1 -1
  347. data/spec/extensions/schema_caching_spec.rb +1 -1
  348. data/spec/extensions/schema_dumper_spec.rb +1 -1
  349. data/spec/extensions/select_remove_spec.rb +1 -1
  350. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  351. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  352. data/spec/extensions/serialization_spec.rb +2 -14
  353. data/spec/extensions/server_block_spec.rb +1 -1
  354. data/spec/extensions/server_logging_spec.rb +2 -2
  355. data/spec/extensions/sharding_spec.rb +1 -1
  356. data/spec/extensions/shared_caching_spec.rb +1 -28
  357. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  358. data/spec/extensions/singular_table_names_spec.rb +1 -1
  359. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  360. data/spec/extensions/spec_helper.rb +5 -27
  361. data/spec/extensions/split_array_nil_spec.rb +1 -1
  362. data/spec/extensions/split_values_spec.rb +1 -1
  363. data/spec/extensions/sql_comments_spec.rb +1 -1
  364. data/spec/extensions/sql_expr_spec.rb +1 -1
  365. data/spec/extensions/static_cache_spec.rb +1 -1
  366. data/spec/extensions/string_agg_spec.rb +2 -2
  367. data/spec/extensions/string_date_time_spec.rb +1 -1
  368. data/spec/extensions/string_stripper_spec.rb +1 -1
  369. data/spec/extensions/subclasses_spec.rb +1 -1
  370. data/spec/extensions/subset_conditions_spec.rb +1 -1
  371. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  372. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  373. data/spec/extensions/table_select_spec.rb +4 -4
  374. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  375. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  376. data/spec/extensions/timestamps_spec.rb +3 -3
  377. data/spec/extensions/to_dot_spec.rb +1 -1
  378. data/spec/extensions/touch_spec.rb +1 -1
  379. data/spec/extensions/tree_spec.rb +1 -1
  380. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  381. data/spec/extensions/unlimited_update_spec.rb +1 -1
  382. data/spec/extensions/update_or_create_spec.rb +1 -1
  383. data/spec/extensions/update_primary_key_spec.rb +4 -3
  384. data/spec/extensions/update_refresh_spec.rb +1 -1
  385. data/spec/extensions/uuid_spec.rb +10 -12
  386. data/spec/extensions/validate_associated_spec.rb +1 -1
  387. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  388. data/spec/extensions/validation_contexts_spec.rb +1 -1
  389. data/spec/extensions/validation_helpers_spec.rb +10 -44
  390. data/spec/extensions/whitelist_security_spec.rb +5 -5
  391. data/spec/extensions/xml_serializer_spec.rb +3 -3
  392. data/spec/guards_helper.rb +2 -1
  393. data/spec/integration/associations_test.rb +1 -23
  394. data/spec/integration/database_test.rb +7 -7
  395. data/spec/integration/dataset_test.rb +5 -47
  396. data/spec/integration/eager_loader_test.rb +1 -1
  397. data/spec/integration/migrator_test.rb +1 -1
  398. data/spec/integration/model_test.rb +4 -82
  399. data/spec/integration/plugin_test.rb +6 -22
  400. data/spec/integration/prepared_statement_test.rb +8 -88
  401. data/spec/integration/schema_test.rb +6 -6
  402. data/spec/integration/spec_helper.rb +13 -21
  403. data/spec/integration/timezone_test.rb +5 -5
  404. data/spec/integration/transaction_test.rb +3 -55
  405. data/spec/integration/type_test.rb +9 -9
  406. data/spec/model/association_reflection_spec.rb +24 -9
  407. data/spec/model/associations_spec.rb +124 -303
  408. data/spec/model/base_spec.rb +18 -137
  409. data/spec/model/class_dataset_methods_spec.rb +2 -20
  410. data/spec/model/dataset_methods_spec.rb +1 -20
  411. data/spec/model/eager_loading_spec.rb +17 -11
  412. data/spec/model/hooks_spec.rb +5 -300
  413. data/spec/model/inflector_spec.rb +1 -1
  414. data/spec/model/model_spec.rb +15 -320
  415. data/spec/model/plugins_spec.rb +2 -16
  416. data/spec/model/record_spec.rb +29 -121
  417. data/spec/model/spec_helper.rb +5 -15
  418. data/spec/model/validations_spec.rb +1 -1
  419. data/spec/sequel_warning.rb +1 -12
  420. metadata +8 -64
  421. data/doc/active_record.rdoc +0 -927
  422. data/lib/sequel/adapters/cubrid.rb +0 -160
  423. data/lib/sequel/adapters/do.rb +0 -166
  424. data/lib/sequel/adapters/do/mysql.rb +0 -69
  425. data/lib/sequel/adapters/do/postgres.rb +0 -46
  426. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  427. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  428. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  429. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  430. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  431. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  432. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  433. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  434. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  435. data/lib/sequel/adapters/shared/informix.rb +0 -63
  436. data/lib/sequel/adapters/shared/progress.rb +0 -40
  437. data/lib/sequel/adapters/swift.rb +0 -169
  438. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  439. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  440. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  441. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  442. data/lib/sequel/dataset/mutation.rb +0 -98
  443. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  444. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  445. data/lib/sequel/extensions/filter_having.rb +0 -65
  446. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  447. data/lib/sequel/extensions/meta_def.rb +0 -37
  448. data/lib/sequel/extensions/query_literals.rb +0 -86
  449. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  450. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  451. data/lib/sequel/extensions/set_overrides.rb +0 -82
  452. data/lib/sequel/no_core_ext.rb +0 -4
  453. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  454. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  455. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  456. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  457. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  458. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  459. data/lib/sequel/plugins/schema.rb +0 -84
  460. data/lib/sequel/plugins/scissors.rb +0 -37
  461. data/spec/core/dataset_mutation_spec.rb +0 -253
  462. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  463. data/spec/extensions/before_after_save_spec.rb +0 -40
  464. data/spec/extensions/filter_having_spec.rb +0 -42
  465. data/spec/extensions/from_block_spec.rb +0 -21
  466. data/spec/extensions/hash_aliases_spec.rb +0 -26
  467. data/spec/extensions/identifier_columns_spec.rb +0 -19
  468. data/spec/extensions/meta_def_spec.rb +0 -35
  469. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  470. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  471. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  472. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  473. data/spec/extensions/query_literals_spec.rb +0 -185
  474. data/spec/extensions/schema_spec.rb +0 -123
  475. data/spec/extensions/scissors_spec.rb +0 -27
  476. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  477. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -56,6 +56,4 @@ class Sequel::SingleConnectionPool < Sequel::ConnectionPool
56
56
  def preconnect(concurrent = nil)
57
57
  hold{}
58
58
  end
59
-
60
- CONNECTION_POOL__MAP[[true, false]] = self
61
59
  end
@@ -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
@@ -9,13 +9,16 @@
9
9
  #
10
10
  # DB = Sequel.sqlite # Memory database
11
11
  # DB = Sequel.sqlite('blog.db')
12
- # DB = Sequel.postgres('database_name', :user=>'user',
13
- # :password=>'password', :host=>'host', :port=>5432,
14
- # :max_connections=>10)
12
+ # DB = Sequel.postgres('database_name',
13
+ # user:'user',
14
+ # password: 'password',
15
+ # host: 'host'
16
+ # port: 5432,
17
+ # max_connections: 10)
15
18
  #
16
19
  # If a block is given to these methods, it is passed the opened Database
17
20
  # object, which is closed (disconnected) when the block exits, just
18
- # like a block passed to connect. For example:
21
+ # like a block passed to Sequel.connect. For example:
19
22
  #
20
23
  # Sequel.sqlite('blog.db'){|db| puts db[:users].count}
21
24
  #
@@ -24,7 +27,7 @@
24
27
  module Sequel
25
28
  @convert_two_digit_years = true
26
29
  @datetime_class = Time
27
- @split_symbols = :deprecated
30
+ @split_symbols = false
28
31
  @single_threaded = false
29
32
 
30
33
  class << self
@@ -41,16 +44,13 @@ module Sequel
41
44
  #
42
45
  # Sequel.datetime_class = DateTime
43
46
  #
44
- # For ruby versions less than 1.9.2, +Time+ has a limited range (1901 to
45
- # 2038), so if you use datetimes out of that range, you need to switch
46
- # to +DateTime+. Also, before 1.9.2, +Time+ can only handle local and UTC
47
- # times, not other timezones. Note that +Time+ and +DateTime+ objects
47
+ # Note that +Time+ and +DateTime+ objects
48
48
  # have a different API, and in cases where they implement the same methods,
49
49
  # they often implement them differently (e.g. + using seconds on +Time+ and
50
50
  # days on +DateTime+).
51
51
  attr_accessor :datetime_class
52
52
 
53
- # Set whether sequel is being used in single threaded mode. by default,
53
+ # Set whether Sequel is being used in single threaded mode. by default,
54
54
  # Sequel uses a thread-safe connection pool, which isn't as fast as the
55
55
  # single threaded connection pool, and also has some additional thread
56
56
  # safety checks. If your program will only have one thread,
@@ -92,11 +92,11 @@ module Sequel
92
92
  # DB = Sequel.connect('sqlite://blog.db') # ./blog.db
93
93
  # DB = Sequel.connect('sqlite:///blog.db') # /blog.db
94
94
  # DB = Sequel.connect('postgres://user:password@host:port/database_name')
95
- # DB = Sequel.connect('sqlite:///blog.db', :max_connections=>10)
95
+ # DB = Sequel.connect('sqlite:///blog.db', max_connections: 10)
96
96
  #
97
97
  # You can also pass a single options hash:
98
98
  #
99
- # DB = Sequel.connect(:adapter=>'sqlite', :database=>'./blog.db')
99
+ # DB = Sequel.connect(adapter: 'sqlite', database: './blog.db')
100
100
  #
101
101
  # If a block is given, it is passed the opened +Database+ object, which is
102
102
  # closed when the block exits. For example:
@@ -108,7 +108,7 @@ module Sequel
108
108
  # design, and used by <tt>Sequel::Model</tt> to pick the default
109
109
  # database. It is recommended to pass a block if you do not want the
110
110
  # resulting Database object to remain in memory until the process
111
- # terminates.
111
+ # terminates, or use the <tt>keep_reference: false</tt> Database option.
112
112
  #
113
113
  # For details, see the {"Connecting to a Database" guide}[rdoc-ref:doc/opening_databases.rdoc].
114
114
  # To set up a master/slave or sharded database connection, see the {"Master/Slave Databases and Sharding" guide}[rdoc-ref:doc/sharding.rdoc].
@@ -134,9 +134,7 @@ module Sequel
134
134
  end
135
135
 
136
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. Generally,
138
- # extensions modify the behavior of +Database+ and/or +Dataset+, but Sequel ships
139
- # with some extensions that modify other classes that exist for backwards compatibility.
137
+ # <tt>sequel/extensions</tt> in the load path, and are just required.
140
138
  # In some cases, requiring an extension modifies classes directly, and in others,
141
139
  # it just loads a module that you can extend other classes with. Consult the documentation
142
140
  # for each extension you plan on using for usage.
@@ -147,39 +145,6 @@ module Sequel
147
145
  extensions.each{|e| Kernel.require "sequel/extensions/#{e}"}
148
146
  end
149
147
 
150
- # Set the method to call on identifiers going into the database. This affects
151
- # the literalization of identifiers by calling this method on them before they are input.
152
- # Sequel upcases identifiers in all SQL strings for most databases, so to turn that off:
153
- #
154
- # Sequel.identifier_input_method = nil
155
- #
156
- # to downcase instead:
157
- #
158
- # Sequel.identifier_input_method = :downcase
159
- #
160
- # Other String instance methods work as well.
161
- def self.identifier_input_method=(value)
162
- # SEQUEL5: Remove
163
- Database.identifier_input_method = value
164
- end
165
-
166
- # Set the method to call on identifiers coming out of the database. This affects
167
- # the literalization of identifiers by calling this method on them when they are
168
- # retrieved from the database. Sequel downcases identifiers retrieved for most
169
- # databases, so to turn that off:
170
- #
171
- # Sequel.identifier_output_method = nil
172
- #
173
- # to upcase instead:
174
- #
175
- # Sequel.identifier_output_method = :upcase
176
- #
177
- # Other String instance methods work as well.
178
- def self.identifier_output_method=(value)
179
- # SEQUEL5: Remove
180
- Database.identifier_output_method = value
181
- end
182
-
183
148
  # The exception classed raised if there is an error parsing JSON.
184
149
  # This can be overridden to use an alternative json implementation.
185
150
  def self.json_parser_error_class
@@ -198,15 +163,6 @@ module Sequel
198
163
  JSON.parse(json, :create_additions=>false)
199
164
  end
200
165
 
201
- # Set whether to quote identifiers for all databases by default. By default,
202
- # Sequel quotes identifiers in all SQL strings, so to turn that off:
203
- #
204
- # Sequel.quote_identifiers = false
205
- def self.quote_identifiers=(value)
206
- # SEQUEL5: Remove
207
- Database.quote_identifiers = value
208
- end
209
-
210
166
  # Convert each item in the array to the correct type, handling multi-dimensional
211
167
  # arrays. For each element in the array or subarrays, call the converter,
212
168
  # unless the value is nil.
@@ -220,17 +176,15 @@ module Sequel
220
176
  end
221
177
  end
222
178
 
223
- # Require all given +files+ which should be in the same or a subdirectory of
224
- # this file. If a +subdir+ is given, assume all +files+ are in that subdir.
225
- # This is used to ensure that the files loaded are from the same version of
226
- # Sequel as this file.
179
+ # For backwards compatibility only. require_relative should be used instead.
227
180
  def self.require(files, subdir=nil)
228
- Array(files).each{|f| super("#{File.dirname(__FILE__).untaint}/#{"#{subdir}/" if subdir}#{f}")}
181
+ # Use Kernel.require_relative to work around JRuby 9.0 bug
182
+ Array(files).each{|f| Kernel.require_relative "#{"#{subdir}/" if subdir}#{f}"}
229
183
  end
230
184
 
231
185
  SPLIT_SYMBOL_CACHE = {}
232
186
 
233
- # Splits the symbol into three parts, if symbol splitting is enabled.
187
+ # Splits the symbol into three parts, if symbol splitting is enabled (not the default).
234
188
  # Each part will either be a string or nil. If symbol splitting
235
189
  # is disabled, returns an array with the first and third parts
236
190
  # being nil, and the second part beind a string version of the symbol.
@@ -239,22 +193,13 @@ module Sequel
239
193
  # For tables, these parts are the schema, table, and alias.
240
194
  def self.split_symbol(sym)
241
195
  unless v = Sequel.synchronize{SPLIT_SYMBOL_CACHE[sym]}
242
- if split = split_symbols?
196
+ if split_symbols?
243
197
  v = case s = sym.to_s
244
198
  when /\A((?:(?!__).)+)__((?:(?!___).)+)___(.+)\z/
245
- if split == :deprecated
246
- Sequel::Deprecation.deprecate("Symbol splitting", "Either set Sequel.split_symbols = true, or change #{sym.inspect} to Sequel.qualify(#{$1.inspect}, #{$2.inspect}).as(#{$3.inspect})")
247
- end
248
199
  [$1.freeze, $2.freeze, $3.freeze].freeze
249
200
  when /\A((?:(?!___).)+)___(.+)\z/
250
- if split == :deprecated
251
- Sequel::Deprecation.deprecate("Symbol splitting", "Either set Sequel.split_symbols = true, or change #{sym.inspect} to Sequel.identifier(#{$1.inspect}).as(#{$2.inspect})")
252
- end
253
201
  [nil, $1.freeze, $2.freeze].freeze
254
202
  when /\A((?:(?!__).)+)__(.+)\z/
255
- if split == :deprecated
256
- Sequel::Deprecation.deprecate("Symbol splitting", "Either set Sequel.split_symbols = true, or change #{sym.inspect} to Sequel.qualify(#{$1.inspect}, #{$2.inspect})")
257
- end
258
203
  [$1.freeze, $2.freeze, nil].freeze
259
204
  else
260
205
  [nil, s.freeze, nil].freeze
@@ -267,32 +212,28 @@ module Sequel
267
212
  v
268
213
  end
269
214
 
270
- # Sequel by default will split symbols, treating:
215
+ # Setting this to true enables Sequel's historical behavior of splitting
216
+ # symbols on double or triple underscores:
271
217
  #
272
218
  # :table__column # table.column
273
219
  # :column___alias # column AS alias
274
220
  # :table__column___alias # table.column AS alias
275
221
  #
276
- # This can cause problems if any identifiers in the database use a double
277
- # or triple underscore. When Sequel was first created, using symbols with
278
- # double or triple underscores was the only way to represent qualified or
279
- # aliased identifiers. Sequel now offers many ways to create qualified and
280
- # aliased identifiers, so there is less of a need for this now. This allows
281
- # you to turn off symbol splitting, potentially avoiding problems if you
282
- # have identifiers that use double underscores:
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:
283
224
  #
284
- # Sequel.split_symbols = false
225
+ # Sequel[:table][:column] # table.column
226
+ # Sequel[:column].as(:alias) # column AS alias
227
+ # Sequel[:table][:column].as(:alias) # table.column AS alias
285
228
  #
286
- # Note that Sequel::Database instances do their own caching of literalized
229
+ # Sequel::Database instances do their own caching of literalized
287
230
  # symbols, and changing this setting does not affect those caches. It is
288
231
  # recommended that if you want to change this setting, you do so directly
289
232
  # after requiring Sequel, before creating any Sequel::Database instances.
290
233
  #
291
- # Also note that disabling symbol splitting will also disable the handling
234
+ # Disabling symbol splitting will also disable the handling
292
235
  # of double underscores in virtual row methods, causing such methods to
293
- # yield regular identifers instead of qualified identifiers. To make sure
294
- # the code works when splitting symbols is both disabled and enabled, you
295
- # can use Sequel::SQL::Identifier#[].
236
+ # yield regular identifers instead of qualified identifiers:
296
237
  #
297
238
  # # Sequel.split_symbols = true
298
239
  # Sequel.expr{table__column} # table.column
@@ -356,6 +297,8 @@ module Sequel
356
297
  # Unless in single threaded mode, protects access to any mutable
357
298
  # global data structure in Sequel.
358
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.
359
302
  def self.synchronize(&block)
360
303
  @single_threaded ? yield : @data_mutex.synchronize(&block)
361
304
  end
@@ -433,18 +376,23 @@ module Sequel
433
376
 
434
377
  # Method that adds a database adapter class method to Sequel that calls
435
378
  # Sequel.adapter_method.
436
- #
437
- # Do not call this method with untrusted input, as that can result in
438
- # arbitrary code execution.
439
379
  def self.def_adapter_method(*adapters) # :nodoc:
440
380
  adapters.each do |adapter|
441
- instance_eval("def #{adapter}(*args, &block); adapter_method('#{adapter}', *args, &block) end", __FILE__, __LINE__)
381
+ define_singleton_method(adapter){|*args, &block| adapter_method(adapter, *args, &block)}
442
382
  end
443
383
  end
444
384
 
445
385
  private_class_method :adapter_method, :def_adapter_method
446
386
 
447
- require(%w"deprecated sql connection_pool exceptions dataset database timezones ast_transformer version")
387
+ require_relative "deprecated"
388
+ require_relative "sql"
389
+ require_relative "connection_pool"
390
+ require_relative "exceptions"
391
+ require_relative "dataset"
392
+ require_relative "database"
393
+ require_relative "timezones"
394
+ require_relative "ast_transformer"
395
+ require_relative "version"
448
396
 
449
397
  class << self
450
398
  # Allow nicer syntax for creating Sequel expressions:
@@ -452,17 +400,10 @@ module Sequel
452
400
  # Sequel[1] # => Sequel::SQL::NumericExpression: 1
453
401
  # Sequel["a"] # => Sequel::SQL::StringExpression: 'a'
454
402
  # Sequel[:a] # => Sequel::SQL::Identifier: "a"
455
- # Sequel[:a=>1] # => Sequel::SQL::BooleanExpression: ("a" = 1)
403
+ # Sequel[a: 1] # => Sequel::SQL::BooleanExpression: ("a" = 1)
456
404
  alias_method :[], :expr
457
405
  end
458
406
 
459
407
  # Add the database adapter class methods to Sequel via metaprogramming
460
408
  def_adapter_method(*Database::ADAPTERS)
461
-
462
- COLUMN_REF_RE1 = /\A((?:(?!__).)+)__((?:(?!___).)+)___(.+)\z/.freeze
463
- Sequel::Deprecation.deprecate_constant(self, :COLUMN_REF_RE1)
464
- COLUMN_REF_RE2 = /\A((?:(?!___).)+)___(.+)\z/.freeze
465
- Sequel::Deprecation.deprecate_constant(self, :COLUMN_REF_RE2)
466
- COLUMN_REF_RE3 = /\A((?:(?!__).)+)__(.+)\z/.freeze
467
- Sequel::Deprecation.deprecate_constant(self, :COLUMN_REF_RE3)
468
409
  end