sequel 4.36.0 → 5.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (760) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +548 -5749
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +265 -159
  5. data/bin/sequel +34 -12
  6. data/doc/advanced_associations.rdoc +228 -187
  7. data/doc/association_basics.rdoc +281 -291
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +86 -51
  10. data/doc/code_order.rdoc +25 -19
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/fork_safety.rdoc +84 -0
  16. data/doc/mass_assignment.rdoc +74 -31
  17. data/doc/migration.rdoc +59 -51
  18. data/doc/model_dataset_method_design.rdoc +129 -0
  19. data/doc/model_hooks.rdoc +15 -25
  20. data/doc/model_plugins.rdoc +12 -12
  21. data/doc/mssql_stored_procedures.rdoc +3 -3
  22. data/doc/object_model.rdoc +58 -68
  23. data/doc/opening_databases.rdoc +85 -95
  24. data/doc/postgresql.rdoc +263 -38
  25. data/doc/prepared_statements.rdoc +29 -24
  26. data/doc/querying.rdoc +189 -167
  27. data/doc/reflection.rdoc +5 -6
  28. data/doc/release_notes/5.0.0.txt +159 -0
  29. data/doc/release_notes/5.1.0.txt +31 -0
  30. data/doc/release_notes/5.10.0.txt +84 -0
  31. data/doc/release_notes/5.11.0.txt +83 -0
  32. data/doc/release_notes/5.12.0.txt +141 -0
  33. data/doc/release_notes/5.13.0.txt +27 -0
  34. data/doc/release_notes/5.14.0.txt +63 -0
  35. data/doc/release_notes/5.15.0.txt +39 -0
  36. data/doc/release_notes/5.16.0.txt +110 -0
  37. data/doc/release_notes/5.17.0.txt +31 -0
  38. data/doc/release_notes/5.18.0.txt +69 -0
  39. data/doc/release_notes/5.19.0.txt +28 -0
  40. data/doc/release_notes/5.2.0.txt +33 -0
  41. data/doc/release_notes/5.20.0.txt +89 -0
  42. data/doc/release_notes/5.21.0.txt +87 -0
  43. data/doc/release_notes/5.22.0.txt +48 -0
  44. data/doc/release_notes/5.23.0.txt +56 -0
  45. data/doc/release_notes/5.24.0.txt +56 -0
  46. data/doc/release_notes/5.25.0.txt +32 -0
  47. data/doc/release_notes/5.26.0.txt +35 -0
  48. data/doc/release_notes/5.27.0.txt +21 -0
  49. data/doc/release_notes/5.28.0.txt +16 -0
  50. data/doc/release_notes/5.29.0.txt +22 -0
  51. data/doc/release_notes/5.3.0.txt +121 -0
  52. data/doc/release_notes/5.30.0.txt +20 -0
  53. data/doc/release_notes/5.31.0.txt +148 -0
  54. data/doc/release_notes/5.32.0.txt +46 -0
  55. data/doc/release_notes/5.33.0.txt +24 -0
  56. data/doc/release_notes/5.34.0.txt +40 -0
  57. data/doc/release_notes/5.35.0.txt +56 -0
  58. data/doc/release_notes/5.36.0.txt +60 -0
  59. data/doc/release_notes/5.37.0.txt +30 -0
  60. data/doc/release_notes/5.38.0.txt +28 -0
  61. data/doc/release_notes/5.39.0.txt +19 -0
  62. data/doc/release_notes/5.4.0.txt +80 -0
  63. data/doc/release_notes/5.40.0.txt +40 -0
  64. data/doc/release_notes/5.41.0.txt +25 -0
  65. data/doc/release_notes/5.42.0.txt +136 -0
  66. data/doc/release_notes/5.43.0.txt +98 -0
  67. data/doc/release_notes/5.44.0.txt +32 -0
  68. data/doc/release_notes/5.45.0.txt +34 -0
  69. data/doc/release_notes/5.46.0.txt +87 -0
  70. data/doc/release_notes/5.47.0.txt +59 -0
  71. data/doc/release_notes/5.48.0.txt +14 -0
  72. data/doc/release_notes/5.49.0.txt +59 -0
  73. data/doc/release_notes/5.5.0.txt +61 -0
  74. data/doc/release_notes/5.50.0.txt +78 -0
  75. data/doc/release_notes/5.51.0.txt +47 -0
  76. data/doc/release_notes/5.52.0.txt +87 -0
  77. data/doc/release_notes/5.53.0.txt +23 -0
  78. data/doc/release_notes/5.54.0.txt +27 -0
  79. data/doc/release_notes/5.55.0.txt +21 -0
  80. data/doc/release_notes/5.56.0.txt +51 -0
  81. data/doc/release_notes/5.57.0.txt +23 -0
  82. data/doc/release_notes/5.58.0.txt +31 -0
  83. data/doc/release_notes/5.59.0.txt +73 -0
  84. data/doc/release_notes/5.6.0.txt +31 -0
  85. data/doc/release_notes/5.60.0.txt +22 -0
  86. data/doc/release_notes/5.61.0.txt +43 -0
  87. data/doc/release_notes/5.7.0.txt +108 -0
  88. data/doc/release_notes/5.8.0.txt +170 -0
  89. data/doc/release_notes/5.9.0.txt +99 -0
  90. data/doc/schema_modification.rdoc +95 -75
  91. data/doc/security.rdoc +109 -80
  92. data/doc/sharding.rdoc +74 -47
  93. data/doc/sql.rdoc +147 -122
  94. data/doc/testing.rdoc +43 -20
  95. data/doc/thread_safety.rdoc +2 -4
  96. data/doc/transactions.rdoc +97 -18
  97. data/doc/validations.rdoc +52 -50
  98. data/doc/virtual_rows.rdoc +90 -109
  99. data/lib/sequel/adapters/ado/access.rb +15 -17
  100. data/lib/sequel/adapters/ado/mssql.rb +6 -15
  101. data/lib/sequel/adapters/ado.rb +150 -20
  102. data/lib/sequel/adapters/amalgalite.rb +11 -23
  103. data/lib/sequel/adapters/ibmdb.rb +47 -55
  104. data/lib/sequel/adapters/jdbc/db2.rb +29 -39
  105. data/lib/sequel/adapters/jdbc/derby.rb +58 -54
  106. data/lib/sequel/adapters/jdbc/h2.rb +93 -35
  107. data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
  108. data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
  109. data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
  110. data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
  111. data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
  112. data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
  113. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
  114. data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
  115. data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
  116. data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
  117. data/lib/sequel/adapters/jdbc.rb +145 -130
  118. data/lib/sequel/adapters/mock.rb +100 -111
  119. data/lib/sequel/adapters/mysql.rb +114 -122
  120. data/lib/sequel/adapters/mysql2.rb +147 -63
  121. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  122. data/lib/sequel/adapters/odbc/mssql.rb +8 -14
  123. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  124. data/lib/sequel/adapters/odbc.rb +20 -25
  125. data/lib/sequel/adapters/oracle.rb +50 -56
  126. data/lib/sequel/adapters/postgres.rb +305 -327
  127. data/lib/sequel/adapters/postgresql.rb +1 -1
  128. data/lib/sequel/adapters/shared/access.rb +74 -78
  129. data/lib/sequel/adapters/shared/db2.rb +118 -71
  130. data/lib/sequel/adapters/shared/mssql.rb +301 -220
  131. data/lib/sequel/adapters/shared/mysql.rb +299 -217
  132. data/lib/sequel/adapters/shared/oracle.rb +226 -65
  133. data/lib/sequel/adapters/shared/postgres.rb +935 -395
  134. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
  135. data/lib/sequel/adapters/shared/sqlite.rb +447 -173
  136. data/lib/sequel/adapters/sqlanywhere.rb +48 -35
  137. data/lib/sequel/adapters/sqlite.rb +156 -111
  138. data/lib/sequel/adapters/tinytds.rb +30 -38
  139. data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
  140. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
  141. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
  142. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  143. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  144. data/lib/sequel/adapters/utils/replace.rb +1 -4
  145. data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
  146. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  147. data/lib/sequel/ast_transformer.rb +17 -89
  148. data/lib/sequel/connection_pool/sharded_single.rb +18 -15
  149. data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
  150. data/lib/sequel/connection_pool/single.rb +18 -13
  151. data/lib/sequel/connection_pool/threaded.rb +121 -120
  152. data/lib/sequel/connection_pool.rb +48 -29
  153. data/lib/sequel/core.rb +351 -301
  154. data/lib/sequel/database/connecting.rb +69 -57
  155. data/lib/sequel/database/dataset.rb +13 -5
  156. data/lib/sequel/database/dataset_defaults.rb +18 -102
  157. data/lib/sequel/database/features.rb +18 -4
  158. data/lib/sequel/database/logging.rb +12 -11
  159. data/lib/sequel/database/misc.rb +180 -122
  160. data/lib/sequel/database/query.rb +47 -27
  161. data/lib/sequel/database/schema_generator.rb +178 -84
  162. data/lib/sequel/database/schema_methods.rb +172 -97
  163. data/lib/sequel/database/transactions.rb +205 -44
  164. data/lib/sequel/database.rb +17 -2
  165. data/lib/sequel/dataset/actions.rb +339 -155
  166. data/lib/sequel/dataset/dataset_module.rb +46 -0
  167. data/lib/sequel/dataset/features.rb +90 -35
  168. data/lib/sequel/dataset/graph.rb +80 -58
  169. data/lib/sequel/dataset/misc.rb +137 -47
  170. data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
  171. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  172. data/lib/sequel/dataset/query.rb +530 -222
  173. data/lib/sequel/dataset/sql.rb +590 -368
  174. data/lib/sequel/dataset.rb +26 -16
  175. data/lib/sequel/deprecated.rb +12 -2
  176. data/lib/sequel/exceptions.rb +46 -16
  177. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  178. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  179. data/lib/sequel/extensions/_pretty_table.rb +2 -5
  180. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  181. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  182. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  183. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  184. data/lib/sequel/extensions/blank.rb +8 -0
  185. data/lib/sequel/extensions/caller_logging.rb +79 -0
  186. data/lib/sequel/extensions/columns_introspection.rb +4 -3
  187. data/lib/sequel/extensions/connection_expiration.rb +20 -10
  188. data/lib/sequel/extensions/connection_validator.rb +11 -10
  189. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  190. data/lib/sequel/extensions/constraint_validations.rb +62 -39
  191. data/lib/sequel/extensions/core_extensions.rb +42 -48
  192. data/lib/sequel/extensions/core_refinements.rb +80 -59
  193. data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
  194. data/lib/sequel/extensions/date_arithmetic.rb +98 -39
  195. data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
  196. data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
  197. data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
  198. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  199. data/lib/sequel/extensions/escaped_like.rb +100 -0
  200. data/lib/sequel/extensions/eval_inspect.rb +12 -15
  201. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  202. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  203. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  204. data/lib/sequel/extensions/from_block.rb +1 -34
  205. data/lib/sequel/extensions/graph_each.rb +4 -4
  206. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  207. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  208. data/lib/sequel/extensions/index_caching.rb +109 -0
  209. data/lib/sequel/extensions/inflector.rb +13 -5
  210. data/lib/sequel/extensions/integer64.rb +32 -0
  211. data/lib/sequel/extensions/is_distinct_from.rb +141 -0
  212. data/lib/sequel/extensions/looser_typecasting.rb +17 -8
  213. data/lib/sequel/extensions/migration.rb +119 -78
  214. data/lib/sequel/extensions/named_timezones.rb +88 -23
  215. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
  216. data/lib/sequel/extensions/null_dataset.rb +8 -8
  217. data/lib/sequel/extensions/pagination.rb +32 -29
  218. data/lib/sequel/extensions/pg_array.rb +221 -287
  219. data/lib/sequel/extensions/pg_array_ops.rb +17 -9
  220. data/lib/sequel/extensions/pg_enum.rb +63 -23
  221. data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
  222. data/lib/sequel/extensions/pg_hstore.rb +45 -54
  223. data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
  224. data/lib/sequel/extensions/pg_inet.rb +31 -12
  225. data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
  226. data/lib/sequel/extensions/pg_interval.rb +56 -29
  227. data/lib/sequel/extensions/pg_json.rb +417 -140
  228. data/lib/sequel/extensions/pg_json_ops.rb +270 -18
  229. data/lib/sequel/extensions/pg_loose_count.rb +4 -2
  230. data/lib/sequel/extensions/pg_multirange.rb +372 -0
  231. data/lib/sequel/extensions/pg_range.rb +131 -191
  232. data/lib/sequel/extensions/pg_range_ops.rb +42 -13
  233. data/lib/sequel/extensions/pg_row.rb +48 -81
  234. data/lib/sequel/extensions/pg_row_ops.rb +33 -14
  235. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  236. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  237. data/lib/sequel/extensions/query.rb +9 -7
  238. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  239. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  240. data/lib/sequel/extensions/s.rb +60 -0
  241. data/lib/sequel/extensions/schema_caching.rb +10 -1
  242. data/lib/sequel/extensions/schema_dumper.rb +71 -48
  243. data/lib/sequel/extensions/select_remove.rb +4 -4
  244. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  245. data/lib/sequel/extensions/server_block.rb +51 -27
  246. data/lib/sequel/extensions/split_array_nil.rb +4 -4
  247. data/lib/sequel/extensions/sql_comments.rb +119 -7
  248. data/lib/sequel/extensions/sql_expr.rb +2 -1
  249. data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
  250. data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
  251. data/lib/sequel/extensions/string_agg.rb +11 -8
  252. data/lib/sequel/extensions/string_date_time.rb +19 -23
  253. data/lib/sequel/extensions/symbol_aref.rb +55 -0
  254. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  255. data/lib/sequel/extensions/symbol_as.rb +23 -0
  256. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  257. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  258. data/lib/sequel/extensions/to_dot.rb +10 -4
  259. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  260. data/lib/sequel/model/associations.rb +1006 -284
  261. data/lib/sequel/model/base.rb +560 -805
  262. data/lib/sequel/model/dataset_module.rb +11 -10
  263. data/lib/sequel/model/default_inflections.rb +1 -1
  264. data/lib/sequel/model/errors.rb +10 -3
  265. data/lib/sequel/model/exceptions.rb +8 -10
  266. data/lib/sequel/model/inflections.rb +7 -20
  267. data/lib/sequel/model/plugins.rb +114 -0
  268. data/lib/sequel/model.rb +32 -82
  269. data/lib/sequel/plugins/active_model.rb +30 -14
  270. data/lib/sequel/plugins/after_initialize.rb +1 -1
  271. data/lib/sequel/plugins/association_dependencies.rb +25 -18
  272. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  273. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  274. data/lib/sequel/plugins/association_pks.rb +147 -70
  275. data/lib/sequel/plugins/association_proxies.rb +33 -9
  276. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  277. data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
  278. data/lib/sequel/plugins/auto_validations.rb +95 -28
  279. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  280. data/lib/sequel/plugins/before_after_save.rb +0 -42
  281. data/lib/sequel/plugins/blacklist_security.rb +21 -12
  282. data/lib/sequel/plugins/boolean_readers.rb +5 -5
  283. data/lib/sequel/plugins/boolean_subsets.rb +13 -8
  284. data/lib/sequel/plugins/caching.rb +25 -16
  285. data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
  286. data/lib/sequel/plugins/column_conflicts.rb +16 -3
  287. data/lib/sequel/plugins/column_encryption.rb +728 -0
  288. data/lib/sequel/plugins/column_select.rb +7 -5
  289. data/lib/sequel/plugins/columns_updated.rb +42 -0
  290. data/lib/sequel/plugins/composition.rb +42 -26
  291. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  292. data/lib/sequel/plugins/constraint_validations.rb +20 -14
  293. data/lib/sequel/plugins/csv_serializer.rb +56 -35
  294. data/lib/sequel/plugins/dataset_associations.rb +40 -17
  295. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  296. data/lib/sequel/plugins/defaults_setter.rb +65 -10
  297. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  298. data/lib/sequel/plugins/dirty.rb +62 -24
  299. data/lib/sequel/plugins/eager_each.rb +3 -3
  300. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  301. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  302. data/lib/sequel/plugins/enum.rb +124 -0
  303. data/lib/sequel/plugins/error_splitter.rb +17 -12
  304. data/lib/sequel/plugins/finder.rb +246 -0
  305. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  306. data/lib/sequel/plugins/force_encoding.rb +7 -12
  307. data/lib/sequel/plugins/hook_class_methods.rb +37 -54
  308. data/lib/sequel/plugins/input_transformer.rb +18 -10
  309. data/lib/sequel/plugins/insert_conflict.rb +76 -0
  310. data/lib/sequel/plugins/insert_returning_select.rb +2 -2
  311. data/lib/sequel/plugins/instance_filters.rb +10 -8
  312. data/lib/sequel/plugins/instance_hooks.rb +34 -17
  313. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  314. data/lib/sequel/plugins/inverted_subsets.rb +22 -13
  315. data/lib/sequel/plugins/json_serializer.rb +124 -64
  316. data/lib/sequel/plugins/lazy_attributes.rb +21 -14
  317. data/lib/sequel/plugins/list.rb +35 -21
  318. data/lib/sequel/plugins/many_through_many.rb +134 -21
  319. data/lib/sequel/plugins/modification_detection.rb +15 -5
  320. data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
  321. data/lib/sequel/plugins/nested_attributes.rb +61 -31
  322. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  323. data/lib/sequel/plugins/pg_array_associations.rb +103 -53
  324. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
  325. data/lib/sequel/plugins/pg_row.rb +5 -51
  326. data/lib/sequel/plugins/prepared_statements.rb +60 -72
  327. data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
  328. data/lib/sequel/plugins/rcte_tree.rb +68 -82
  329. data/lib/sequel/plugins/require_valid_schema.rb +67 -0
  330. data/lib/sequel/plugins/serialization.rb +43 -46
  331. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
  332. data/lib/sequel/plugins/sharding.rb +15 -10
  333. data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
  334. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  335. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  336. data/lib/sequel/plugins/split_values.rb +11 -6
  337. data/lib/sequel/plugins/sql_comments.rb +189 -0
  338. data/lib/sequel/plugins/static_cache.rb +77 -53
  339. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  340. data/lib/sequel/plugins/string_stripper.rb +3 -3
  341. data/lib/sequel/plugins/subclasses.rb +43 -10
  342. data/lib/sequel/plugins/subset_conditions.rb +15 -5
  343. data/lib/sequel/plugins/table_select.rb +2 -2
  344. data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
  345. data/lib/sequel/plugins/throw_failures.rb +110 -0
  346. data/lib/sequel/plugins/timestamps.rb +20 -8
  347. data/lib/sequel/plugins/touch.rb +19 -8
  348. data/lib/sequel/plugins/tree.rb +62 -32
  349. data/lib/sequel/plugins/typecast_on_load.rb +12 -4
  350. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  351. data/lib/sequel/plugins/unused_associations.rb +521 -0
  352. data/lib/sequel/plugins/update_or_create.rb +4 -4
  353. data/lib/sequel/plugins/update_primary_key.rb +1 -1
  354. data/lib/sequel/plugins/update_refresh.rb +26 -15
  355. data/lib/sequel/plugins/uuid.rb +7 -11
  356. data/lib/sequel/plugins/validate_associated.rb +18 -0
  357. data/lib/sequel/plugins/validation_class_methods.rb +38 -19
  358. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  359. data/lib/sequel/plugins/validation_helpers.rb +57 -41
  360. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  361. data/lib/sequel/plugins/xml_serializer.rb +30 -31
  362. data/lib/sequel/sql.rb +471 -331
  363. data/lib/sequel/timezones.rb +78 -47
  364. data/lib/sequel/version.rb +7 -2
  365. data/lib/sequel.rb +1 -1
  366. metadata +217 -521
  367. data/Rakefile +0 -164
  368. data/doc/active_record.rdoc +0 -928
  369. data/doc/release_notes/1.0.txt +0 -38
  370. data/doc/release_notes/1.1.txt +0 -143
  371. data/doc/release_notes/1.3.txt +0 -101
  372. data/doc/release_notes/1.4.0.txt +0 -53
  373. data/doc/release_notes/1.5.0.txt +0 -155
  374. data/doc/release_notes/2.0.0.txt +0 -298
  375. data/doc/release_notes/2.1.0.txt +0 -271
  376. data/doc/release_notes/2.10.0.txt +0 -328
  377. data/doc/release_notes/2.11.0.txt +0 -215
  378. data/doc/release_notes/2.12.0.txt +0 -534
  379. data/doc/release_notes/2.2.0.txt +0 -253
  380. data/doc/release_notes/2.3.0.txt +0 -88
  381. data/doc/release_notes/2.4.0.txt +0 -106
  382. data/doc/release_notes/2.5.0.txt +0 -137
  383. data/doc/release_notes/2.6.0.txt +0 -157
  384. data/doc/release_notes/2.7.0.txt +0 -166
  385. data/doc/release_notes/2.8.0.txt +0 -171
  386. data/doc/release_notes/2.9.0.txt +0 -97
  387. data/doc/release_notes/3.0.0.txt +0 -221
  388. data/doc/release_notes/3.1.0.txt +0 -406
  389. data/doc/release_notes/3.10.0.txt +0 -286
  390. data/doc/release_notes/3.11.0.txt +0 -254
  391. data/doc/release_notes/3.12.0.txt +0 -304
  392. data/doc/release_notes/3.13.0.txt +0 -210
  393. data/doc/release_notes/3.14.0.txt +0 -118
  394. data/doc/release_notes/3.15.0.txt +0 -78
  395. data/doc/release_notes/3.16.0.txt +0 -45
  396. data/doc/release_notes/3.17.0.txt +0 -58
  397. data/doc/release_notes/3.18.0.txt +0 -120
  398. data/doc/release_notes/3.19.0.txt +0 -67
  399. data/doc/release_notes/3.2.0.txt +0 -268
  400. data/doc/release_notes/3.20.0.txt +0 -41
  401. data/doc/release_notes/3.21.0.txt +0 -87
  402. data/doc/release_notes/3.22.0.txt +0 -39
  403. data/doc/release_notes/3.23.0.txt +0 -172
  404. data/doc/release_notes/3.24.0.txt +0 -420
  405. data/doc/release_notes/3.25.0.txt +0 -88
  406. data/doc/release_notes/3.26.0.txt +0 -88
  407. data/doc/release_notes/3.27.0.txt +0 -82
  408. data/doc/release_notes/3.28.0.txt +0 -304
  409. data/doc/release_notes/3.29.0.txt +0 -459
  410. data/doc/release_notes/3.3.0.txt +0 -192
  411. data/doc/release_notes/3.30.0.txt +0 -135
  412. data/doc/release_notes/3.31.0.txt +0 -146
  413. data/doc/release_notes/3.32.0.txt +0 -202
  414. data/doc/release_notes/3.33.0.txt +0 -157
  415. data/doc/release_notes/3.34.0.txt +0 -671
  416. data/doc/release_notes/3.35.0.txt +0 -144
  417. data/doc/release_notes/3.36.0.txt +0 -245
  418. data/doc/release_notes/3.37.0.txt +0 -338
  419. data/doc/release_notes/3.38.0.txt +0 -234
  420. data/doc/release_notes/3.39.0.txt +0 -237
  421. data/doc/release_notes/3.4.0.txt +0 -325
  422. data/doc/release_notes/3.40.0.txt +0 -73
  423. data/doc/release_notes/3.41.0.txt +0 -155
  424. data/doc/release_notes/3.42.0.txt +0 -74
  425. data/doc/release_notes/3.43.0.txt +0 -105
  426. data/doc/release_notes/3.44.0.txt +0 -152
  427. data/doc/release_notes/3.45.0.txt +0 -179
  428. data/doc/release_notes/3.46.0.txt +0 -122
  429. data/doc/release_notes/3.47.0.txt +0 -270
  430. data/doc/release_notes/3.48.0.txt +0 -477
  431. data/doc/release_notes/3.5.0.txt +0 -510
  432. data/doc/release_notes/3.6.0.txt +0 -366
  433. data/doc/release_notes/3.7.0.txt +0 -179
  434. data/doc/release_notes/3.8.0.txt +0 -151
  435. data/doc/release_notes/3.9.0.txt +0 -233
  436. data/doc/release_notes/4.0.0.txt +0 -262
  437. data/doc/release_notes/4.1.0.txt +0 -85
  438. data/doc/release_notes/4.10.0.txt +0 -226
  439. data/doc/release_notes/4.11.0.txt +0 -147
  440. data/doc/release_notes/4.12.0.txt +0 -105
  441. data/doc/release_notes/4.13.0.txt +0 -169
  442. data/doc/release_notes/4.14.0.txt +0 -68
  443. data/doc/release_notes/4.15.0.txt +0 -56
  444. data/doc/release_notes/4.16.0.txt +0 -36
  445. data/doc/release_notes/4.17.0.txt +0 -38
  446. data/doc/release_notes/4.18.0.txt +0 -36
  447. data/doc/release_notes/4.19.0.txt +0 -45
  448. data/doc/release_notes/4.2.0.txt +0 -129
  449. data/doc/release_notes/4.20.0.txt +0 -79
  450. data/doc/release_notes/4.21.0.txt +0 -94
  451. data/doc/release_notes/4.22.0.txt +0 -72
  452. data/doc/release_notes/4.23.0.txt +0 -65
  453. data/doc/release_notes/4.24.0.txt +0 -99
  454. data/doc/release_notes/4.25.0.txt +0 -181
  455. data/doc/release_notes/4.26.0.txt +0 -44
  456. data/doc/release_notes/4.27.0.txt +0 -78
  457. data/doc/release_notes/4.28.0.txt +0 -57
  458. data/doc/release_notes/4.29.0.txt +0 -41
  459. data/doc/release_notes/4.3.0.txt +0 -40
  460. data/doc/release_notes/4.30.0.txt +0 -37
  461. data/doc/release_notes/4.31.0.txt +0 -57
  462. data/doc/release_notes/4.32.0.txt +0 -132
  463. data/doc/release_notes/4.33.0.txt +0 -88
  464. data/doc/release_notes/4.34.0.txt +0 -86
  465. data/doc/release_notes/4.35.0.txt +0 -130
  466. data/doc/release_notes/4.36.0.txt +0 -116
  467. data/doc/release_notes/4.4.0.txt +0 -92
  468. data/doc/release_notes/4.5.0.txt +0 -34
  469. data/doc/release_notes/4.6.0.txt +0 -30
  470. data/doc/release_notes/4.7.0.txt +0 -103
  471. data/doc/release_notes/4.8.0.txt +0 -175
  472. data/doc/release_notes/4.9.0.txt +0 -190
  473. data/lib/sequel/adapters/cubrid.rb +0 -144
  474. data/lib/sequel/adapters/do/mysql.rb +0 -66
  475. data/lib/sequel/adapters/do/postgres.rb +0 -44
  476. data/lib/sequel/adapters/do/sqlite3.rb +0 -42
  477. data/lib/sequel/adapters/do.rb +0 -158
  478. data/lib/sequel/adapters/jdbc/as400.rb +0 -84
  479. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
  480. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
  481. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
  482. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
  483. data/lib/sequel/adapters/odbc/progress.rb +0 -10
  484. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  485. data/lib/sequel/adapters/shared/firebird.rb +0 -247
  486. data/lib/sequel/adapters/shared/informix.rb +0 -54
  487. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
  488. data/lib/sequel/adapters/shared/progress.rb +0 -40
  489. data/lib/sequel/adapters/swift/mysql.rb +0 -49
  490. data/lib/sequel/adapters/swift/postgres.rb +0 -47
  491. data/lib/sequel/adapters/swift/sqlite.rb +0 -49
  492. data/lib/sequel/adapters/swift.rb +0 -160
  493. data/lib/sequel/adapters/utils/pg_types.rb +0 -70
  494. data/lib/sequel/dataset/mutation.rb +0 -111
  495. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
  496. data/lib/sequel/extensions/filter_having.rb +0 -63
  497. data/lib/sequel/extensions/hash_aliases.rb +0 -49
  498. data/lib/sequel/extensions/meta_def.rb +0 -35
  499. data/lib/sequel/extensions/query_literals.rb +0 -84
  500. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
  501. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
  502. data/lib/sequel/extensions/set_overrides.rb +0 -76
  503. data/lib/sequel/no_core_ext.rb +0 -3
  504. data/lib/sequel/plugins/association_autoreloading.rb +0 -9
  505. data/lib/sequel/plugins/identifier_columns.rb +0 -47
  506. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
  507. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
  508. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
  509. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
  510. data/lib/sequel/plugins/schema.rb +0 -82
  511. data/lib/sequel/plugins/scissors.rb +0 -35
  512. data/spec/adapter_spec.rb +0 -4
  513. data/spec/adapters/db2_spec.rb +0 -160
  514. data/spec/adapters/firebird_spec.rb +0 -411
  515. data/spec/adapters/informix_spec.rb +0 -100
  516. data/spec/adapters/mssql_spec.rb +0 -733
  517. data/spec/adapters/mysql_spec.rb +0 -1319
  518. data/spec/adapters/oracle_spec.rb +0 -313
  519. data/spec/adapters/postgres_spec.rb +0 -3790
  520. data/spec/adapters/spec_helper.rb +0 -49
  521. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  522. data/spec/adapters/sqlite_spec.rb +0 -688
  523. data/spec/bin_spec.rb +0 -258
  524. data/spec/core/connection_pool_spec.rb +0 -1045
  525. data/spec/core/database_spec.rb +0 -2636
  526. data/spec/core/dataset_spec.rb +0 -5175
  527. data/spec/core/deprecated_spec.rb +0 -70
  528. data/spec/core/expression_filters_spec.rb +0 -1247
  529. data/spec/core/mock_adapter_spec.rb +0 -464
  530. data/spec/core/object_graph_spec.rb +0 -303
  531. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  532. data/spec/core/schema_generator_spec.rb +0 -203
  533. data/spec/core/schema_spec.rb +0 -1676
  534. data/spec/core/spec_helper.rb +0 -34
  535. data/spec/core/version_spec.rb +0 -7
  536. data/spec/core_extensions_spec.rb +0 -699
  537. data/spec/core_model_spec.rb +0 -2
  538. data/spec/core_spec.rb +0 -1
  539. data/spec/extensions/accessed_columns_spec.rb +0 -51
  540. data/spec/extensions/active_model_spec.rb +0 -85
  541. data/spec/extensions/after_initialize_spec.rb +0 -24
  542. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  543. data/spec/extensions/association_dependencies_spec.rb +0 -117
  544. data/spec/extensions/association_pks_spec.rb +0 -405
  545. data/spec/extensions/association_proxies_spec.rb +0 -86
  546. data/spec/extensions/auto_validations_spec.rb +0 -192
  547. data/spec/extensions/before_after_save_spec.rb +0 -40
  548. data/spec/extensions/blacklist_security_spec.rb +0 -88
  549. data/spec/extensions/blank_spec.rb +0 -69
  550. data/spec/extensions/boolean_readers_spec.rb +0 -93
  551. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  552. data/spec/extensions/caching_spec.rb +0 -270
  553. data/spec/extensions/class_table_inheritance_spec.rb +0 -444
  554. data/spec/extensions/column_conflicts_spec.rb +0 -60
  555. data/spec/extensions/column_select_spec.rb +0 -108
  556. data/spec/extensions/columns_introspection_spec.rb +0 -91
  557. data/spec/extensions/composition_spec.rb +0 -242
  558. data/spec/extensions/connection_expiration_spec.rb +0 -121
  559. data/spec/extensions/connection_validator_spec.rb +0 -127
  560. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
  561. data/spec/extensions/constraint_validations_spec.rb +0 -389
  562. data/spec/extensions/core_refinements_spec.rb +0 -519
  563. data/spec/extensions/csv_serializer_spec.rb +0 -180
  564. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  565. data/spec/extensions/dataset_associations_spec.rb +0 -343
  566. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  567. data/spec/extensions/date_arithmetic_spec.rb +0 -167
  568. data/spec/extensions/defaults_setter_spec.rb +0 -102
  569. data/spec/extensions/delay_add_association_spec.rb +0 -74
  570. data/spec/extensions/dirty_spec.rb +0 -180
  571. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
  572. data/spec/extensions/eager_each_spec.rb +0 -66
  573. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  574. data/spec/extensions/error_splitter_spec.rb +0 -18
  575. data/spec/extensions/error_sql_spec.rb +0 -20
  576. data/spec/extensions/eval_inspect_spec.rb +0 -73
  577. data/spec/extensions/filter_having_spec.rb +0 -40
  578. data/spec/extensions/force_encoding_spec.rb +0 -114
  579. data/spec/extensions/from_block_spec.rb +0 -21
  580. data/spec/extensions/graph_each_spec.rb +0 -119
  581. data/spec/extensions/hash_aliases_spec.rb +0 -24
  582. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  583. data/spec/extensions/identifier_columns_spec.rb +0 -17
  584. data/spec/extensions/inflector_spec.rb +0 -183
  585. data/spec/extensions/input_transformer_spec.rb +0 -54
  586. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  587. data/spec/extensions/instance_filters_spec.rb +0 -79
  588. data/spec/extensions/instance_hooks_spec.rb +0 -276
  589. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  590. data/spec/extensions/json_serializer_spec.rb +0 -304
  591. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  592. data/spec/extensions/list_spec.rb +0 -278
  593. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  594. data/spec/extensions/many_through_many_spec.rb +0 -2172
  595. data/spec/extensions/meta_def_spec.rb +0 -21
  596. data/spec/extensions/migration_spec.rb +0 -728
  597. data/spec/extensions/modification_detection_spec.rb +0 -80
  598. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  599. data/spec/extensions/named_timezones_spec.rb +0 -108
  600. data/spec/extensions/nested_attributes_spec.rb +0 -697
  601. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
  602. data/spec/extensions/null_dataset_spec.rb +0 -85
  603. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  604. data/spec/extensions/pagination_spec.rb +0 -118
  605. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  606. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  607. data/spec/extensions/pg_array_spec.rb +0 -390
  608. data/spec/extensions/pg_enum_spec.rb +0 -92
  609. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  610. data/spec/extensions/pg_hstore_spec.rb +0 -206
  611. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  612. data/spec/extensions/pg_inet_spec.rb +0 -52
  613. data/spec/extensions/pg_interval_spec.rb +0 -76
  614. data/spec/extensions/pg_json_ops_spec.rb +0 -275
  615. data/spec/extensions/pg_json_spec.rb +0 -218
  616. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  617. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  618. data/spec/extensions/pg_range_spec.rb +0 -473
  619. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  620. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  621. data/spec/extensions/pg_row_spec.rb +0 -360
  622. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  623. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  624. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  625. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  626. data/spec/extensions/prepared_statements_spec.rb +0 -103
  627. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  628. data/spec/extensions/pretty_table_spec.rb +0 -92
  629. data/spec/extensions/query_literals_spec.rb +0 -183
  630. data/spec/extensions/query_spec.rb +0 -102
  631. data/spec/extensions/rcte_tree_spec.rb +0 -392
  632. data/spec/extensions/round_timestamps_spec.rb +0 -43
  633. data/spec/extensions/schema_caching_spec.rb +0 -41
  634. data/spec/extensions/schema_dumper_spec.rb +0 -814
  635. data/spec/extensions/schema_spec.rb +0 -117
  636. data/spec/extensions/scissors_spec.rb +0 -26
  637. data/spec/extensions/select_remove_spec.rb +0 -38
  638. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  639. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  640. data/spec/extensions/serialization_spec.rb +0 -362
  641. data/spec/extensions/server_block_spec.rb +0 -90
  642. data/spec/extensions/server_logging_spec.rb +0 -45
  643. data/spec/extensions/set_overrides_spec.rb +0 -61
  644. data/spec/extensions/sharding_spec.rb +0 -198
  645. data/spec/extensions/shared_caching_spec.rb +0 -175
  646. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  647. data/spec/extensions/singular_table_names_spec.rb +0 -22
  648. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  649. data/spec/extensions/spec_helper.rb +0 -71
  650. data/spec/extensions/split_array_nil_spec.rb +0 -24
  651. data/spec/extensions/split_values_spec.rb +0 -22
  652. data/spec/extensions/sql_comments_spec.rb +0 -27
  653. data/spec/extensions/sql_expr_spec.rb +0 -60
  654. data/spec/extensions/static_cache_spec.rb +0 -361
  655. data/spec/extensions/string_agg_spec.rb +0 -85
  656. data/spec/extensions/string_date_time_spec.rb +0 -95
  657. data/spec/extensions/string_stripper_spec.rb +0 -68
  658. data/spec/extensions/subclasses_spec.rb +0 -66
  659. data/spec/extensions/subset_conditions_spec.rb +0 -38
  660. data/spec/extensions/table_select_spec.rb +0 -71
  661. data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
  662. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  663. data/spec/extensions/timestamps_spec.rb +0 -175
  664. data/spec/extensions/to_dot_spec.rb +0 -154
  665. data/spec/extensions/touch_spec.rb +0 -203
  666. data/spec/extensions/tree_spec.rb +0 -274
  667. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  668. data/spec/extensions/unlimited_update_spec.rb +0 -20
  669. data/spec/extensions/update_or_create_spec.rb +0 -87
  670. data/spec/extensions/update_primary_key_spec.rb +0 -100
  671. data/spec/extensions/update_refresh_spec.rb +0 -53
  672. data/spec/extensions/uuid_spec.rb +0 -106
  673. data/spec/extensions/validate_associated_spec.rb +0 -52
  674. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  675. data/spec/extensions/validation_helpers_spec.rb +0 -554
  676. data/spec/extensions/xml_serializer_spec.rb +0 -207
  677. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  678. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  679. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  680. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  681. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  682. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  683. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  684. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  685. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  686. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  687. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  688. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  689. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  690. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  691. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  692. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  693. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  694. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  695. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  696. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  697. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  698. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  699. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  700. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  701. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  702. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  703. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  704. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  705. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  706. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  707. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  708. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  709. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  710. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  711. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  712. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  713. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  714. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  715. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  716. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  717. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  718. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  719. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  720. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  721. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  722. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  723. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  724. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  725. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  726. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  727. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  728. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  729. data/spec/guards_helper.rb +0 -55
  730. data/spec/integration/associations_test.rb +0 -2506
  731. data/spec/integration/database_test.rb +0 -113
  732. data/spec/integration/dataset_test.rb +0 -1858
  733. data/spec/integration/eager_loader_test.rb +0 -687
  734. data/spec/integration/migrator_test.rb +0 -262
  735. data/spec/integration/model_test.rb +0 -230
  736. data/spec/integration/plugin_test.rb +0 -2297
  737. data/spec/integration/prepared_statement_test.rb +0 -467
  738. data/spec/integration/schema_test.rb +0 -815
  739. data/spec/integration/spec_helper.rb +0 -56
  740. data/spec/integration/timezone_test.rb +0 -86
  741. data/spec/integration/transaction_test.rb +0 -406
  742. data/spec/integration/type_test.rb +0 -133
  743. data/spec/model/association_reflection_spec.rb +0 -565
  744. data/spec/model/associations_spec.rb +0 -4589
  745. data/spec/model/base_spec.rb +0 -759
  746. data/spec/model/class_dataset_methods_spec.rb +0 -150
  747. data/spec/model/dataset_methods_spec.rb +0 -149
  748. data/spec/model/eager_loading_spec.rb +0 -2197
  749. data/spec/model/hooks_spec.rb +0 -604
  750. data/spec/model/inflector_spec.rb +0 -26
  751. data/spec/model/model_spec.rb +0 -1097
  752. data/spec/model/plugins_spec.rb +0 -299
  753. data/spec/model/record_spec.rb +0 -2162
  754. data/spec/model/spec_helper.rb +0 -46
  755. data/spec/model/validations_spec.rb +0 -193
  756. data/spec/model_no_assoc_spec.rb +0 -1
  757. data/spec/model_spec.rb +0 -1
  758. data/spec/plugin_spec.rb +0 -1
  759. data/spec/sequel_coverage.rb +0 -15
  760. data/spec/spec_config.rb +0 -10
