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
@@ -26,16 +26,8 @@ module Sequel
26
26
  :time=>Sequel::SQLTime, :boolean=>[TrueClass, FalseClass].freeze, :float=>Float, :decimal=>BigDecimal,
27
27
  :blob=>Sequel::SQL::Blob}.freeze
28
28
 
29
- # Module to be included in shared adapters so that when the DatabaseMethods are
30
- # included in the database, the identifier mangling defaults are reset correctly.
31
- module ResetIdentifierMangling
32
- def extended(obj)
33
- obj.send(:reset_identifier_mangling)
34
- end
35
- end
36
-
37
29
  # Nested hook Proc; each new hook Proc just wraps the previous one.
38
- @initialize_hook = Proc.new {|db| }
30
+ @initialize_hook = proc{|db| }
39
31
 
40
32
  # Register a hook that will be run when a new Database is instantiated. It is
41
33
  # called with the new database handle.
@@ -43,7 +35,7 @@ module Sequel
43
35
  raise Error, "must provide block to after_initialize" unless block
44
36
  Sequel.synchronize do
45
37
  previous = @initialize_hook
46
- @initialize_hook = Proc.new do |db|
38
+ @initialize_hook = proc do |db|
47
39
  previous.call(db)
48
40
  block.call(db)
49
41
  end
@@ -84,7 +76,7 @@ module Sequel
84
76
  :user => uri.user,
85
77
  :password => uri.password,
86
78
  :port => uri.port,
87
- :host => RUBY_VERSION < '1.9.3' ? uri.host : uri.hostname,
79
+ :host => uri.hostname,
88
80
  :database => (m = /\/(.*)/.match(uri.path)) && (m[1])
89
81
  }
90
82
  end
@@ -99,23 +91,44 @@ module Sequel
99
91
  # The specific default size of string columns for this Sequel::Database, usually 255 by default.
100
92
  attr_accessor :default_string_column_size
101
93
 
94
+ # Whether to check the bytesize of strings before typecasting (to avoid typecasting strings that
95
+ # would be too long for the given type), true by default. Strings that are too long will raise
96
+ # a typecasting error.
97
+ attr_accessor :check_string_typecast_bytesize
98
+
102
99
  # Constructs a new instance of a database connection with the specified
103
100
  # options hash.
104
101
  #
105
102
  # Accepts the following options:
103
+ # :before_preconnect :: Callable that runs after extensions from :preconnect_extensions are loaded,
104
+ # but before any connections are created.
105
+ # :cache_schema :: Whether schema should be cached for this Database instance
106
+ # :check_string_typecast_bytesize :: Whether to check the bytesize of strings before typecasting.
106
107
  # :default_string_column_size :: The default size of string columns, 255 by default.
107
- # :identifier_input_method :: A string method symbol to call on identifiers going into the database.
108
- # :identifier_output_method :: A string method symbol to call on identifiers coming from the database.
108
+ # :extensions :: Extensions to load into this Database instance. Can be a symbol, array of symbols,
109
+ # or string with extensions separated by columns. These extensions are loaded after
110
+ # connections are made by the :preconnect option.
111
+ # :keep_reference :: Whether to keep a reference to this instance in Sequel::DATABASES, true by default.
109
112
  # :logger :: A specific logger to use.
110
113
  # :loggers :: An array of loggers to use.
111
- # :name :: A name to use for the Database object.
112
- # :preconnect :: Whether to automatically connect to the maximum number of servers.
114
+ # :log_connection_info :: Whether connection information should be logged when logging queries.
115
+ # :log_warn_duration :: The number of elapsed seconds after which queries should be logged at warn level.
116
+ # :name :: A name to use for the Database object, displayed in PoolTimeout.
117
+ # :preconnect :: Automatically create the maximum number of connections, so that they don't
118
+ # need to be created as needed. This is useful when connecting takes a long time
119
+ # and you want to avoid possible latency during runtime.
120
+ # Set to :concurrently to create the connections in separate threads. Otherwise
121
+ # they'll be created sequentially.
122
+ # :preconnect_extensions :: Similar to the :extensions option, but loads the extensions before the
123
+ # connections are made by the :preconnect option.
113
124
  # :quote_identifiers :: Whether to quote identifiers.
