sequel 5.8.0 → 5.38.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (510) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +409 -1795
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/bin/sequel +4 -0
  6. data/doc/advanced_associations.rdoc +136 -18
  7. data/doc/association_basics.rdoc +10 -5
  8. data/doc/cheat_sheet.rdoc +1 -0
  9. data/doc/code_order.rdoc +12 -2
  10. data/doc/dataset_filtering.rdoc +17 -2
  11. data/doc/mass_assignment.rdoc +3 -3
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +30 -8
  15. data/doc/postgresql.rdoc +107 -2
  16. data/doc/release_notes/5.10.0.txt +84 -0
  17. data/doc/release_notes/5.11.0.txt +83 -0
  18. data/doc/release_notes/5.12.0.txt +141 -0
  19. data/doc/release_notes/5.13.0.txt +27 -0
  20. data/doc/release_notes/5.14.0.txt +63 -0
  21. data/doc/release_notes/5.15.0.txt +39 -0
  22. data/doc/release_notes/5.16.0.txt +110 -0
  23. data/doc/release_notes/5.17.0.txt +31 -0
  24. data/doc/release_notes/5.18.0.txt +69 -0
  25. data/doc/release_notes/5.19.0.txt +28 -0
  26. data/doc/release_notes/5.20.0.txt +89 -0
  27. data/doc/release_notes/5.21.0.txt +87 -0
  28. data/doc/release_notes/5.22.0.txt +48 -0
  29. data/doc/release_notes/5.23.0.txt +56 -0
  30. data/doc/release_notes/5.24.0.txt +56 -0
  31. data/doc/release_notes/5.25.0.txt +32 -0
  32. data/doc/release_notes/5.26.0.txt +35 -0
  33. data/doc/release_notes/5.27.0.txt +21 -0
  34. data/doc/release_notes/5.28.0.txt +16 -0
  35. data/doc/release_notes/5.29.0.txt +22 -0
  36. data/doc/release_notes/5.30.0.txt +20 -0
  37. data/doc/release_notes/5.31.0.txt +148 -0
  38. data/doc/release_notes/5.32.0.txt +46 -0
  39. data/doc/release_notes/5.33.0.txt +24 -0
  40. data/doc/release_notes/5.34.0.txt +40 -0
  41. data/doc/release_notes/5.35.0.txt +56 -0
  42. data/doc/release_notes/5.36.0.txt +60 -0
  43. data/doc/release_notes/5.37.0.txt +30 -0
  44. data/doc/release_notes/5.38.0.txt +28 -0
  45. data/doc/release_notes/5.9.0.txt +99 -0
  46. data/doc/security.rdoc +10 -0
  47. data/doc/sharding.rdoc +42 -28
  48. data/doc/sql.rdoc +12 -0
  49. data/doc/testing.rdoc +24 -17
  50. data/doc/transactions.rdoc +78 -0
  51. data/doc/validations.rdoc +2 -2
  52. data/lib/sequel/adapters/ado.rb +26 -18
  53. data/lib/sequel/adapters/ado/access.rb +2 -2
  54. data/lib/sequel/adapters/ado/mssql.rb +5 -8
  55. data/lib/sequel/adapters/amalgalite.rb +1 -1
  56. data/lib/sequel/adapters/jdbc.rb +71 -27
  57. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  58. data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
  59. data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
  60. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
  61. data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
  62. data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
  63. data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
  64. data/lib/sequel/adapters/mysql.rb +14 -15
  65. data/lib/sequel/adapters/mysql2.rb +5 -3
  66. data/lib/sequel/adapters/odbc.rb +4 -6
  67. data/lib/sequel/adapters/oracle.rb +7 -7
  68. data/lib/sequel/adapters/postgres.rb +52 -16
  69. data/lib/sequel/adapters/shared/access.rb +16 -12
  70. data/lib/sequel/adapters/shared/db2.rb +5 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +41 -18
  72. data/lib/sequel/adapters/shared/mysql.rb +66 -19
  73. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  74. data/lib/sequel/adapters/shared/postgres.rb +341 -95
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
  76. data/lib/sequel/adapters/shared/sqlite.rb +174 -21
  77. data/lib/sequel/adapters/sqlanywhere.rb +33 -17
  78. data/lib/sequel/adapters/sqlite.rb +78 -68
  79. data/lib/sequel/adapters/tinytds.rb +14 -6
  80. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
  82. data/lib/sequel/connection_pool.rb +2 -6
  83. data/lib/sequel/connection_pool/sharded_single.rb +7 -4
  84. data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
  85. data/lib/sequel/connection_pool/single.rb +1 -1
  86. data/lib/sequel/connection_pool/threaded.rb +26 -11
  87. data/lib/sequel/core.rb +327 -319
  88. data/lib/sequel/database/connecting.rb +7 -8
  89. data/lib/sequel/database/logging.rb +7 -1
  90. data/lib/sequel/database/misc.rb +68 -34
  91. data/lib/sequel/database/query.rb +6 -4
  92. data/lib/sequel/database/schema_generator.rb +31 -11
  93. data/lib/sequel/database/schema_methods.rb +32 -22
  94. data/lib/sequel/database/transactions.rb +129 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/dataset/actions.rb +34 -23
  97. data/lib/sequel/dataset/features.rb +34 -0
  98. data/lib/sequel/dataset/graph.rb +27 -11
  99. data/lib/sequel/dataset/misc.rb +17 -3
  100. data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
  101. data/lib/sequel/dataset/prepared_statements.rb +96 -26
  102. data/lib/sequel/dataset/query.rb +43 -8
  103. data/lib/sequel/dataset/sql.rb +189 -41
  104. data/lib/sequel/deprecated.rb +3 -1
  105. data/lib/sequel/exceptions.rb +2 -0
  106. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  107. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  108. data/lib/sequel/extensions/caller_logging.rb +79 -0
  109. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  110. data/lib/sequel/extensions/connection_expiration.rb +6 -6
  111. data/lib/sequel/extensions/connection_validator.rb +7 -6
  112. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  113. data/lib/sequel/extensions/constraint_validations.rb +53 -28
  114. data/lib/sequel/extensions/core_refinements.rb +2 -0
  115. data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
  116. data/lib/sequel/extensions/escaped_like.rb +100 -0
  117. data/lib/sequel/extensions/eval_inspect.rb +3 -1
  118. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  119. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  120. data/lib/sequel/extensions/index_caching.rb +9 -7
  121. data/lib/sequel/extensions/integer64.rb +3 -1
  122. data/lib/sequel/extensions/looser_typecasting.rb +3 -3
  123. data/lib/sequel/extensions/migration.rb +13 -6
  124. data/lib/sequel/extensions/named_timezones.rb +84 -23
  125. data/lib/sequel/extensions/pg_array.rb +87 -79
  126. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  127. data/lib/sequel/extensions/pg_enum.rb +34 -18
  128. data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
  129. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  130. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
  131. data/lib/sequel/extensions/pg_inet.rb +15 -5
  132. data/lib/sequel/extensions/pg_interval.rb +2 -0
  133. data/lib/sequel/extensions/pg_json.rb +387 -123
  134. data/lib/sequel/extensions/pg_json_ops.rb +168 -0
  135. data/lib/sequel/extensions/pg_range.rb +20 -10
  136. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  137. data/lib/sequel/extensions/pg_row.rb +3 -2
  138. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  139. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  140. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  141. data/lib/sequel/extensions/query.rb +1 -0
  142. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  143. data/lib/sequel/extensions/s.rb +2 -0
  144. data/lib/sequel/extensions/schema_dumper.rb +13 -7
  145. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
  146. data/lib/sequel/extensions/server_block.rb +18 -7
  147. data/lib/sequel/extensions/sql_comments.rb +2 -2
  148. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  149. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  150. data/lib/sequel/extensions/to_dot.rb +9 -3
  151. data/lib/sequel/model.rb +3 -1
  152. data/lib/sequel/model/associations.rb +403 -69
  153. data/lib/sequel/model/base.rb +170 -90
  154. data/lib/sequel/model/plugins.rb +105 -0
  155. data/lib/sequel/plugins/after_initialize.rb +1 -1
  156. data/lib/sequel/plugins/association_dependencies.rb +3 -3
  157. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  158. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  159. data/lib/sequel/plugins/association_pks.rb +74 -22
  160. data/lib/sequel/plugins/association_proxies.rb +6 -2
  161. data/lib/sequel/plugins/auto_validations.rb +36 -17
  162. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  163. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  164. data/lib/sequel/plugins/caching.rb +3 -0
  165. data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
  166. data/lib/sequel/plugins/composition.rb +13 -9
  167. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  168. data/lib/sequel/plugins/defaults_setter.rb +2 -2
  169. data/lib/sequel/plugins/dirty.rb +60 -22
  170. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  171. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  172. data/lib/sequel/plugins/finder.rb +2 -2
  173. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  174. data/lib/sequel/plugins/hook_class_methods.rb +17 -5
  175. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  176. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  177. data/lib/sequel/plugins/inverted_subsets.rb +2 -2
  178. data/lib/sequel/plugins/json_serializer.rb +21 -14
  179. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  180. data/lib/sequel/plugins/list.rb +22 -10
  181. data/lib/sequel/plugins/many_through_many.rb +1 -1
  182. data/lib/sequel/plugins/nested_attributes.rb +27 -5
  183. data/lib/sequel/plugins/pg_array_associations.rb +12 -9
  184. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
  185. data/lib/sequel/plugins/prepared_statements.rb +6 -12
  186. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  187. data/lib/sequel/plugins/rcte_tree.rb +20 -22
  188. data/lib/sequel/plugins/sharding.rb +13 -7
  189. data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
  190. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  191. data/lib/sequel/plugins/static_cache.rb +36 -17
  192. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  193. data/lib/sequel/plugins/string_stripper.rb +1 -1
  194. data/lib/sequel/plugins/subclasses.rb +2 -0
  195. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  196. data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
  197. data/lib/sequel/plugins/throw_failures.rb +110 -0
  198. data/lib/sequel/plugins/tree.rb +49 -31
  199. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  200. data/lib/sequel/plugins/validation_class_methods.rb +11 -5
  201. data/lib/sequel/plugins/validation_helpers.rb +2 -2
  202. data/lib/sequel/sql.rb +120 -30
  203. data/lib/sequel/timezones.rb +55 -14
  204. data/lib/sequel/version.rb +6 -1
  205. metadata +101 -361
  206. data/Rakefile +0 -151
  207. data/doc/release_notes/4.0.0.txt +0 -262
  208. data/doc/release_notes/4.1.0.txt +0 -85
  209. data/doc/release_notes/4.10.0.txt +0 -226
  210. data/doc/release_notes/4.11.0.txt +0 -147
  211. data/doc/release_notes/4.12.0.txt +0 -105
  212. data/doc/release_notes/4.13.0.txt +0 -169
  213. data/doc/release_notes/4.14.0.txt +0 -68
  214. data/doc/release_notes/4.15.0.txt +0 -56
  215. data/doc/release_notes/4.16.0.txt +0 -36
  216. data/doc/release_notes/4.17.0.txt +0 -38
  217. data/doc/release_notes/4.18.0.txt +0 -36
  218. data/doc/release_notes/4.19.0.txt +0 -45
  219. data/doc/release_notes/4.2.0.txt +0 -129
  220. data/doc/release_notes/4.20.0.txt +0 -79
  221. data/doc/release_notes/4.21.0.txt +0 -94
  222. data/doc/release_notes/4.22.0.txt +0 -72
  223. data/doc/release_notes/4.23.0.txt +0 -65
  224. data/doc/release_notes/4.24.0.txt +0 -99
  225. data/doc/release_notes/4.25.0.txt +0 -181
  226. data/doc/release_notes/4.26.0.txt +0 -44
  227. data/doc/release_notes/4.27.0.txt +0 -78
  228. data/doc/release_notes/4.28.0.txt +0 -57
  229. data/doc/release_notes/4.29.0.txt +0 -41
  230. data/doc/release_notes/4.3.0.txt +0 -40
  231. data/doc/release_notes/4.30.0.txt +0 -37
  232. data/doc/release_notes/4.31.0.txt +0 -57
  233. data/doc/release_notes/4.32.0.txt +0 -132
  234. data/doc/release_notes/4.33.0.txt +0 -88
  235. data/doc/release_notes/4.34.0.txt +0 -86
  236. data/doc/release_notes/4.35.0.txt +0 -130
  237. data/doc/release_notes/4.36.0.txt +0 -116
  238. data/doc/release_notes/4.37.0.txt +0 -50
  239. data/doc/release_notes/4.38.0.txt +0 -67
  240. data/doc/release_notes/4.39.0.txt +0 -127
  241. data/doc/release_notes/4.4.0.txt +0 -92
  242. data/doc/release_notes/4.40.0.txt +0 -179
  243. data/doc/release_notes/4.41.0.txt +0 -77
  244. data/doc/release_notes/4.42.0.txt +0 -221
  245. data/doc/release_notes/4.43.0.txt +0 -87
  246. data/doc/release_notes/4.44.0.txt +0 -125
  247. data/doc/release_notes/4.45.0.txt +0 -370
  248. data/doc/release_notes/4.46.0.txt +0 -404
  249. data/doc/release_notes/4.47.0.txt +0 -56
  250. data/doc/release_notes/4.48.0.txt +0 -293
  251. data/doc/release_notes/4.49.0.txt +0 -222
  252. data/doc/release_notes/4.5.0.txt +0 -34
  253. data/doc/release_notes/4.6.0.txt +0 -30
  254. data/doc/release_notes/4.7.0.txt +0 -103
  255. data/doc/release_notes/4.8.0.txt +0 -175
  256. data/doc/release_notes/4.9.0.txt +0 -190
  257. data/spec/adapter_spec.rb +0 -4
  258. data/spec/adapters/db2_spec.rb +0 -170
  259. data/spec/adapters/mssql_spec.rb +0 -804
  260. data/spec/adapters/mysql_spec.rb +0 -1041
  261. data/spec/adapters/oracle_spec.rb +0 -327
  262. data/spec/adapters/postgres_spec.rb +0 -4000
  263. data/spec/adapters/spec_helper.rb +0 -43
  264. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  265. data/spec/adapters/sqlite_spec.rb +0 -600
  266. data/spec/bin_spec.rb +0 -269
  267. data/spec/core/connection_pool_spec.rb +0 -1228
  268. data/spec/core/database_spec.rb +0 -2673
  269. data/spec/core/dataset_spec.rb +0 -5419
  270. data/spec/core/deprecated_spec.rb +0 -70
  271. data/spec/core/expression_filters_spec.rb +0 -1344
  272. data/spec/core/mock_adapter_spec.rb +0 -722
  273. data/spec/core/object_graph_spec.rb +0 -306
  274. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  275. data/spec/core/schema_generator_spec.rb +0 -214
  276. data/spec/core/schema_spec.rb +0 -1820
  277. data/spec/core/spec_helper.rb +0 -23
  278. data/spec/core/version_spec.rb +0 -7
  279. data/spec/core_extensions_spec.rb +0 -762
  280. data/spec/core_model_spec.rb +0 -2
  281. data/spec/core_spec.rb +0 -1
  282. data/spec/deprecation_helper.rb +0 -30
  283. data/spec/extensions/accessed_columns_spec.rb +0 -51
  284. data/spec/extensions/active_model_spec.rb +0 -99
  285. data/spec/extensions/after_initialize_spec.rb +0 -24
  286. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  287. data/spec/extensions/association_dependencies_spec.rb +0 -125
  288. data/spec/extensions/association_pks_spec.rb +0 -423
  289. data/spec/extensions/association_proxies_spec.rb +0 -100
  290. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  291. data/spec/extensions/auto_validations_spec.rb +0 -202
  292. data/spec/extensions/blacklist_security_spec.rb +0 -95
  293. data/spec/extensions/blank_spec.rb +0 -69
  294. data/spec/extensions/boolean_readers_spec.rb +0 -93
  295. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  296. data/spec/extensions/caching_spec.rb +0 -273
  297. data/spec/extensions/class_table_inheritance_spec.rb +0 -568
  298. data/spec/extensions/column_conflicts_spec.rb +0 -75
  299. data/spec/extensions/column_select_spec.rb +0 -129
  300. data/spec/extensions/columns_introspection_spec.rb +0 -90
  301. data/spec/extensions/columns_updated_spec.rb +0 -35
  302. data/spec/extensions/composition_spec.rb +0 -248
  303. data/spec/extensions/connection_expiration_spec.rb +0 -133
  304. data/spec/extensions/connection_validator_spec.rb +0 -127
  305. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  306. data/spec/extensions/constraint_validations_spec.rb +0 -395
  307. data/spec/extensions/core_refinements_spec.rb +0 -528
  308. data/spec/extensions/csv_serializer_spec.rb +0 -183
  309. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  310. data/spec/extensions/dataset_associations_spec.rb +0 -365
  311. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  312. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  313. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  314. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  315. data/spec/extensions/defaults_setter_spec.rb +0 -141
  316. data/spec/extensions/delay_add_association_spec.rb +0 -73
  317. data/spec/extensions/dirty_spec.rb +0 -189
  318. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  319. data/spec/extensions/eager_each_spec.rb +0 -62
  320. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  321. data/spec/extensions/error_splitter_spec.rb +0 -18
  322. data/spec/extensions/error_sql_spec.rb +0 -20
  323. data/spec/extensions/eval_inspect_spec.rb +0 -74
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -380
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -275
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -840
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -109
  348. data/spec/extensions/nested_attributes_spec.rb +0 -703
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
  356. data/spec/extensions/pg_enum_spec.rb +0 -113
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -487
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -182
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -868
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -61
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -410
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/timestamps_spec.rb +0 -209
  411. data/spec/extensions/to_dot_spec.rb +0 -153
  412. data/spec/extensions/touch_spec.rb +0 -226
  413. data/spec/extensions/tree_spec.rb +0 -284
  414. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  415. data/spec/extensions/unlimited_update_spec.rb +0 -21
  416. data/spec/extensions/update_or_create_spec.rb +0 -83
  417. data/spec/extensions/update_primary_key_spec.rb +0 -105
  418. data/spec/extensions/update_refresh_spec.rb +0 -59
  419. data/spec/extensions/uuid_spec.rb +0 -101
  420. data/spec/extensions/validate_associated_spec.rb +0 -52
  421. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  422. data/spec/extensions/validation_contexts_spec.rb +0 -31
  423. data/spec/extensions/validation_helpers_spec.rb +0 -525
  424. data/spec/extensions/whitelist_security_spec.rb +0 -157
  425. data/spec/extensions/xml_serializer_spec.rb +0 -213
  426. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  427. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  428. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  429. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  431. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  432. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  433. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  434. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  436. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  437. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  438. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  439. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  440. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  441. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  443. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  444. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  446. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  447. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  448. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  449. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  450. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  451. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  452. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  453. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  457. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  458. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  459. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  460. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  461. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  462. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  466. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  468. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  469. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  471. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  473. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  474. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  475. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  476. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  478. data/spec/guards_helper.rb +0 -58
  479. data/spec/integration/associations_test.rb +0 -2513
  480. data/spec/integration/database_test.rb +0 -113
  481. data/spec/integration/dataset_test.rb +0 -1880
  482. data/spec/integration/eager_loader_test.rb +0 -687
  483. data/spec/integration/migrator_test.rb +0 -262
  484. data/spec/integration/model_test.rb +0 -203
  485. data/spec/integration/plugin_test.rb +0 -2302
  486. data/spec/integration/prepared_statement_test.rb +0 -398
  487. data/spec/integration/schema_test.rb +0 -869
  488. data/spec/integration/spec_helper.rb +0 -64
  489. data/spec/integration/timezone_test.rb +0 -86
  490. data/spec/integration/transaction_test.rb +0 -354
  491. data/spec/integration/type_test.rb +0 -127
  492. data/spec/model/association_reflection_spec.rb +0 -803
  493. data/spec/model/associations_spec.rb +0 -4538
  494. data/spec/model/base_spec.rb +0 -817
  495. data/spec/model/class_dataset_methods_spec.rb +0 -146
  496. data/spec/model/dataset_methods_spec.rb +0 -198
  497. data/spec/model/eager_loading_spec.rb +0 -2262
  498. data/spec/model/hooks_spec.rb +0 -370
  499. data/spec/model/inflector_spec.rb +0 -26
  500. data/spec/model/model_spec.rb +0 -953
  501. data/spec/model/plugins_spec.rb +0 -318
  502. data/spec/model/record_spec.rb +0 -2107
  503. data/spec/model/spec_helper.rb +0 -45
  504. data/spec/model/validations_spec.rb +0 -193
  505. data/spec/model_no_assoc_spec.rb +0 -1
  506. data/spec/model_spec.rb +0 -1
  507. data/spec/plugin_spec.rb +0 -1
  508. data/spec/sequel_coverage.rb +0 -15
  509. data/spec/sequel_warning.rb +0 -4
  510. data/spec/spec_config.rb +0 -12