data/lib/sequel/core.rb CHANGED
@@ -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,11 +27,18 @@
24
27
  module Sequel
25
28
  @convert_two_digit_years = true
26
29
  @datetime_class = Time
27
-
28
- # Whether Sequel is being run in single threaded mode
30
+ @split_symbols = false
29
31
  @single_threaded = false
30
32
 
31
- 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
32
42
  # Sequel converts two digit years in <tt>Date</tt>s and <tt>DateTime</tt>s by default,
33
43
  # so 01/02/03 is interpreted at January 2nd, 2003, and 12/13/99 is interpreted
34
44
  # as December 13, 1999. You can override this to treat those dates as
@@ -42,237 +52,242 @@ module Sequel
42
52
  #
43
53
  # Sequel.datetime_class = DateTime
44
54
  #
45
- # For ruby versions less than 1.9.2, +Time+ has a limited range (1901 to
46
- # 2038), so if you use datetimes out of that range, you need to switch
47
- # to +DateTime+. Also, before 1.9.2, +Time+ can only handle local and UTC
48
- # times, not other timezones. Note that +Time+ and +DateTime+ objects
49
- # have a different API, and in cases where they implement the same methods,
50
- # they often implement them differently (e.g. + using seconds on +Time+ and
51
- # 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+).
52
58
  attr_accessor :datetime_class