114
- # :servers :: A hash specifying a server/shard specific options, keyed by shard symbol .
125
+ # :servers :: A hash specifying a server/shard specific options, keyed by shard symbol.
115
126
  # :single_threaded :: Whether to use a single-threaded connection pool.
116
127
  # :sql_log_level :: Method to use to log SQL to a logger, :info by default.
117
128
  #
118
- # All options given are also passed to the connection pool.
129
+ # All options given are also passed to the connection pool. Additional options respected by
130
+ # the connection pool are :after_connect, :connect_sqls, :max_connections, :pool_timeout,
131
+ # :servers, and :servers_hash. See the connection pool documentation for details.
119
132
  def initialize(opts = OPTS)
120
133
  @opts ||= opts
121
134
  @opts = connection_pool_default_options.merge(@opts)
@@ -123,22 +136,21 @@ module Sequel
123
136
  @opts[:servers] = {} if @opts[:servers].is_a?(String)
124
137
  @sharded = !!@opts[:servers]
125
138
  @opts[:adapter_class] = self.class
126
- @opts[:single_threaded] = @single_threaded = typecast_value_boolean(@opts.fetch(:single_threaded, Database.single_threaded))
139
+ @opts[:single_threaded] = @single_threaded = typecast_value_boolean(@opts.fetch(:single_threaded, Sequel.single_threaded))
127
140
  @default_string_column_size = @opts[:default_string_column_size] || DEFAULT_STRING_COLUMN_SIZE
141
+ @check_string_typecast_bytesize = typecast_value_boolean(@opts.fetch(:check_string_typecast_bytesize, true))
128
142
 
129
143
  @schemas = {}
130
144
  @prepared_statements = {}
131
145
  @transactions = {}
132
146
  @symbol_literal_cache = {}
133
147
 
134
- @identifier_input_method = nil
135
- @identifier_output_method = nil
136
- @quote_identifiers = nil
137
148
  @timezone = nil
138
149
 
139
150
  @dataset_class = dataset_class_default
140
151
  @cache_schema = typecast_value_boolean(@opts.fetch(:cache_schema, true))
141
152
  @dataset_modules = []
153
+ @loaded_extensions = []
142
154
  @schema_type_classes = SCHEMA_TYPE_CLASSES.dup
143
155
 
144
156
  self.sql_log_level = @opts[:sql_log_level] ? @opts[:sql_log_level].to_sym : :info
@@ -147,55 +159,60 @@ module Sequel
147
159
 
148
160
  @pool = ConnectionPool.get_pool(self, @opts)
149
161
 
150
- reset_identifier_mangling
162
+ reset_default_dataset
151
163
  adapter_initialize
152
164
 
153
- unless typecast_value_boolean(@opts[:keep_reference]) == false
154
- Sequel.synchronize{::Sequel::DATABASES.push(self)}
155
- end
156
- Sequel::Database.run_after_initialize(self)
157
- if typecast_value_boolean(@opts[:preconnect]) && @pool.respond_to?(:preconnect, true)
158
- concurrent = typecast_value_string(@opts[:preconnect]) == "concurrently"
159
- @pool.send(:preconnect, concurrent)
160
- end
161
- end
165
+ keep_reference = typecast_value_boolean(@opts[:keep_reference]) != false
166
+ begin
167
+ Sequel.synchronize{::Sequel::DATABASES.push(self)} if keep_reference
168
+ Sequel::Database.run_after_initialize(self)
162
169
 