@@ -229,6 +229,18 @@ If the database supports window functions, Sequel can handle them by calling the
229
229
  DB[:albums].select{function(c1, c2).over(:partition=>[c3, c4], :order=>[c5, c6.desc])}
230
230
  # SELECT function(c1, c2) OVER (PARTITION BY c3, c4 ORDER BY c5, c6 DESC) FROM albums
231
231
 
232
+ DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3, :frame=>:rows)}
233
+ # SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM albums
234
+
235
+ DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3, :frame=>{:type=>:range, :start=>1, :end=>1})}
236
+ # SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3 RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM albums
237
+
238
+ DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3, :frame=>{:type=>:groups, :start=>[2, :preceding], :end=>[1, :preceding]})}
239
+ # SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3 GROUPS BETWEEN 2 PRECEDING AND 1 PRECEDING) FROM albums
240
+
241
+ DB[:albums].select{function(c1).over(:partition=>c2, :order=>:c3, :frame=>{:type=>:range, :start=>:preceding, :exclude=>:current})}
242
+ # SELECT function(c1) OVER (PARTITION BY c2 ORDER BY c3 RANGE UNBOUNDED PRECEDING EXCLUDE CURRENT ROW) FROM albums
243
+
232
244
  === Schema Qualified Functions
233
245
 