53
- end
54
59
 
55
- # Returns true if the passed object could be a specifier of conditions, false otherwise.
56
- # Currently, Sequel considers hashes and arrays of two element arrays as
57
- # condition specifiers.
58
- #
59
- # Sequel.condition_specifier?({}) # => true
60
- # Sequel.condition_specifier?([[1, 2]]) # => true
61
- # Sequel.condition_specifier?([]) # => false
62
- # Sequel.condition_specifier?([1]) # => false
63
- # Sequel.condition_specifier?(1) # => false
64
- def self.condition_specifier?(obj)
65
- case obj
66
- when Hash
67
- true
68
- when Array
69
- !obj.empty? && !obj.is_a?(SQL::ValueList) && obj.all?{|i| i.is_a?(Array) && (i.length == 2)}
70
- else
71
- false
72
- end
73
- end
60
+ # Set whether Sequel is being used in single threaded mode. By default,
61
+ # Sequel uses a thread-safe connection pool, which isn't as fast as the
62
+ # single threaded connection pool, and also has some additional thread
63
+ # safety checks. If your program will only have one thread,
64
+ # and speed is a priority, you should set this to true:
65
+ #
66
+ # Sequel.single_threaded = true
67
+ attr_accessor :single_threaded
74
68
 
75
- # Frozen hash used as the default options hash for most options.
76
- OPTS = {}.freeze
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
77
73
 