163
- # If a transaction is not currently in process, yield to the block immediately.
164
- # Otherwise, add the block to the list of blocks to call after the currently
165
- # in progress transaction commits (and only if it commits).
166
- # Options:
167
- # :server :: The server/shard to use.
168
- def after_commit(opts=OPTS, &block)
169
- raise Error, "must provide block to after_commit" unless block
170
- synchronize(opts[:server]) do |conn|
171
- if h = _trans(conn)
172
- raise Error, "cannot call after_commit in a prepared transaction" if h[:prepare]
173
- add_transaction_hook(conn, :after_commit, block)
174
- else
175
- yield
170
+ initialize_load_extensions(:preconnect_extensions)
171
+
172
+ if before_preconnect = @opts[:before_preconnect]
173
+ before_preconnect.call(self)
176
174
  end
177
- end
178
- end
179
-
180
- # If a transaction is not currently in progress, ignore the block.
181
- # Otherwise, add the block to the list of the blocks to call after the currently
182
- # in progress transaction rolls back (and only if it rolls back).
183
- # Options:
184
- # :server :: The server/shard to use.
185
- def after_rollback(opts=OPTS, &block)
186
- raise Error, "must provide block to after_rollback" unless block
187
- synchronize(opts[:server]) do |conn|
188
- if h = _trans(conn)
189
- raise Error, "cannot call after_rollback in a prepared transaction" if h[:prepare]
190
- add_transaction_hook(conn, :after_rollback, block)
175
+
176
+ if typecast_value_boolean(@opts[:preconnect]) && @pool.respond_to?(:preconnect, true)
177
+ concurrent = typecast_value_string(@opts[:preconnect]) == "concurrently"
178
+ @pool.send(:preconnect, concurrent)
191
179
  end
180
+
181
+ initialize_load_extensions(:extensions)
182
+ test_connection if typecast_value_boolean(@opts.fetch(:test, true)) && respond_to?(:connect, true)
183
+ rescue
184
+ Sequel.synchronize{::Sequel::DATABASES.delete(self)} if keep_reference
185
+ raise
192
186
  end
193
187
  end
194
-
188
+
189
+ # Freeze internal data structures for the Database instance.
190
+ def freeze
191
+ valid_connection_sql
192
+ metadata_dataset
193
+ @opts.freeze
194
+ @loggers.freeze
195
+ @pool.freeze
196
+ @dataset_class.freeze
197
+ @dataset_modules.freeze
198
+ @schema_type_classes.freeze
199
+ @loaded_extensions.freeze
200
+ metadata_dataset
201
+ super
202
+ end
203
+
204
+ # Disallow dup/clone for Database instances
205
+ undef_method :dup, :clone, :initialize_copy
206
+ # :nocov:
207
+ if RUBY_VERSION >= '1.9.3'
208
+ # :nocov:
209
+ undef_method :initialize_clone, :initialize_dup
210
+ end
211
+
195
212
  # Cast the given type to a literal type
196
213
  #
197
214
  # DB.cast_type_literal(Float) # double precision
198
- # DB.cast_type_literal(:foo) # foo
215
+ # DB.cast_type_literal(:foo) # foo
199
216
  def cast_type_literal(type)
200
217
  type_literal(:type=>type)
201
218
  end
@@ -209,7 +226,9 @@ module Sequel
209
226
  Sequel.extension(*exts)
210
227
  exts.each do |ext|
211
228
  if pr = Sequel.synchronize{EXTENSIONS[ext]}
212
- pr.call(self)
229
+ if Sequel.synchronize{@loaded_extensions.include?(ext) ? false : (@loaded_extensions << ext)}
230
+ pr.call(self)
231
+ end
213
232
  else
214
233
  raise(Error, "Extension #{ext} does not have specific support handling individual databases (try: Sequel.extension #{ext.inspect})")
215
234
  end
@@ -224,13 +243,6 @@ module Sequel
224
243
  Sequel.convert_output_timestamp(v, timezone)
225
244
  end
226
245
 
227
- # Return true if already in a transaction given the options,
228
- # false otherwise. Respects the :server option for selecting
229
- # a shard.
230
- def in_transaction?(opts=OPTS)
231
- synchronize(opts[:server]){|conn| !!_trans(conn)}
232
- end
233
-
234
246
  # Returns a string representation of the database object including the