234
246
  If the database supports schema qualified functions, Sequel can handle them by calling the +function+ method on a qualified identifier:
@@ -8,34 +8,39 @@ These run each test in its own transaction, the recommended way to test.
8
8
 
9
9
  === minitest/spec
10
10
 
11
- ==== with minitest-hooks
12
-
11
+ ==== with minitest-hooks
13
12
  require 'minitest/hooks/default'
13
+
14
+ DB = Sequel.postgres # change if using sqlite etc
15
+
14
16
  class Minitest::HooksSpec
15
17
  def around
16
- Sequel::Model.db.transaction(:rollback=>:always, :auto_savepoint=>true){super}
18
+ DB.transaction(:rollback=>:always, :auto_savepoint=>true){super}
17
19
  end
18
20
  end
19
21
 
20
- ==== without minitest-hooks
21
-
22
+ ==== without minitest-hooks
23
+ DB = Sequel.postgres # change if using sqlite etc
24
+
22
25
  class Minitest::Spec
23
26
  def run(*args, &block)
24
- Sequel::Model.db.transaction(:rollback=>:always, :auto_savepoint=>true){super}
27
+ DB.transaction(:rollback=>:always, :auto_savepoint=>true){super}
25
28
  end
26
29
  end
27
30
 
28
31
  === minitest/test