78
- # Creates a new database object based on the supplied connection string
79
- # and optional arguments. The specified scheme determines the database
80
- # class used, and the rest of the string specifies the connection options.
81
- # For example:
82
- #
83
- # DB = Sequel.connect('sqlite:/') # Memory database
84
- # DB = Sequel.connect('sqlite://blog.db') # ./blog.db
85
- # DB = Sequel.connect('sqlite:///blog.db') # /blog.db
86
- # DB = Sequel.connect('postgres://user:password@host:port/database_name')
87
- # DB = Sequel.connect('sqlite:///blog.db', :max_connections=>10)
88
- #
89
- # You can also pass a single options hash:
90
- #
91
- # DB = Sequel.connect(:adapter=>'sqlite', :database=>'./blog.db')
92
- #
93
- # If a block is given, it is passed the opened +Database+ object, which is
94
- # closed when the block exits. For example:
95
- #
96
- # Sequel.connect('sqlite://blog.db'){|db| puts db[:users].count}
97
- #
98
- # If a block is not given, a reference to this database will be held in
99
- # <tt>Sequel::DATABASES</tt> until it is removed manually. This is by
100
- # design, and used by <tt>Sequel::Model</tt> to pick the default
101
- # database. It is recommended to pass a block if you do not want the
102
- # resulting Database object to remain in memory until the process
103
- # terminates.
104
- #
105
- # For details, see the {"Connecting to a Database" guide}[rdoc-ref:doc/opening_databases.rdoc].
106
- # To set up a master/slave or sharded database connection, see the {"Master/Slave Databases and Sharding" guide}[rdoc-ref:doc/sharding.rdoc].
107
- def self.connect(*args, &block)
108
- Database.connect(*args, &block)
109
- end
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
92
+ end
110
93
 