235
247
  # class name and connection URI and options used when connecting (if any).
236
248
  def inspect
@@ -244,8 +256,8 @@ module Sequel
244
256
 
245
257
  # Proxy the literal call to the dataset.
246
258
  #
247
- # DB.literal(1) # 1
248
- # DB.literal(:a) # a
259
+ # DB.literal(1) # 1
260
+ # DB.literal(:a) # a
249
261
  # DB.literal('a') # 'a'
250
262
  def literal(v)
251
263
  schema_utility_dataset.literal(v)
@@ -279,20 +291,18 @@ module Sequel
279
291
  @schema_type_classes[type]
280
292
  end
281
293
 
282
- # Default serial primary key options, used by the table creation
283
- # code.
294
+ # Default serial primary key options, used by the table creation code.
284
295
  def serial_primary_key_options
285
296
  {:primary_key => true, :type => Integer, :auto_increment => true}
286
297
  end
287
298
 
288
299
  # Cache the prepared statement object at the given name.
289
300
  def set_prepared_statement(name, ps)
290
- ps.prepared_sql
291
301
  Sequel.synchronize{prepared_statements[name] = ps}
292
302
  end
293
303
 
294
304
  # Whether this database instance uses multiple servers, either for sharding
295
- # or for master/slave.
305
+ # or for primary/replica configurations.
296
306
  def sharded?
297
307
  @sharded
298
308
  end
@@ -318,6 +328,7 @@ module Sequel
318
328
  return nil if value.nil?
319
329
  meth = "typecast_value_#{column_type}"
320
330
  begin
331
+ # Allow calling private methods as per-type typecasting methods are private
321
332
  respond_to?(meth, true) ? send(meth, value) : value
322
333
  rescue ArgumentError, TypeError => e
323
334
  raise Sequel.convert_exception_class(e, InvalidValue)
@@ -341,13 +352,6 @@ module Sequel
341
352
  def adapter_initialize
342
353
  end
343
354
 
344
- # Set the given callable as a hook to be called. Type should be either
345
- # :after_commit or :after_rollback.
346
- def add_transaction_hook(conn, type, block)
347
- hooks = _trans(conn)[type] ||= []
348
- hooks << block
349
- end
350
-
351
355
  # Returns true when the object is considered blank.
352
356
  # The only objects that are blank are nil, false,
353
357
  # strings with all whitespace, and ones that respond
@@ -366,11 +370,6 @@ module Sequel
366
370
  end
367
371
  end
368
372
 
369
- # Which transaction errors to translate, blank by default.
370
- def database_error_classes
371
- []
372
- end
373
-
374
373
  # An enumerable yielding pairs of regexps and exception classes, used
375
374
  # to match against underlying driver exception messages in
376
375
  # order to raise a more specific Sequel::DatabaseError subclass.
@@ -384,8 +383,7 @@ module Sequel
384
383
  database_specific_error_class(exception, opts) || DatabaseError
385
384
  end
386
385
 
387
- # Return the SQLState for the given exception, if one can be
388
- # determined
386
+ # Return the SQLState for the given exception, if one can be determined
389
387
  def database_exception_sqlstate(exception, opts)
390
388
  nil
391
389
  end
@@ -435,8 +433,24 @@ module Sequel
435
433
  opts[:disconnect]
436
434
  end
437
435
 
436
+ # Load extensions during initialization from the given key in opts.
437
+ def initialize_load_extensions(key)
438
+ case exts = @opts[key]
439
+ when String
440
+ extension(*exts.split(',').map(&:to_sym))
441
+ when Array
442
+ extension(*exts)
443
+ when Symbol
444
+ extension(exts)
445
+ when nil
446
+ # nothing
447
+ else
448
+ raise Error, "unsupported Database #{key.inspect} option: #{@opts[key].inspect}"
449
+ end
450
+ end
451
+
438
452
  # Convert the given exception to an appropriate Sequel::DatabaseError