29
-
32
+ DB = Sequel.postgres # change if using sqlite etc
33
+
30
34
  # Use this class as the base class for your tests
31
35
  class SequelTestCase < Minitest::Test
32
36
  def run(*args, &block)
33
- Sequel::Model.db.transaction(:rollback=>:always, :auto_savepoint=>true){super}
37
+ DB.transaction(:rollback=>:always, :auto_savepoint=>true){super}
34
38
  end
35
39
  end
36
40
 
37
41
  === rspec >= 2.8
38
-
42
+ DB = Sequel.postgres # change the database if you are using sqlite etc.
43
+
39
44
  RSpec.configure do |c|
40
45
  c.around(:each) do |example|
41
46
  DB.transaction(:rollback=>:always, :auto_savepoint=>true){example.run}
@@ -46,7 +51,7 @@ These run each test in its own transaction, the recommended way to test.
46
51
 
47
52
  You can use the Sequel.transaction method to run a transaction on multiple databases, rolling all of them back. Instead of:
48
53
 
49
- Sequel::Model.db.transaction(:rollback=>:always)
54
+ DB.transaction(:rollback=>:always)
50
55
 
51
56
  Use Sequel.transaction with an array of databases:
52
57
 
@@ -66,11 +71,11 @@ Example:
66
71
  require 'minitest/hooks/default'
67
72
  class Minitest::HooksSpec
68
73
  def around
69
- Sequel::Model.db.transaction(:rollback=>:always, :savepoint=>true, :auto_savepoint=>true){super}
74
+ DB.transaction(:rollback=>:always, :savepoint=>true, :auto_savepoint=>true){super}
70
75
  end
71
76
 
72
77
  def around_all
73
- Sequel::Model.db.transaction(:rollback=>:always){super}
78
+ DB.transaction(:rollback=>:always){super}
74
79
  end
75
80
  end
76
81
 
@@ -90,9 +95,9 @@ The order in which you delete/truncate the tables is important if you are using
90
95
 
91
96
  describe "some test suite" do
92
97
  after do
93
- [:table1, :table2].each{|x| Sequel::Model.db.from(x).truncate}
98
+ [:table1, :table2].each{|x| DB.from(x).truncate}
94
99
  # or