111
- # Assume the core extensions are not loaded by default, if the core_extensions
112
- # extension is loaded, this will be overridden.
113
- def self.core_extensions?
114
- false
115
- end
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
116
126
 
117
- # Convert the +exception+ to the given class. The given class should be
118
- # <tt>Sequel::Error</tt> or a subclass. Returns an instance of +klass+ with
119
- # the message and backtrace of +exception+.
120
- def self.convert_exception_class(exception, klass)
121
- return exception if exception.is_a?(klass)
122
- e = klass.new("#{exception.class}: #{exception.message}")
123
- e.wrapped_exception = exception
124
- e.set_backtrace(exception.backtrace)
125
- e
126
- 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
127
132
 
128
- # Load all Sequel extensions given. Extensions are just files that exist under
129
- # <tt>sequel/extensions</tt> in the load path, and are just required. Generally,
130
- # extensions modify the behavior of +Database+ and/or +Dataset+, but Sequel ships
131
- # with some extensions that modify other classes that exist for backwards compatibility.
132
- # In some cases, requiring an extension modifies classes directly, and in others,
133
- # it just loads a module that you can extend other classes with. Consult the documentation
134
- # for each extension you plan on using for usage.
135
- #
136
- # Sequel.extension(:schema_dumper)
137
- # Sequel.extension(:pagination, :query)
138
- def self.extension(*extensions)
139
- extensions.each{|e| Kernel.require "sequel/extensions/#{e}"}
140
- end
141
-
142
- # Set the method to call on identifiers going into the database. This affects
143
- # the literalization of identifiers by calling this method on them before they are input.
144
- # Sequel upcases identifiers in all SQL strings for most databases, so to turn that off:
145
- #
146
- # Sequel.identifier_input_method = nil
147
- #
148
- # to downcase instead:
149
- #
150
- # Sequel.identifier_input_method = :downcase
151
- #
152
- # Other String instance methods work as well.
153
- def self.identifier_input_method=(value)
154
- Database.identifier_input_method = value
155
- 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
156
143
 