439
- # subclass, keeping message and traceback.
453
+ # subclass, keeping message and backtrace.
440
454
  def raise_error(exception, opts=OPTS)
441
455
  if !opts[:classes] || Array(opts[:classes]).any?{|c| exception.is_a?(c)}
442
456
  raise Sequel.convert_exception_class(exception, database_error_class(exception, opts))
@@ -445,6 +459,34 @@ module Sequel
445
459
  end
446
460
  end
447
461
 
462
+ # Swallow database errors, unless they are connect/disconnect errors.
463
+ def swallow_database_error
464
+ yield
465
+ rescue Sequel::DatabaseDisconnectError, DatabaseConnectionError
466
+ # Always raise disconnect errors
467
+ raise
468
+ rescue Sequel::DatabaseError
469
+ # Don't raise other database errors.
470
+ nil
471
+ # else
472
+ # Don't rescue other exceptions, they will be raised normally.
473
+ end
474
+
475
+ # Check the bytesize of a string before conversion. There is no point
476
+ # trying to typecast strings that would be way too long.
477
+ def typecast_check_string_length(string, max_size)
478
+ if @check_string_typecast_bytesize && string.bytesize > max_size
479
+ raise InvalidValue, "string too long to typecast (bytesize: #{string.bytesize}, max: #{max_size})"
480
+ end
481
+ string
482
+ end
483
+
484
+ # Check the bytesize of the string value, if value is a string.
485
+ def typecast_check_length(value, max_size)
486
+ typecast_check_string_length(value, max_size) if String === value
487
+ value
488
+ end
489
+
448
490
  # Typecast the value to an SQL::Blob
449
491
  def typecast_value_blob(value)
450
492
  value.is_a?(Sequel::SQL::Blob) ? value : Sequel::SQL::Blob.new(value)
@@ -468,9 +510,9 @@ module Sequel
468
510
  when Date
469
511
  value
470
512
  when String
471
- Sequel.string_to_date(value)
513
+ Sequel.string_to_date(typecast_check_string_length(value, 100))
472
514
  when Hash
473
- Date.new(*[:year, :month, :day].map{|x| (value[x] || value[x.to_s]).to_i})
515
+ Date.new(*[:year, :month, :day].map{|x| typecast_check_length(value[x] || value[x.to_s], 100).to_i})
474
516
  else
475
517
  raise InvalidValue, "invalid value for Date: #{value.inspect}"
476
518
  end
@@ -478,18 +520,26 @@ module Sequel
478
520
 
479
521
  # Typecast the value to a DateTime or Time depending on Sequel.datetime_class
480
522
  def typecast_value_datetime(value)
481
- Sequel.typecast_to_application_timestamp(value)
482
- end
483
-
484
- # Typecast the value to a BigDecimal
485
- def typecast_value_decimal(value)
486
523
  case value
487
- when BigDecimal
488
- value
489
- when Numeric
490
- BigDecimal.new(value.to_s)
491
524
  when String
492
- d = BigDecimal.new(value)
525
+ Sequel.typecast_to_application_timestamp(typecast_check_string_length(value, 100))
526
+ when Hash
527
+ [:year, :month, :day, :hour, :minute, :second, :nanos, :offset].each do |x|
528
+ typecast_check_length(value[x] || value[x.to_s], 100)
529
+ end
530
+ Sequel.typecast_to_application_timestamp(value)
531
+ else
532
+ Sequel.typecast_to_application_timestamp(value)
533
+ end
534
+ end
535
+
536
+ if RUBY_VERSION >= '2.4'
537
+ # Typecast a string to a BigDecimal
538
+ alias _typecast_value_string_to_decimal BigDecimal
539
+ else
540
+ # :nocov:
541
+ def _typecast_value_string_to_decimal(value)
542
+ d = BigDecimal(value)
493
543
  if d.zero?
494
544
  # BigDecimal parsing is loose by default, returning a 0 value for
495
545
  # invalid input. If a zero value is received, use Float to check