95
- [:table1, :table2].each{|x| Sequel::Model.db.from(x).delete}
100
+ [:table1, :table2].each{|x| DB.from(x).delete}
96
101
  end
97
102
  end
98
103
 
@@ -100,9 +105,9 @@ The order in which you delete/truncate the tables is important if you are using
100
105
 
101
106
  class SomeTestClass < Minitest::Test
102
107
  def teardown
103
- [:table1, :table2].each{|x| Sequel::Model.db.from(x).truncate}
108
+ [:table1, :table2].each{|x| DB.from(x).truncate}
104
109
  # or
105
- [:table1, :table2].each{|x| Sequel::Model.db.from(x).delete}
110
+ [:table1, :table2].each{|x| DB.from(x).delete}
106
111
  end
107
112
  end
108
113
 
@@ -157,14 +162,16 @@ SEQUEL_CONNECTION_VALIDATOR :: Use the connection validator extension when runni
157
162
  SEQUEL_DUPLICATE_COLUMNS_HANDLER :: Use the duplicate columns handler extension with value given when running the specs
158
163
  SEQUEL_ERROR_SQL :: Use the error_sql extension when running the specs
159
164
  SEQUEL_INDEX_CACHING :: Use the index_caching extension when running the specs
165
+ SEQUEL_FIBER_CONCURRENCY :: Use the fiber_concurrency extension when running the adapter and integration specs
160
166
  SEQUEL_FREEZE_DATABASE :: Freeze the database before running the integration specs
161
167
  SEQUEL_IDENTIFIER_MANGLING :: Use the identifier_mangling extension when running the specs
162
168
  SEQUEL_INTEGER64 :: Use the integer64 extension when running the adapter or integration specs
163
169
  SEQUEL_MODEL_PREPARED_STATEMENTS :: Use the prepared_statements plugin when running the specs
170
+ SEQUEL_MODEL_THROW_FAILURES :: Use the throw_failures plugin when running the specs
164
171
  SEQUEL_NO_CACHE_ASSOCIATIONS :: Don't cache association metadata when running the specs
165
- SEQUEL_NO_CHECK_SQLS :: Don't check for specific SQL syntax when running the specs
166
172
  SEQUEL_CHECK_PENDING :: Try running all specs (note, can cause lockups for some adapters), and raise errors for skipped specs that don't fail
167
173
  SEQUEL_NO_PENDING :: Don't skip any specs, try running all specs (note, can cause lockups for some adapters)
168
174
  SEQUEL_PG_TIMESTAMPTZ :: Use the pg_timestamptz extension when running the postgres specs
169
175
  SEQUEL_SPLIT_SYMBOLS :: Turn on symbol splitting when running the adapter and integration specs
170
176
  SEQUEL_SYNCHRONIZE_SQL :: Use the synchronize_sql extension when running the specs
177
+ SEQUEL_TZINFO_VERSION :: Force the given tzinfo version when running the specs (e.g. '>=2')
@@ -36,6 +36,12 @@ If any other exception is raised, the transaction is rolled back, and the except
36
36
  end # ROLLBACK
37
37
  # ArgumentError raised
38
38
 
39
+ If you want the current transaction to be rolled back when the transaction block exits instead of being committed (even if an exception is not raised), use <tt>Database#rollback_on_exit</tt>
40
+
41
+ DB.transaction do # BEGIN
42
+ DB.rollback_on_exit
43
+ end # ROLLBACK
44
+
39
45
  If you want Sequel::Rollback exceptions to be reraised, use the <tt>rollback: :reraise</tt> option:
40
46
 
41
47
  DB.transaction(rollback: :reraise) do # BEGIN
@@ -121,6 +127,78 @@ Other exceptions, unless rescued inside the outer transaction block, will rollba
121
127
  end # ROLLBACK
122
128
  # ArgumentError raised
123
129
 
130
+ If you want the current savepoint to be rolled back when the savepoint block exits instead of being committed (even if an exception is not raised), use <tt>Database#rollback_on_exit(:savepoint=>true)</tt>
131
+
132
+ DB.transaction do # BEGIN
133
+ DB.transaction(savepoint: true) do # SAVEPOINT
134
+ DB.rollback_on_exit(:savepoint=>true)
135
+ end # ROLLBACK TO SAVEPOINT
136
+ end # COMMIT
137
+
138
+ DB.transaction do # BEGIN
139
+ DB.transaction(savepoint: true) do # SAVEPOINT
140
+ DB.transaction(savepoint: true) do # SAVEPOINT
141
+ DB.rollback_on_exit(:savepoint=>true)
142
+ end # ROLLBACK TO SAVEPOINT
143
+ end # RELEASE SAVEPOINT
144
+ end # COMMIT
145
+
146
+ If you want the current savepoint and potentially enclosing savepoints to be rolled back when the savepoint blocks exit (even if an exception is not raised), use <tt>Database#rollback_on_exit(:savepoint=>integer)</tt>
147
+
148
+ DB.transaction do # BEGIN
149
+ DB.transaction(savepoint: true) do # SAVEPOINT
150
+ DB.transaction(savepoint: true) do # SAVEPOINT
151
+ DB.rollback_on_exit(:savepoint=>2)
152
+ end # ROLLBACK TO SAVEPOINT
153
+ end # ROLLBACK TO SAVEPOINT
154
+ end # COMMIT
155
+
156
+ DB.transaction do # BEGIN
157
+ DB.transaction(savepoint: true) do # SAVEPOINT
158
+ DB.transaction(savepoint: true) do # SAVEPOINT
159
+ DB.rollback_on_exit(:savepoint=>3)
160
+ end # ROLLBACK TO SAVEPOINT
161
+ end # ROLLBACK TO SAVEPOINT
162
+ end # ROLLBACK
163
+
164
+ === Savepoint Hooks
165
+
166
+ When using savepoints, you can use the +:savepoint+ option to +after_commit+ or +after_rollback+ to use a savepoint hook. For +after_commit+, this will only run the hook after transaction commit if all enclosing savepoints are released (not rolled back). For +after_rollback+, this will run the hook after any enclosing savepoint is rolled back (before transaction commit), or after the transaction is rolled back if all enclosing savepoints are released:
167
+
168
+ x = nil
169
+ DB.transaction do # BEGIN
170
+ DB.transaction(savepoint: true) do # SAVEPOINT
171
+ DB.after_commit(savepoint: true){x = 1}
172
+ DB.after_rollback(savepoint: true){x = 2}
173
+ x # nil
174
+ end # RELEASE SAVEPOINT
175
+ x # nil
176
+ end # COMMIT
177
+ x # 1
178
+
179
+ x = nil
180
+ DB.transaction do # BEGIN
181
+ DB.transaction(savepoint: true) do # SAVEPOINT
182
+ DB.after_commit(savepoint: true){x = 1}
183
+ DB.after_rollback(savepoint: true){x = 2}
184
+ x # nil
185
+ raise Sequel::Rollback
186
+ end # ROLLBACK TO SAVEPOINT
187
+ x # 2
188
+ end # COMMIT
189
+ x # 2
190
+
191
+ x = nil
192
+ DB.transaction do # BEGIN
193
+ DB.transaction(savepoint: true) do # SAVEPOINT
194
+ DB.after_commit(savepoint: true){x = 1}
195
+ DB.after_rollback(savepoint: true){x = 2}
196
+ end # RELEASE SAVEPOINT
197
+ x # nil
198
+ raise Sequel::Rollback
199
+ end
200
+ x # 2
201
+
124
202
  == Prepared Transactions / Two-Phase Commit