157
- # Set the method to call on identifiers coming out of the database. This affects
158
- # the literalization of identifiers by calling this method on them when they are
159
- # retrieved from the database. Sequel downcases identifiers retrieved for most
160
- # databases, so to turn that off:
161
- #
162
- # Sequel.identifier_output_method = nil
163
- #
164
- # to upcase instead:
165
- #
166
- # Sequel.identifier_output_method = :upcase
167
- #
168
- # Other String instance methods work as well.
169
- def self.identifier_output_method=(value)
170
- Database.identifier_output_method = value
171
- end
144
+ # The current concurrency primitive, Thread.current by default.
145
+ def current
146
+ Thread.current
147
+ end
172
148
 
173
- # The exception classed raised if there is an error parsing JSON.
174
- # This can be overridden to use an alternative json implementation.
175
- def self.json_parser_error_class
176
- JSON::ParserError
177
- 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
178
166
 
179
- # Convert given object to json and return the result.
180
- # This can be overridden to use an alternative json implementation.
181
- def self.object_to_json(obj, *args)
182
- obj.to_json(*args)
183
- 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
184
172
 
185
- # Parse the string as JSON and return the result.
186
- # This can be overridden to use an alternative json implementation.
187
- def self.parse_json(json)
188
- JSON.parse(json, :create_additions=>false)
189
- 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
190
178
 
191
- # Set whether to quote identifiers for all databases by default. By default,
192
- # Sequel quotes identifiers in all SQL strings, so to turn that off:
193
- #
194
- # Sequel.quote_identifiers = false
195
- def self.quote_identifiers=(value)
196
- Database.quote_identifiers = value
197
- end
179
+ # If a mutex is given, synchronize access using it. If nil is given, just
180
+ # yield to the block. This is designed for cases where a mutex may or may
181
+ # not be provided.
182
+ def synchronize_with(mutex)
183
+ if mutex
184
+ mutex.synchronize{yield}
185
+ else
186
+ yield
187
+ end
188
+ end
198
189
 
199
- # Convert each item in the array to the correct type, handling multi-dimensional
200
- # arrays. For each element in the array or subarrays, call the converter,
201
- # unless the value is nil.
202
- def self.recursive_map(array, converter)
203
- array.map do |i|
204
- if i.is_a?(Array)
205
- recursive_map(i, converter)
206
- elsif i
207
- converter.call(i)
190
+ # Convert each item in the array to the correct type, handling multi-dimensional
191
+ # arrays. For each element in the array or subarrays, call the converter,
192
+ # unless the value is nil.
193
+ def recursive_map(array, converter)
194
+ array.map do |i|
195
+ if i.is_a?(Array)
196
+ recursive_map(i, converter)
197
+ elsif !i.nil?
198
+ converter.call(i)
199
+ end
208
200
  end
209
201
  end
210
- end
211
202
 