@@ -501,6 +551,19 @@ module Sequel
501
551
  end
502
552
  end
503
553
  d
554
+ end
555
+ # :nocov:
556
+ end
557
+
558
+ # Typecast the value to a BigDecimal
559
+ def typecast_value_decimal(value)
560
+ case value
561
+ when BigDecimal
562
+ value
563
+ when Numeric
564
+ BigDecimal(value.to_s)
565
+ when String
566
+ _typecast_value_string_to_decimal(typecast_check_string_length(value, 1000))
504
567
  else
505
568
  raise InvalidValue, "invalid value for BigDecimal: #{value.inspect}"
506
569
  end
@@ -508,26 +571,22 @@ module Sequel
508
571
 
509
572
  # Typecast the value to a Float
510
573
  def typecast_value_float(value)
511
- Float(value)
574
+ Float(typecast_check_length(value, 1000))
512
575
  end
513
576
 
514
- # Used for checking/removing leading zeroes from strings so they don't get
515
- # interpreted as octal.
516
- LEADING_ZERO_RE = /\A0+(\d)/.freeze
517
- if RUBY_VERSION >= '1.9'
518
- # Typecast the value to an Integer
519
- def typecast_value_integer(value)
520
- (value.is_a?(String) && value =~ LEADING_ZERO_RE) ? Integer(value, 10) : Integer(value)
521
- end
522
- else
523
- # :nocov:
524
- # Replacement string when replacing leading zeroes.
525
- LEADING_ZERO_REP = "\\1".freeze
526
- # Typecast the value to an Integer
527
- def typecast_value_integer(value)
528
- Integer(value.is_a?(String) ? value.sub(LEADING_ZERO_RE, LEADING_ZERO_REP) : value)
577
+ # Typecast the value to an Integer
578
+ def typecast_value_integer(value)
579
+ case value
580
+ when String
581
+ typecast_check_string_length(value, 100)
582
+ if value =~ /\A-?0+(\d)/
583
+ Integer(value, 10)
584
+ else
585
+ Integer(value)
586
+ end
587
+ else
588
+ Integer(value)
529
589
  end
530
- # :nocov:
531
590
  end
532
591
 
533
592
  # Typecast the value to a String
@@ -547,13 +606,12 @@ module Sequel
547
606
  if value.is_a?(SQLTime)
548
607
  value
549
608
  else
550
- # specifically check for nsec == 0 value to work around JRuby 1.6 ruby 1.9 mode bug
551
- SQLTime.create(value.hour, value.min, value.sec, (value.respond_to?(:nsec) && value.nsec != 0) ? value.nsec/1000.0 : value.usec)
609
+ SQLTime.create(value.hour, value.min, value.sec, value.nsec/1000.0)
552
610
  end
553
611
  when String
554
- Sequel.string_to_time(value)
612
+ Sequel.string_to_time(typecast_check_string_length(value, 100))
555
613
  when Hash
556
- SQLTime.create(*[:hour, :minute, :second].map{|x| (value[x] || value[x.to_s]).to_i})
614
+ SQLTime.create(*[:hour, :minute, :second].map{|x| typecast_check_length(value[x] || value[x.to_s], 100).to_i})
557
615
  else
558
616
  raise Sequel::InvalidValue, "invalid value for Time: #{value.inspect}"
559
617
  end
@@ -7,10 +7,8 @@ module Sequel
7
7
  # This methods generally execute SQL code on the database server.
8
8
  # ---------------------
9
9
 
10
- STRING_DEFAULT_RE = /\A'(.*)'\z/
11
- CURRENT_TIMESTAMP_RE = /now|today|CURRENT|getdate|\ADate\(\)\z/io
12
- COLUMN_SCHEMA_DATETIME_TYPES = [:date, :datetime]
13
- COLUMN_SCHEMA_STRING_TYPES = [:string, :blob, :date, :datetime, :time, :enum, :set, :interval]
10
+ COLUMN_SCHEMA_DATETIME_TYPES = [:date, :datetime].freeze
11
+ COLUMN_SCHEMA_STRING_TYPES = [:string, :blob, :date, :datetime, :time, :enum, :set, :interval].freeze
14
12
 