125
203
 
126
204
  Sequel supports database prepared transactions on PostgreSQL, MySQL, and H2. With prepared transactions, at the end of the transaction, the transaction is not immediately committed (it acts like a rollback). Later, you can call +commit_prepared_transaction+ to commit the transaction or +rollback_prepared_transaction+ to roll the transaction back. Prepared transactions are usually used with distributed databases to make sure all databases commit the same transaction or none of them do.
@@ -232,7 +232,7 @@ These methods check that the specified attributes can be valid integers or valid
232
232
 
233
233
  === +validates_operator+
234
234
 
235
- +validates_operator+ checks that a given +operator+ method returns a truthy value when called on attribute with a specified value for comparison. Generally, this is used for inequality checks (>, >=, etc) but any method that can be called on the attribute that accepts an argument and returns a truthy value may be used.
235
+ +validates_operator+ checks that a given +operator+ method returns a truthy value when called on attribute with a specified value for comparison. Generally, this is used for inequality checks (>, >=, etc.) but any method that can be called on the attribute that accepts an argument and returns a truthy value may be used.
236
236
 
237
237
  class Album < Sequel::Model
238
238
  def validate
@@ -535,7 +535,7 @@ Note that the column names used in the errors are used verbatim in the error mes
535
535
  errors.full_messages
536
536
  # => ["Album name is not valid"]
537
537
 
538
- Alternatively, feel free to override Sequel::Model::Errors#full_messages. As long as it returns an array of strings, overridding it is completely safe.
538
+ Alternatively, feel free to override Sequel::Model::Errors#full_messages. As long as it returns an array of strings, overriding it is completely safe.
539
539
 
540
540
  === +count+
541
541
 
@@ -47,34 +47,40 @@ module Sequel
47
47
  #AdVarWChar = 202
48
48
  #AdWChar = 130
49
49
 
50
- cp = Object.new
51
-
52
- def cp.bigint(v)
50
+ bigint = Object.new
51
+ def bigint.call(v)
53
52
  v.to_i
54
53
  end
55
54
 
56
- def cp.numeric(v)
57
- BigDecimal.new(v)
55
+ numeric = Object.new
56
+ def numeric.call(v)
57
+ if v.include?(',')
58
+ BigDecimal(v.tr(',', '.'))
59
+ else
60
+ BigDecimal(v)
61
+ end
58
62
  end
59
63
 
60
- def cp.binary(v)
64
+ binary = Object.new
65
+ def binary.call(v)
61
66
  Sequel.blob(v.pack('c*'))
62
67
  end
63
68
 
64
- def cp.date(v)
69
+ date = Object.new
70
+ def date.call(v)
65
71
  Date.new(v.year, v.month, v.day)
66
72
  end
67
73
 
68
74
  CONVERSION_PROCS = {}
69
75
  [
70
- [:bigint, AdBigInt],
71
- [:numeric, AdNumeric, AdVarNumeric],
72
- [:date, AdDBDate],
73
- [:binary, AdBinary, AdVarBinary, AdLongVarBinary]
74
- ].each do |meth, *types|
75
- method = cp.method(meth)
76
+ [bigint, AdBigInt],
77
+ [numeric, AdNumeric, AdVarNumeric],
78
+ [date, AdDBDate],
79
+ [binary, AdBinary, AdVarBinary, AdLongVarBinary]
80
+ ].each do |callable, *types|
81
+ callable.freeze
76
82
  types.each do |i|
77
- CONVERSION_PROCS[i] = method
83
+ CONVERSION_PROCS[i] = callable
78
84
  end
79
85
  end
80
86
  CONVERSION_PROCS.freeze
@@ -227,7 +233,6 @@ module Sequel
227
233
  cols = []
228
234
  conversion_procs = db.conversion_procs
229
235
 
230
- i = -1
231
236
  ts_cp = nil
232
237
  recordset.Fields.each do |field|
233
238
  type = field.Type
@@ -244,18 +249,21 @@ module Sequel
244
249
  else
245
250
  conversion_procs[type]
246
251
  end
247
- cols << [output_identifier(field.Name), cp, i+=1]
252
+ cols << [output_identifier(field.Name), cp]
248
253
  end
249
254
 
250
255
  self.columns = cols.map(&:first)
251
256
  return if recordset.EOF
257
+ max = cols.length
252
258
 
253
259
  recordset.GetRows.transpose.each do |field_values|
254
260
  h = {}
255
261
 
256
- cols.each do |name, cp, i|
262
+ i = -1
263
+ while (i += 1) < max
264
+ name, cp = cols[i]
257
265
  h[name] = if (v = field_values[i]) && cp
258
- cp[v]
266
+ cp.call(v)
259
267
  else
260
268
  v
261
269
  end
@@ -111,7 +111,7 @@ module Sequel
111
111
  log_connection_yield(sql, conn){conn.Execute(sql)}
112
112
  last_insert_sql = "SELECT @@IDENTITY"
113
113
  res = log_connection_yield(last_insert_sql, conn){conn.Execute(last_insert_sql)}
114
- res.getRows.transpose.each{|r| return r.shift}
114
+ res.GetRows.transpose.each{|r| return r.shift}
115
115
  rescue ::WIN32OLERuntimeError => e
116
116
  raise_error(e)
117
117
  end
@@ -296,7 +296,7 @@ module Sequel
296
296
  execute_open_ado_schema(type, criteria) do |s|
297
297
  cols = []
298
298
  s.Fields.each{|f| cols << f.Name}
299
- s.getRows.transpose.each do |r|
299
+ s.GetRows.transpose.each do |r|
300
300
  row = {}
301
301
  cols.each{|c| row[c] = r.shift}