212
- # Require all given +files+ which should be in the same or a subdirectory of
213
- # this file. If a +subdir+ is given, assume all +files+ are in that subdir.
214
- # This is used to ensure that the files loaded are from the same version of
215
- # Sequel as this file.
216
- def self.require(files, subdir=nil)
217
- Array(files).each{|f| super("#{File.dirname(__FILE__).untaint}/#{"#{subdir}/" if subdir}#{f}")}
218
- end
203
+ # For backwards compatibility only. require_relative should be used instead.
204
+ def require(files, subdir=nil)
205
+ # Use Kernel.require_relative to work around JRuby 9.0 bug
206
+ Array(files).each{|f| Kernel.require_relative "#{"#{subdir}/" if subdir}#{f}"}
207
+ end
219
208
 
220
- # Set whether Sequel is being used in single threaded mode. By default,
221
- # Sequel uses a thread-safe connection pool, which isn't as fast as the
222
- # single threaded connection pool, and also has some additional thread
223
- # safety checks. If your program will only have one thread,
224
- # and speed is a priority, you should set this to true:
225
- #
226
- # Sequel.single_threaded = true
227
- def self.single_threaded=(value)
228
- @single_threaded = value
229
- Database.single_threaded = value
230
- end
209
+ # Splits the symbol into three parts, if symbol splitting is enabled (not the default).
210
+ # Each part will either be a string or nil. If symbol splitting
211
+ # is disabled, returns an array with the first and third parts
212
+ # being nil, and the second part beind a string version of the symbol.
213
+ #
214
+ # For columns, these parts are the table, column, and alias.
215
+ # For tables, these parts are the schema, table, and alias.
216
+ def split_symbol(sym)
217
+ unless v = Sequel.synchronize{SPLIT_SYMBOL_CACHE[sym]}
218
+ if split_symbols?
219
+ v = case s = sym.to_s
220
+ when /\A((?:(?!__).)+)__((?:(?!___).)+)___(.+)\z/
221
+ [$1.freeze, $2.freeze, $3.freeze].freeze
222
+ when /\A((?:(?!___).)+)___(.+)\z/
223
+ [nil, $1.freeze, $2.freeze].freeze
224
+ when /\A((?:(?!__).)+)__(.+)\z/
225
+ [$1.freeze, $2.freeze, nil].freeze
226
+ else
227
+ [nil, s.freeze, nil].freeze
228
+ end
229
+ else
230
+ v = [nil,sym.to_s.freeze,nil].freeze
231
+ end
232
+ Sequel.synchronize{SPLIT_SYMBOL_CACHE[sym] = v}
233
+ end
234
+ v
235
+ end
231
236
 
232
- COLUMN_REF_RE1 = /\A((?:(?!__).)+)__((?:(?!___).)+)___(.+)\z/.freeze
233
- COLUMN_REF_RE2 = /\A((?:(?!___).)+)___(.+)\z/.freeze
234
- COLUMN_REF_RE3 = /\A((?:(?!__).)+)__(.+)\z/.freeze
235
- SPLIT_SYMBOL_CACHE = {}
237
+ # Setting this to true enables Sequel's historical behavior of splitting
238
+ # symbols on double or triple underscores:
239
+ #
240
+ # :table__column # table.column
241
+ # :column___alias # column AS alias
242
+ # :table__column___alias # table.column AS alias
243
+ #
244
+ # It is only recommended to turn this on for backwards compatibility until
245
+ # such symbols have been converted to use newer Sequel APIs such as:
246
+ #
247
+ # Sequel[:table][:column] # table.column
248
+ # Sequel[:column].as(:alias) # column AS alias
249
+ # Sequel[:table][:column].as(:alias) # table.column AS alias
250
+ #
251
+ # Sequel::Database instances do their own caching of literalized
252
+ # symbols, and changing this setting does not affect those caches. It is
253
+ # recommended that if you want to change this setting, you do so directly
254
+ # after requiring Sequel, before creating any Sequel::Database instances.
255
+ #
256
+ # Disabling symbol splitting will also disable the handling
257
+ # of double underscores in virtual row methods, causing such methods to
258
+ # yield regular identifers instead of qualified identifiers:
259
+ #
260
+ # # Sequel.split_symbols = true
261
+ # Sequel.expr{table__column} # table.column
262
+ # Sequel.expr{table[:column]} # table.column
263
+ #
264
+ # # Sequel.split_symbols = false
265
+ # Sequel.expr{table__column} # table__column
266
+ # Sequel.expr{table[:column]} # table.column
267
+ def split_symbols=(v)
268
+ Sequel.synchronize{SPLIT_SYMBOL_CACHE.clear}
269
+ @split_symbols = v
270
+ end
236
271
 
237
- # Splits the symbol into three parts. Each part will
238
- # either be a string or nil.
239
- #
240
- # For columns, these parts are the table, column, and alias.
241
- # For tables, these parts are the schema, table, and alias.
242
- def self.split_symbol(sym)
243
- unless v = Sequel.synchronize{SPLIT_SYMBOL_CACHE[sym]}
244
- v = case s = sym.to_s
245
- when COLUMN_REF_RE1
246
- [$1.freeze, $2.freeze, $3.freeze].freeze
247
- when COLUMN_REF_RE2
248
- [nil, $1.freeze, $2.freeze].freeze
249
- when COLUMN_REF_RE3
250
- [$1.freeze, $2.freeze, nil].freeze
251
- else
252
- [nil, s.freeze, nil].freeze
253
- end
254
- Sequel.synchronize{SPLIT_SYMBOL_CACHE[sym] = v}
272
+ # Whether Sequel currently splits symbols into qualified/aliased identifiers.
273
+ def split_symbols?
274
+ @split_symbols
255
275
  end
256
- v
257
- end
258
276
 
259
- # Converts the given +string+ into a +Date+ object.
260
- #
261
- # Sequel.string_to_date('2010-09-10') # Date.civil(2010, 09, 10)
262
- def self.string_to_date(string)
263
- begin
277
+ # Converts the given +string+ into a +Date+ object.
278
+ #
279
+ # Sequel.string_to_date('2010-09-10') # Date.civil(2010, 09, 10)
280
+ def string_to_date(string)
264
281
  Date.parse(string, Sequel.convert_two_digit_years)
265
282
  rescue => e
266
283
  raise convert_exception_class(e, InvalidValue)
267
284
  end
268
- end
269
285
 
270
- # Converts the given +string+ into a +Time+ or +DateTime+ object, depending on the
271
- # value of <tt>Sequel.datetime_class</tt>.
272
- #
273
- # Sequel.string_to_datetime('2010-09-10 10:20:30') # Time.local(2010, 09, 10, 10, 20, 30)
274
- def self.string_to_datetime(string)
275
- begin
286
+ # Converts the given +string+ into a +Time+ or +DateTime+ object, depending on the
287
+ # value of <tt>Sequel.datetime_class</tt>.
288
+ #
289
+ # Sequel.string_to_datetime('2010-09-10 10:20:30') # Time.local(2010, 09, 10, 10, 20, 30)
290
+ def string_to_datetime(string)
276
291
  if datetime_class == DateTime
277
292
  DateTime.parse(string, convert_two_digit_years)
278
293
  else
@@ -281,116 +296,151 @@ module Sequel
281
296
  rescue => e
282
297
  raise convert_exception_class(e, InvalidValue)
283
298
  end
284
- end
285
299
 
286
- # Converts the given +string+ into a <tt>Sequel::SQLTime</tt> object.
287
- #
288
- # v = Sequel.string_to_time('10:20:30') # Sequel::SQLTime.parse('10:20:30')
289
- # DB.literal(v) # => '10:20:30'
290
- def self.string_to_time(string)
291
- begin
300
+ # Converts the given +string+ into a <tt>Sequel::SQLTime</tt> object.
301
+ #
302
+ # v = Sequel.string_to_time('10:20:30') # Sequel::SQLTime.parse('10:20:30')
303
+ # DB.literal(v) # => '10:20:30'
304
+ def string_to_time(string)
292
305
  SQLTime.parse(string)
293
306
  rescue => e
294
307
  raise convert_exception_class(e, InvalidValue)
295
308
  end
296
- end
297
309
 
298
- # Mutex used to protect mutable data structures
299
- @data_mutex = Mutex.new
310
+ # Unless in single threaded mode, protects access to any mutable
311
+ # global data structure in Sequel.
312
+ # Uses a non-reentrant mutex, so calling code should be careful.
313
+ # In general, this should only be used around the minimal possible code
314
+ # such as Hash#[], Hash#[]=, Hash#delete, Array#<<, and Array#delete.
315
+ def synchronize(&block)
316
+ @single_threaded ? yield : @data_mutex.synchronize(&block)
317
+ end
300
318
 
301
- # Unless in single threaded mode, protects access to any mutable
302
- # global data structure in Sequel.
303
- # Uses a non-reentrant mutex, so calling code should be careful.
304
- def self.synchronize(&block)
305
- @single_threaded ? yield : @data_mutex.synchronize(&block)
306
- end
319
+ if RUBY_VERSION >= '2.1'
320
+ # A timer object that can be passed to Sequel.elapsed_seconds_since
321
+ # to return the number of seconds elapsed.
322
+ def start_timer
323
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
324
+ end
325
+ else
326
+ # :nocov:
327
+ def start_timer # :nodoc:
328
+ Time.now
329
+ end
330
+ # :nocov:
331
+ end
307
332
 
308
- # Uses a transaction on all given databases with the given options. This:
309
- #
310
- # Sequel.transaction([DB1, DB2, DB3]){...}
311
- #
312
- # is equivalent to:
313
- #
314
- # DB1.transaction do
315
- # DB2.transaction do
316
- # DB3.transaction do
317
- # ...
318
- # end
319
- # end
320
- # end
321
- #
322
- # except that if Sequel::Rollback is raised by the block, the transaction is
323
- # rolled back on all databases instead of just the last one.
324
- #
325
- # Note that this method cannot guarantee that all databases will commit or
326
- # rollback. For example, if DB3 commits but attempting to commit on DB2
327
- # fails (maybe because foreign key checks are deferred), there is no way
328
- # to uncommit the changes on DB3. For that kind of support, you need to
329
- # have two-phase commit/prepared transactions (which Sequel supports on
330
- # some databases).
331
- def self.transaction(dbs, opts=OPTS, &block)
332
- unless opts[:rollback]
333
- rescue_rollback = true
334
- opts = Hash[opts].merge!(:rollback=>:reraise)
333
+ # The elapsed seconds since the given timer object was created. The
334
+ # timer object should have been created via Sequel.start_timer.
335
+ def elapsed_seconds_since(timer)
336
+ start_timer - timer
335
337
  end
336
- pr = dbs.reverse.inject(block){|bl, db| proc{db.transaction(opts, &bl)}}
337
- if rescue_rollback
338
- begin
338
+
339
+ # Uses a transaction on all given databases with the given options. This:
340
+ #
341
+ # Sequel.transaction([DB1, DB2, DB3]){}
342
+ #
343
+ # is equivalent to:
344
+ #
345
+ # DB1.transaction do
346
+ # DB2.transaction do
347
+ # DB3.transaction do
348
+ # end
349
+ # end
350
+ # end
351
+ #
352
+ # except that if Sequel::Rollback is raised by the block, the transaction is
353
+ # rolled back on all databases instead of just the last one.
354
+ #
355
+ # Note that this method cannot guarantee that all databases will commit or
356
+ # rollback. For example, if DB3 commits but attempting to commit on DB2
357
+ # fails (maybe because foreign key checks are deferred), there is no way
358
+ # to uncommit the changes on DB3. For that kind of support, you need to
359
+ # have two-phase commit/prepared transactions (which Sequel supports on
360
+ # some databases).
361
+ def transaction(dbs, opts=OPTS, &block)
362
+ unless opts[:rollback]
363
+ rescue_rollback = true
364
+ opts = Hash[opts].merge!(:rollback=>:reraise)
365
+ end
366
+ pr = dbs.reverse.inject(block){|bl, db| proc{db.transaction(opts, &bl)}}
367
+ if rescue_rollback
368
+ begin
369
+ pr.call
370
+ rescue Sequel::Rollback
371
+ nil
372
+ end
373
+ else
339
374
  pr.call
340
- rescue Sequel::Rollback
341
- nil
342
375
  end
343
- else
344
- pr.call
345
376
  end
346
- end
347
377
 
348
- # If the supplied block takes a single argument,
349
- # yield an <tt>SQL::VirtualRow</tt> instance to the block
350
- # argument. Otherwise, evaluate the block in the context of a
351
- # <tt>SQL::VirtualRow</tt> instance.
352
- #
353
- # Sequel.virtual_row{a} # Sequel::SQL::Identifier.new(:a)
354
- # Sequel.virtual_row{|o| o.a{}} # Sequel::SQL::Function.new(:a)
355
- def self.virtual_row(&block)
356
- vr = VIRTUAL_ROW
357
- case block.arity
358
- when -1, 0
359
- vr.instance_exec(&block)
360
- else
361
- block.call(vr)
362
- end
363
- end
378
+ # If the supplied block takes a single argument,
379
+ # yield an <tt>SQL::VirtualRow</tt> instance to the block
380
+ # argument. Otherwise, evaluate the block in the context of a
381
+ # <tt>SQL::VirtualRow</tt> instance.
382
+ #
383
+ # Sequel.virtual_row{a} # Sequel::SQL::Identifier.new(:a)
384
+ # Sequel.virtual_row{|o| o.a} # Sequel::SQL::Function.new(:a)
385
+ def virtual_row(&block)
386
+ vr = VIRTUAL_ROW
387
+ case block.arity
388
+ when -1, 0
389
+ vr.instance_exec(&block)
390
+ else
391
+ block.call(vr)
392
+ end
393
+ end
364
394
 
365
- ### Private Class Methods ###
395
+ private
366
396
 
367
- # Helper method that the database adapter class methods that are added to Sequel via
368
- # metaprogramming use to parse arguments.
369
- def self.adapter_method(adapter, *args, &block)
370
- options = args.last.is_a?(Hash) ? args.pop : {}
371
- opts = {:adapter => adapter.to_sym}
372
- opts[:database] = args.shift if args.first.is_a?(String)
373
- if args.any?
374
- raise ::Sequel::Error, "Wrong format of arguments, either use (), (String), (Hash), or (String, Hash)"
397
+ # Return a hash of date information parsed from the given string.
398
+ def _date_parse(string)
399
+ Date._parse(string)
375
400
  end
376
401
 
377
- connect(opts.merge(options), &block)
378
- end
402
+ # Helper method that the database adapter class methods that are added to Sequel via
403
+ # metaprogramming use to parse arguments.
404
+ def adapter_method(adapter, *args, &block)
405
+ options = args.last.is_a?(Hash) ? args.pop : OPTS
406
+ opts = {:adapter => adapter.to_sym}
407
+ opts[:database] = args.shift if args.first.is_a?(String)
408
+ if args.any?
409
+ raise ::Sequel::Error, "Wrong format of arguments, either use (), (String), (Hash), or (String, Hash)"
410
+ end
379
411
 
380
- # Method that adds a database adapter class method to Sequel that calls
381
- # Sequel.adapter_method.
382
- #
383
- # Do not call this method with untrusted input, as that can result in
384
- # arbitrary code execution.
385
- def self.def_adapter_method(*adapters) # :nodoc:
386
- adapters.each do |adapter|
387
- instance_eval("def #{adapter}(*args, &block); adapter_method('#{adapter}', *args, &block) end", __FILE__, __LINE__)
412
+ connect(opts.merge(options), &block)
388
413
  end
389
- end
390
414
 
391
- private_class_method :adapter_method, :def_adapter_method
415
+ # Method that adds a database adapter class method to Sequel that calls
416
+ # Sequel.adapter_method.
417
+ def def_adapter_method(*adapters) # :nodoc:
418
+ adapters.each do |adapter|
419
+ define_singleton_method(adapter){|*args, &block| adapter_method(adapter, *args, &block)}
420
+ end
421
+ end
422
+ end
423
+ extend SequelMethods
424
+
425
+ require_relative "deprecated"
426
+ require_relative "sql"
427
+ require_relative "connection_pool"
428
+ require_relative "exceptions"
429
+ require_relative "dataset"
430
+ require_relative "database"
431
+ require_relative "timezones"
432
+ require_relative "ast_transformer"
433
+ require_relative "version"
392
434
 
393
- require(%w"deprecated sql connection_pool exceptions dataset database timezones ast_transformer version")
435
+ class << self
436
+ # Allow nicer syntax for creating Sequel expressions:
437
+ #
438
+ # Sequel[1] # => Sequel::SQL::NumericExpression: 1
439
+ # Sequel["a"] # => Sequel::SQL::StringExpression: 'a'
440
+ # Sequel[:a] # => Sequel::SQL::Identifier: "a"
441
+ # Sequel[a: 1] # => Sequel::SQL::BooleanExpression: ("a" = 1)
442
+ alias_method :[], :expr
443
+ end
394
444
 
395
445
  # Add the database adapter class methods to Sequel via metaprogramming
396
446
  def_adapter_method(*Database::ADAPTERS)