15
13
  # The prepared statement object hash for this database, keyed by name symbol
16
14
  attr_reader :prepared_statements
@@ -32,9 +30,9 @@ module Sequel
32
30
  # Call the prepared statement with the given name with the given hash
33
31
  # of arguments.
34
32
  #
35
- # DB[:items].filter(:id=>1).prepare(:first, :sa)
33
+ # DB[:items].where(id: 1).prepare(:first, :sa)
36
34
  # DB.call(:sa) # SELECT * FROM items WHERE id = 1
37
- def call(ps_name, hash={}, &block)
35
+ def call(ps_name, hash=OPTS, &block)
38
36
  prepared_statement(ps_name).call(hash, &block)
39
37
  end
40
38
 
@@ -45,7 +43,7 @@ module Sequel
45
43
  execute_dui(sql, opts, &block)
46
44
  end
47
45
 
48
- # Method that should be used when issuing a DELETE, UPDATE, or INSERT
46
+ # Method that should be used when issuing a DELETE or UPDATE
49
47
  # statement. By default, calls execute.
50
48
  # This method should not be called directly by user code.
51
49
  def execute_dui(sql, opts=OPTS, &block)
@@ -59,11 +57,11 @@ module Sequel
59
57
  execute_dui(sql, opts, &block)
60
58
  end
61
59
 
62
- # Returns a single value from the database, e.g.:
60
+ # Returns a single value from the database, see Dataset#get.
63
61
  #
64
62
  # DB.get(1) # SELECT 1
65
63
  # # => 1
66
- # DB.get{server_version{}} # SELECT server_version()
64
+ # DB.get{server_version.function} # SELECT server_version()
67
65
  def get(*args, &block)
68
66
  @default_dataset.get(*args, &block)
69
67
  end
@@ -88,7 +86,7 @@ module Sequel
88
86
  # :schema :: An explicit schema to use. It may also be implicitly provided
89
87
  # via the table name.
90
88
  #
91
- # If schema parsing is supported by the database, the column information should hash at least contain the
89
+ # If schema parsing is supported by the database, the column information hash should contain at least the
92
90
  # following entries:
93
91
  #
94
92
  # :allow_null :: Whether NULL is an allowed value for the column.
@@ -159,7 +157,7 @@ module Sequel
159
157
  end
160
158
 
161
159
  cols = schema_parse_table(table_name, opts)
162
- raise(Error, 'schema parsing returned no columns, table probably doesn\'t exist') if cols.nil? || cols.empty?
160
+ raise(Error, "schema parsing returned no columns, table #{table_name.inspect} probably doesn't exist") if cols.nil? || cols.empty?
163
161
 
164
162
  primary_keys = 0
165
163
  auto_increment_set = false
@@ -178,6 +176,8 @@ module Sequel
178
176
  c[:max_length] = max_length
179
177
  end
180
178
  end
179
+ schema_post_process(cols)
180
+
181
181
  Sequel.synchronize{@schemas[quoted_name] = cols} if cache_schema
182
182
  cols
183
183
  end
@@ -236,11 +236,11 @@ module Sequel
236
236
  when :date
237
237
  Sequel.string_to_date(default)
238
238
  when :datetime
239
- DateTime.parse(default)
239
+ Sequel.string_to_datetime(default)
240
240
  when :time
241
241
  Sequel.string_to_time(default)
242
242
  when :decimal
243
- BigDecimal.new(default)
243
+ BigDecimal(default)
244
244
  end
245
245
  end
246
246
 
@@ -248,7 +248,7 @@ module Sequel
248
248
  # and return the normalized value.
249
249
  def column_schema_normalize_default(default, type)
250
250
  if column_schema_default_string_type?(type)