302
302
  yield row
@@ -7,17 +7,14 @@ module Sequel
7
7
  module MSSQL
8
8
  module DatabaseMethods
9
9
  include Sequel::MSSQL::DatabaseMethods
10
- # Issue a separate query to get the rows modified. ADO appears to
11
- # use pass by reference with an integer variable, which is
12
- # not supported directly in ruby, and I'm not aware of a workaround.
10
+
13
11
  def execute_dui(sql, opts=OPTS)
14
12
  return super unless @opts[:provider]
15
13
  synchronize(opts[:server]) do |conn|
16
14
  begin
17
- log_connection_yield(sql, conn){conn.Execute(sql)}
18
- rows_affected_sql = "SELECT @@ROWCOUNT AS AffectedRows"
19
- res = log_connection_yield(rows_affected_sql, conn){conn.Execute(rows_affected_sql)}
20
- res.getRows.transpose.each{|r| return r.shift}
15
+ sql = "SET NOCOUNT ON; #{sql}; SELECT @@ROWCOUNT"
16
+ rst = log_connection_yield(sql, conn){conn.Execute(sql)}
17
+ rst.GetRows[0][0]
21
18
  rescue ::WIN32OLERuntimeError => e
22
19
  raise_error(e)
23
20
  end
@@ -50,7 +47,7 @@ module Sequel
50
47
  # is necessary as ADO's default :provider uses a separate native
51
48
  # connection for each query.
52
49
  def insert(*values)
53
- return super if @opts[:sql] || @opts[:returning]
50
+ return super if (@opts[:sql] && !@opts[:prepared_sql]) || @opts[:returning]
54
51
  with_sql("SET NOCOUNT ON; #{insert_sql(*values)}; SELECT CAST(SCOPE_IDENTITY() AS INTEGER)").single_value
55
52
  end
56
53
 
@@ -30,7 +30,7 @@ module Sequel
30
30
  # Return numeric/decimal types as instances of BigDecimal
31
31
  # instead of Float
32
32
  def decimal(s)
33
- BigDecimal.new(s)
33
+ BigDecimal(s)
34
34
  end
35
35
 
36
36
  # Return datetime types as instances of Sequel.datetime_class
@@ -17,7 +17,19 @@ module Sequel
17
17
  # Contains procs keyed on subadapter type that extend the
18
18
  # given database object so it supports the correct database type.
19
19
  DATABASE_SETUP = {}
20
+
21
+ # Create custom NativeException alias for nicer access, and also so that
22
+ # JRuby 9.2+ so it doesn't use the deprecated ::NativeException
23
+ NativeException = java.lang.Exception
20
24
 
25
+ # Default database error classes
26
+ DATABASE_ERROR_CLASSES = [NativeException]
27
+ if JRUBY_VERSION < '9.2'
28
+ # On JRuby <9.2, still include ::NativeException, as it is still needed in some cases
29
+ DATABASE_ERROR_CLASSES << ::NativeException
30
+ end
31
+ DATABASE_ERROR_CLASSES.freeze
32
+
21
33
  # Allow loading the necessary JDBC support via a gem.
22
34
  def self.load_gem(name)
23
35
  begin
@@ -39,55 +51,80 @@ module Sequel
39
51
  # Raise a Sequel::AdapterNotFound if evaluating the class name raises a NameError.
40
52
  def self.load_driver(drv, gem=nil)
41
53
  load_gem(gem) if gem
42
- eval drv
54
+ if drv.is_a?(String)
55
+ eval drv
56
+ else
57
+ *try, last = drv
58
+ try.each do |try_drv|
59
+ begin
60
+ return eval(try_drv)
61
+ rescue NameError
62
+ end
63
+ end
64
+
65
+ eval last
66
+ end
43
67
  rescue NameError
44
68
  raise Sequel::AdapterNotFound, "#{drv} not loaded#{", try installing jdbc-#{gem.to_s.downcase} gem" if gem}"
45
69
  end
46
70
 
47
71
  class TypeConvertor
72
+ CONVERTORS = convertors = {}
48
73
  %w'Boolean Float Double Int Long Short'.each do |meth|
49
- class_eval("def #{meth}(r, i) v = r.get#{meth}(i); v unless r.wasNull end", __FILE__, __LINE__)
74
+ x = convertors[meth.to_sym] = Object.new
75
+ class_eval("def x.call(r, i) v = r.get#{meth}(i); v unless r.wasNull end", __FILE__, __LINE__)
50
76
  end
51
77
  %w'Object Array String Time Date Timestamp BigDecimal Blob Bytes Clob'.each do |meth|
52
- class_eval("def #{meth}(r, i) r.get#{meth}(i) end", __FILE__, __LINE__)
78
+ x = convertors[meth.to_sym] = Object.new
79
+ class_eval("def x.call(r, i) r.get#{meth}(i) end", __FILE__, __LINE__)
53
80
  end
54
- def RubyTime(r, i)
81
+ x = convertors[:RubyTime] = Object.new
82
+ def x.call(r, i)
55
83
  if v = r.getTime(i)
56
84
  Sequel.string_to_time("#{v.to_string}.#{sprintf('%03i', v.getTime.divmod(1000).last)}")
57
85
  end
58
86
  end
59
- def RubyDate(r, i)
87
+ x = convertors[:RubyDate] = Object.new
88
+ def x.call(r, i)
60
89
  if v = r.getDate(i)
61
90
  Date.civil(v.getYear + 1900, v.getMonth + 1, v.getDate)
62
91
  end
63
92
  end
64
- def RubyTimestamp(r, i)
93
+ x = convertors[:RubyTimestamp] = Object.new
94
+ def x.call(r, i)
65
95
  if v = r.getTimestamp(i)
66
96
  Sequel.database_to_application_timestamp([v.getYear + 1900, v.getMonth + 1, v.getDate, v.getHours, v.getMinutes, v.getSeconds, v.getNanos])
67
97
  end
68
98
  end
69
- def RubyBigDecimal(r, i)
99
+ x = convertors[:RubyBigDecimal] = Object.new
100
+ def x.call(r, i)
70
101
  if v = r.getBigDecimal(i)
71
- BigDecimal.new(v.to_string)
102
+ ::Kernel::BigDecimal(v.to_string)
72
103
  end
73
104
  end
74
- def RubyBlob(r, i)
105
+ x = convertors[:RubyBlob] = Object.new
106
+ def x.call(r, i)
75
107
  if v = r.getBytes(i)
76
108
  Sequel::SQL::Blob.new(String.from_java_bytes(v))
77
109
  end
78
110
  end
79
- def RubyClob(r, i)
111
+ x = convertors[:RubyClob] = Object.new
112
+ def x.call(r, i)
80
113
  if v = r.getClob(i)
81
114
  v.getSubString(1, v.length)
82
115
  end
83
116
  end
117
+ x = convertors[:RubyArray] = Object.new
118
+ def x.call(r, i)
119
+ if v = r.getArray(i)
120
+ v.array.to_ary
121
+ end
122
+ end
84
123
 
85
- o = new
86
- MAP = Hash.new(o.method(:Object))
124
+ MAP = Hash.new(convertors[:Object])
87
125
  types = Java::JavaSQL::Types
88
126
 
89
127
  {
90
- :ARRAY => :Array,
91
128
  :BOOLEAN => :Boolean,
92
129
  :CHAR => :String,
93
130
  :DOUBLE => :Double,
@@ -101,11 +138,12 @@ module Sequel
101
138
  :TINYINT => :Short,
102
139
  :VARCHAR => :String,
103
140
  }.each do |type, meth|
104
- MAP[types.const_get(type)] = o.method(meth)
141
+ MAP[types.const_get(type)] = convertors[meth]
105
142
  end
106
143
  BASIC_MAP = MAP.dup
107
144
 
108
145
  {
146
+ :ARRAY => :Array,
109
147
  :BINARY => :Blob,
110
148
  :BLOB => :Blob,
111
149
  :CLOB => :Clob,
@@ -118,13 +156,11 @@ module Sequel
118
156
  :TIMESTAMP => :Timestamp,
119
157
  :VARBINARY => :Blob,
120
158
  }.each do |type, meth|
121
- BASIC_MAP[types.const_get(type)] = o.method(meth)
122
- MAP[types.const_get(type)] = o.method(:"Ruby#{meth}")
159
+ BASIC_MAP[types.const_get(type)] = convertors[meth]
160
+ MAP[types.const_get(type)] = convertors[:"Ruby#{meth}"]
123
161
  end
124
-
125
162
  MAP.freeze
126
163
  BASIC_MAP.freeze
127
- freeze
128
164
  end
129
165
 
130
166
  class Database < Sequel::Database
@@ -168,7 +204,7 @@ module Sequel
168
204
  last_insert_id(conn, opts)
169
205
  end
170
206
  end
171
- rescue NativeException, JavaSQL::SQLException => e
207
+ rescue *DATABASE_ERROR_CLASSES => e
172
208
  raise_error(e)
173
209
  ensure
174
210
  cps.close
@@ -189,7 +225,7 @@ module Sequel
189
225
  JavaSQL::DriverManager.setLoginTimeout(opts[:login_timeout]) if opts[:login_timeout]
190
226
  raise StandardError, "skipping regular connection" if opts[:jdbc_properties]
191
227
  JavaSQL::DriverManager.getConnection(*args)
192
- rescue JavaSQL::SQLException, NativeException, StandardError => e
228
+ rescue StandardError, *DATABASE_ERROR_CLASSES => e
193
229
  raise e unless driver
194
230
  # If the DriverManager can't get the connection - use the connect
195
231
  # method of the driver. (This happens under Tomcat for instance)
@@ -203,7 +239,7 @@ module Sequel
203
239
  c = driver.new.connect(args[0], props)
204
240
  raise(Sequel::DatabaseError, 'driver.new.connect returned nil: probably bad JDBC connection string') unless c
205
241
  c
206
- rescue JavaSQL::SQLException, NativeException, StandardError => e2
242
+ rescue StandardError, *DATABASE_ERROR_CLASSES => e2
207
243
  if e2.respond_to?(:message=) && e2.message != e.message
208
244
  e2.message = "#{e2.message}\n#{e.class.name}: #{e.message}"
209
245
  end
@@ -236,7 +272,9 @@ module Sequel
236
272
  log_connection_yield(sql, conn){stmt.execute(sql)}
237
273
  when :insert
238
274
  log_connection_yield(sql, conn){execute_statement_insert(stmt, sql)}
239
- last_insert_id(conn, Hash[opts].merge!(:stmt=>stmt))
275
+ opts = Hash[opts]
276
+ opts[:stmt] = stmt
277
+ last_insert_id(conn, opts)
240
278
  else
241
279
  log_connection_yield(sql, conn){stmt.executeUpdate(sql)}
242
280
  end
@@ -355,7 +393,7 @@ module Sequel
355
393
  end
356
394
 
357
395
  def database_error_classes
358
- [NativeException]
396
+ DATABASE_ERROR_CLASSES
359
397
  end
360
398
 
361
399
  def database_exception_sqlstate(exception, opts)
@@ -431,12 +469,15 @@ module Sequel
431
469
  log_connection_yield(msg, conn, args){cps.execute}
432
470
  when :insert
433
471
  log_connection_yield(msg, conn, args){execute_prepared_statement_insert(cps)}
434
- last_insert_id(conn, Hash[opts].merge!(:prepared=>true, :stmt=>cps))
472
+ opts = Hash[opts]
473
+ opts[:prepared] = true
474
+ opts[:stmt] = cps
475
+ last_insert_id(conn, opts)
435
476
  else
436
477
  log_connection_yield(msg, conn, args){cps.executeUpdate}
437
478
  end
438
479
  end
439
- rescue NativeException, JavaSQL::SQLException => e
480
+ rescue *DATABASE_ERROR_CLASSES => e
440
481
  raise_error(e)
441
482
  ensure
442
483
  cps.close unless name
@@ -661,7 +702,7 @@ module Sequel
661
702
  def statement(conn)
662
703
  stmt = conn.createStatement
663
704
  yield stmt
664
- rescue NativeException, JavaSQL::SQLException => e
705
+ rescue *DATABASE_ERROR_CLASSES => e
665
706
  raise_error(e)
666
707
  ensure
667
708
  stmt.close if stmt
@@ -773,11 +814,14 @@ module Sequel
773
814
  i += 1
774
815
  cols << [output_identifier(meta.getColumnLabel(i)), i, convert ? type_convertor(map, meta, meta.getColumnType(i), i) : basic_type_convertor(map, meta, meta.getColumnType(i), i)]
775
816
  end
817
+ max = i
776
818
  self.columns = cols.map{|c| c[0]}
777
819
 
778
820
  while result.next
779
821
  row = {}
780
- cols.each do |n, j, pr|
822
+ i = -1
823
+ while (i += 1) < max
824
+ n, j, pr = cols[i]
781
825
  row[n] = pr.call(result, j)
782
826
  end
783
827
  yield row