251
- return unless m = STRING_DEFAULT_RE.match(default)
251
+ return unless m = /\A'(.*)'\z/.match(default)
252
252
  m[1].gsub("''", "'")
253
253
  else
254
254
  default
@@ -260,7 +260,7 @@ module Sequel
260
260
  def column_schema_to_ruby_default(default, type)
261
261
  return default unless default.is_a?(String)
262
262
  if COLUMN_SCHEMA_DATETIME_TYPES.include?(type)
263
- if CURRENT_TIMESTAMP_RE.match(default)
263
+ if /now|today|CURRENT|getdate|\ADate\(\)\z/i.match(default)
264
264
  if type == :date
265
265
  return Sequel::CURRENT_DATE
266
266
  else
@@ -287,16 +287,16 @@ module Sequel
287
287
  (ds || dataset).method(:input_identifier)
288
288
  end
289
289
 
290
+ # Uncached version of metadata_dataset, designed for overriding.
291
+ def _metadata_dataset
292
+ dataset
293
+ end
294
+
290
295
  # Return a dataset that uses the default identifier input and output methods
291
296
  # for this database. Used when parsing metadata so that column symbols are
292
297
  # returned as expected.
293
298
  def metadata_dataset
294
- @metadata_dataset ||= (
295
- ds = dataset;
296
- ds.identifier_input_method = identifier_input_method_default;
297
- ds.identifier_output_method = identifier_output_method_default;
298
- ds
299
- )
299
+ @metadata_dataset ||= _metadata_dataset
300
300
  end
301
301
 
302
302
  # Return a Method object for the dataset's output_identifier_method.
@@ -308,10 +308,10 @@ module Sequel
308
308
 
309
309
  # Remove the cached schema for the given schema name
310
310
  def remove_cached_schema(table)
311
- if @schemas
312
- k = quote_schema_table(table)
313
- Sequel.synchronize{@schemas.delete(k)}
314
- end
311
+ cache = @default_dataset.send(:cache)
312
+ Sequel.synchronize{cache.clear}
313
+ k = quote_schema_table(table)
314
+ Sequel.synchronize{@schemas.delete(k)}
315
315
  end
316
316
 
317
317
  # Match the database's column type to a ruby type via a
@@ -325,13 +325,13 @@ module Sequel
325
325
  :integer
326
326
  when /\Adate\z/io
327
327
  :date
328
- when /\A((small)?datetime|timestamp( with(out)? time zone)?)(\(\d+\))?\z/io
328
+ when /\A((small)?datetime|timestamp(\(\d\))?( with(out)? time zone)?)\z/io
329
329
  :datetime
330
330
  when /\Atime( with(out)? time zone)?\z/io
331
331
  :time
332
332
  when /\A(bool(ean)?)\z/io
333
333
  :boolean
334
- when /\A(real|float|double( precision)?|double\(\d+,\d+\)( unsigned)?)\z/io
334
+ when /\A(real|float( unsigned)?|double( precision)?|double\(\d+,\d+\)( unsigned)?)\z/io
335
335
  :float
336
336
  when /\A(?:(?:(?:num(?:ber|eric)?|decimal)(?:\(\d+,\s*(\d+|false|true)\))?))\z/io
337
337
  $1 && ['0', 'false'].include?($1) ? :integer : :decimal
@@ -341,5 +341,25 @@ module Sequel
341
341
  :enum
342
342
  end
343
343
  end
344
+
345
+ # Post process the schema values.
346
+ def schema_post_process(cols)
347
+ # :nocov:
348
+ if RUBY_VERSION >= '2.5'
349
+ # :nocov:
350
+ cols.each do |_, h|
351
+ db_type = h[:db_type]
352
+ if db_type.is_a?(String)
353
+ h[:db_type] = -db_type
354
+ end
355
+ end
356
+ end
357
+
358
+ cols.each do |_,c|
359
+ c.each_value do |val|
360
+ val.freeze if val.is_a?(String)
361
+ end
362
+ end
363
+ end
344
364
  end
345
365
  end