sequel 4.49.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (477) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +70 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +3 -5
  6. data/doc/advanced_associations.rdoc +86 -163
  7. data/doc/association_basics.rdoc +197 -274
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +66 -43
  10. data/doc/code_order.rdoc +1 -8
  11. data/doc/core_extensions.rdoc +81 -56
  12. data/doc/dataset_basics.rdoc +8 -17
  13. data/doc/dataset_filtering.rdoc +81 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +73 -30
  16. data/doc/migration.rdoc +19 -36
  17. data/doc/model_dataset_method_design.rdoc +14 -17
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +10 -10
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +52 -70
  22. data/doc/opening_databases.rdoc +39 -32
  23. data/doc/postgresql.rdoc +48 -38
  24. data/doc/prepared_statements.rdoc +27 -22
  25. data/doc/querying.rdoc +173 -150
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/schema_modification.rdoc +63 -60
  29. data/doc/security.rdoc +97 -88
  30. data/doc/sharding.rdoc +43 -30
  31. data/doc/sql.rdoc +53 -65
  32. data/doc/testing.rdoc +3 -5
  33. data/doc/thread_safety.rdoc +2 -4
  34. data/doc/transactions.rdoc +18 -17
  35. data/doc/validations.rdoc +48 -45
  36. data/doc/virtual_rows.rdoc +87 -115
  37. data/lib/sequel.rb +1 -1
  38. data/lib/sequel/adapters/ado.rb +9 -25
  39. data/lib/sequel/adapters/ado/access.rb +7 -13
  40. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  41. data/lib/sequel/adapters/amalgalite.rb +3 -18
  42. data/lib/sequel/adapters/ibmdb.rb +9 -45
  43. data/lib/sequel/adapters/jdbc.rb +13 -73
  44. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  45. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  46. data/lib/sequel/adapters/jdbc/h2.rb +4 -25
  47. data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
  48. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  49. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  50. data/lib/sequel/adapters/jdbc/mysql.rb +1 -15
  51. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  52. data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
  53. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  54. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  55. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  56. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  57. data/lib/sequel/adapters/mock.rb +4 -30
  58. data/lib/sequel/adapters/mysql.rb +7 -44
  59. data/lib/sequel/adapters/mysql2.rb +5 -23
  60. data/lib/sequel/adapters/odbc.rb +0 -19
  61. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  62. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  63. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  64. data/lib/sequel/adapters/oracle.rb +7 -13
  65. data/lib/sequel/adapters/postgres.rb +13 -57
  66. data/lib/sequel/adapters/postgresql.rb +1 -1
  67. data/lib/sequel/adapters/shared/access.rb +11 -51
  68. data/lib/sequel/adapters/shared/db2.rb +3 -61
  69. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  70. data/lib/sequel/adapters/shared/mysql.rb +23 -224
  71. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  72. data/lib/sequel/adapters/shared/postgres.rb +44 -259
  73. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  74. data/lib/sequel/adapters/shared/sqlite.rb +12 -101
  75. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  76. data/lib/sequel/adapters/sqlite.rb +2 -19
  77. data/lib/sequel/adapters/tinytds.rb +5 -15
  78. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  79. data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -4
  80. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  81. data/lib/sequel/adapters/utils/replace.rb +0 -5
  82. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  83. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  84. data/lib/sequel/ast_transformer.rb +3 -94
  85. data/lib/sequel/connection_pool.rb +26 -28
  86. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  87. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  88. data/lib/sequel/connection_pool/single.rb +0 -2
  89. data/lib/sequel/connection_pool/threaded.rb +94 -110
  90. data/lib/sequel/core.rb +42 -101
  91. data/lib/sequel/database.rb +12 -2
  92. data/lib/sequel/database/connecting.rb +23 -60
  93. data/lib/sequel/database/dataset.rb +6 -9
  94. data/lib/sequel/database/dataset_defaults.rb +4 -48
  95. data/lib/sequel/database/features.rb +5 -4
  96. data/lib/sequel/database/logging.rb +2 -9
  97. data/lib/sequel/database/misc.rb +23 -55
  98. data/lib/sequel/database/query.rb +8 -13
  99. data/lib/sequel/database/schema_generator.rb +89 -64
  100. data/lib/sequel/database/schema_methods.rb +61 -79
  101. data/lib/sequel/database/transactions.rb +4 -24
  102. data/lib/sequel/dataset.rb +18 -10
  103. data/lib/sequel/dataset/actions.rb +53 -107
  104. data/lib/sequel/dataset/dataset_module.rb +3 -15
  105. data/lib/sequel/dataset/features.rb +30 -30
  106. data/lib/sequel/dataset/graph.rb +40 -49
  107. data/lib/sequel/dataset/misc.rb +12 -37
  108. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  109. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  110. data/lib/sequel/dataset/query.rb +71 -155
  111. data/lib/sequel/dataset/sql.rb +30 -225
  112. data/lib/sequel/deprecated.rb +18 -27
  113. data/lib/sequel/exceptions.rb +1 -17
  114. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  115. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  116. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  117. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  118. data/lib/sequel/extensions/connection_validator.rb +1 -1
  119. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  120. data/lib/sequel/extensions/core_extensions.rb +39 -49
  121. data/lib/sequel/extensions/core_refinements.rb +39 -45
  122. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  123. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  124. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  125. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  126. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  127. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  128. data/lib/sequel/extensions/from_block.rb +1 -35
  129. data/lib/sequel/extensions/graph_each.rb +2 -2
  130. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  131. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  132. data/lib/sequel/extensions/inflector.rb +4 -4
  133. data/lib/sequel/extensions/migration.rb +23 -40
  134. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  135. data/lib/sequel/extensions/null_dataset.rb +2 -8
  136. data/lib/sequel/extensions/pagination.rb +1 -17
  137. data/lib/sequel/extensions/pg_array.rb +20 -189
  138. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  139. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  140. data/lib/sequel/extensions/pg_inet.rb +2 -15
  141. data/lib/sequel/extensions/pg_interval.rb +1 -20
  142. data/lib/sequel/extensions/pg_json.rb +7 -27
  143. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  144. data/lib/sequel/extensions/pg_range.rb +6 -121
  145. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  146. data/lib/sequel/extensions/pg_row.rb +5 -77
  147. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  148. data/lib/sequel/extensions/query.rb +3 -4
  149. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  150. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  151. data/lib/sequel/extensions/select_remove.rb +3 -3
  152. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  153. data/lib/sequel/extensions/sql_comments.rb +2 -2
  154. data/lib/sequel/extensions/string_agg.rb +11 -8
  155. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  156. data/lib/sequel/model.rb +27 -62
  157. data/lib/sequel/model/associations.rb +128 -131
  158. data/lib/sequel/model/base.rb +171 -711
  159. data/lib/sequel/model/default_inflections.rb +1 -1
  160. data/lib/sequel/model/errors.rb +0 -3
  161. data/lib/sequel/model/exceptions.rb +2 -6
  162. data/lib/sequel/model/inflections.rb +1 -26
  163. data/lib/sequel/model/plugins.rb +1 -0
  164. data/lib/sequel/plugins/active_model.rb +2 -5
  165. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  166. data/lib/sequel/plugins/association_pks.rb +14 -28
  167. data/lib/sequel/plugins/association_proxies.rb +6 -7
  168. data/lib/sequel/plugins/auto_validations.rb +4 -4
  169. data/lib/sequel/plugins/before_after_save.rb +0 -43
  170. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  171. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  172. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  173. data/lib/sequel/plugins/caching.rb +5 -5
  174. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  175. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  176. data/lib/sequel/plugins/column_select.rb +2 -2
  177. data/lib/sequel/plugins/composition.rb +15 -24
  178. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  179. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  180. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  181. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  182. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  183. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  184. data/lib/sequel/plugins/finder.rb +16 -10
  185. data/lib/sequel/plugins/force_encoding.rb +1 -7
  186. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  187. data/lib/sequel/plugins/input_transformer.rb +10 -11
  188. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  189. data/lib/sequel/plugins/instance_filters.rb +5 -5
  190. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  191. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  192. data/lib/sequel/plugins/json_serializer.rb +19 -19
  193. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  194. data/lib/sequel/plugins/list.rb +6 -6
  195. data/lib/sequel/plugins/many_through_many.rb +11 -8
  196. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  197. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  198. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  199. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  200. data/lib/sequel/plugins/pg_row.rb +2 -11
  201. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  202. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  203. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  204. data/lib/sequel/plugins/serialization.rb +15 -33
  205. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  206. data/lib/sequel/plugins/sharding.rb +2 -8
  207. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  208. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  209. data/lib/sequel/plugins/static_cache.rb +8 -9
  210. data/lib/sequel/plugins/string_stripper.rb +3 -3
  211. data/lib/sequel/plugins/subclasses.rb +1 -1
  212. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  213. data/lib/sequel/plugins/table_select.rb +2 -2
  214. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  215. data/lib/sequel/plugins/timestamps.rb +6 -7
  216. data/lib/sequel/plugins/touch.rb +4 -8
  217. data/lib/sequel/plugins/tree.rb +3 -3
  218. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  219. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  220. data/lib/sequel/plugins/update_or_create.rb +3 -3
  221. data/lib/sequel/plugins/update_refresh.rb +3 -3
  222. data/lib/sequel/plugins/uuid.rb +7 -11
  223. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  224. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  225. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  226. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  227. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  228. data/lib/sequel/sql.rb +145 -276
  229. data/lib/sequel/timezones.rb +8 -22
  230. data/lib/sequel/version.rb +2 -2
  231. data/spec/adapter_spec.rb +1 -1
  232. data/spec/adapters/db2_spec.rb +2 -103
  233. data/spec/adapters/mssql_spec.rb +89 -68
  234. data/spec/adapters/mysql_spec.rb +101 -480
  235. data/spec/adapters/oracle_spec.rb +1 -9
  236. data/spec/adapters/postgres_spec.rb +312 -565
  237. data/spec/adapters/spec_helper.rb +12 -31
  238. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  239. data/spec/adapters/sqlite_spec.rb +8 -146
  240. data/spec/bin_spec.rb +11 -16
  241. data/spec/core/connection_pool_spec.rb +173 -74
  242. data/spec/core/database_spec.rb +64 -244
  243. data/spec/core/dataset_spec.rb +81 -415
  244. data/spec/core/deprecated_spec.rb +3 -3
  245. data/spec/core/expression_filters_spec.rb +37 -144
  246. data/spec/core/mock_adapter_spec.rb +176 -4
  247. data/spec/core/object_graph_spec.rb +11 -60
  248. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  249. data/spec/core/schema_generator_spec.rb +51 -40
  250. data/spec/core/schema_spec.rb +74 -77
  251. data/spec/core/spec_helper.rb +6 -24
  252. data/spec/core/version_spec.rb +1 -1
  253. data/spec/core_extensions_spec.rb +7 -83
  254. data/spec/core_model_spec.rb +2 -2
  255. data/spec/deprecation_helper.rb +2 -14
  256. data/spec/extensions/accessed_columns_spec.rb +1 -1
  257. data/spec/extensions/active_model_spec.rb +3 -3
  258. data/spec/extensions/after_initialize_spec.rb +1 -1
  259. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  260. data/spec/extensions/association_dependencies_spec.rb +1 -1
  261. data/spec/extensions/association_pks_spec.rb +4 -59
  262. data/spec/extensions/association_proxies_spec.rb +1 -1
  263. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  264. data/spec/extensions/auto_validations_spec.rb +1 -1
  265. data/spec/extensions/blacklist_security_spec.rb +1 -1
  266. data/spec/extensions/blank_spec.rb +1 -1
  267. data/spec/extensions/boolean_readers_spec.rb +1 -1
  268. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  269. data/spec/extensions/caching_spec.rb +1 -1
  270. data/spec/extensions/class_table_inheritance_spec.rb +35 -1086
  271. data/spec/extensions/column_conflicts_spec.rb +1 -1
  272. data/spec/extensions/column_select_spec.rb +4 -4
  273. data/spec/extensions/columns_introspection_spec.rb +1 -1
  274. data/spec/extensions/columns_updated_spec.rb +1 -1
  275. data/spec/extensions/composition_spec.rb +1 -7
  276. data/spec/extensions/connection_expiration_spec.rb +3 -3
  277. data/spec/extensions/connection_validator_spec.rb +3 -3
  278. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  279. data/spec/extensions/constraint_validations_spec.rb +1 -1
  280. data/spec/extensions/core_refinements_spec.rb +1 -3
  281. data/spec/extensions/csv_serializer_spec.rb +4 -9
  282. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  283. data/spec/extensions/dataset_associations_spec.rb +2 -1
  284. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  285. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  286. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  287. data/spec/extensions/defaults_setter_spec.rb +2 -2
  288. data/spec/extensions/delay_add_association_spec.rb +8 -9
  289. data/spec/extensions/dirty_spec.rb +1 -1
  290. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  291. data/spec/extensions/eager_each_spec.rb +2 -2
  292. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  293. data/spec/extensions/error_splitter_spec.rb +1 -1
  294. data/spec/extensions/error_sql_spec.rb +1 -1
  295. data/spec/extensions/eval_inspect_spec.rb +1 -1
  296. data/spec/extensions/finder_spec.rb +1 -1
  297. data/spec/extensions/force_encoding_spec.rb +2 -5
  298. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  299. data/spec/extensions/graph_each_spec.rb +5 -5
  300. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  301. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  302. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  303. data/spec/extensions/inflector_spec.rb +1 -1
  304. data/spec/extensions/input_transformer_spec.rb +7 -2
  305. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  306. data/spec/extensions/instance_filters_spec.rb +1 -1
  307. data/spec/extensions/instance_hooks_spec.rb +1 -95
  308. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  309. data/spec/extensions/json_serializer_spec.rb +1 -1
  310. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  311. data/spec/extensions/list_spec.rb +1 -1
  312. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  313. data/spec/extensions/many_through_many_spec.rb +1 -1
  314. data/spec/extensions/migration_spec.rb +2 -2
  315. data/spec/extensions/modification_detection_spec.rb +1 -1
  316. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  317. data/spec/extensions/named_timezones_spec.rb +3 -3
  318. data/spec/extensions/nested_attributes_spec.rb +1 -29
  319. data/spec/extensions/null_dataset_spec.rb +1 -11
  320. data/spec/extensions/optimistic_locking_spec.rb +1 -1
  321. data/spec/extensions/pagination_spec.rb +1 -1
  322. data/spec/extensions/pg_array_associations_spec.rb +4 -1
  323. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  324. data/spec/extensions/pg_array_spec.rb +3 -48
  325. data/spec/extensions/pg_enum_spec.rb +1 -1
  326. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  327. data/spec/extensions/pg_hstore_spec.rb +23 -32
  328. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_inet_spec.rb +1 -14
  330. data/spec/extensions/pg_interval_spec.rb +3 -13
  331. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  332. data/spec/extensions/pg_json_spec.rb +1 -13
  333. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  334. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_range_spec.rb +3 -88
  336. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  337. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  338. data/spec/extensions/pg_row_spec.rb +1 -44
  339. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  340. data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
  341. data/spec/extensions/prepared_statements_spec.rb +13 -48
  342. data/spec/extensions/pretty_table_spec.rb +1 -1
  343. data/spec/extensions/query_spec.rb +1 -12
  344. data/spec/extensions/rcte_tree_spec.rb +1 -1
  345. data/spec/extensions/round_timestamps_spec.rb +1 -5
  346. data/spec/extensions/s_spec.rb +1 -1
  347. data/spec/extensions/schema_caching_spec.rb +1 -1
  348. data/spec/extensions/schema_dumper_spec.rb +1 -1
  349. data/spec/extensions/select_remove_spec.rb +1 -1
  350. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  351. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  352. data/spec/extensions/serialization_spec.rb +2 -14
  353. data/spec/extensions/server_block_spec.rb +1 -1
  354. data/spec/extensions/server_logging_spec.rb +2 -2
  355. data/spec/extensions/sharding_spec.rb +1 -1
  356. data/spec/extensions/shared_caching_spec.rb +1 -28
  357. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  358. data/spec/extensions/singular_table_names_spec.rb +1 -1
  359. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  360. data/spec/extensions/spec_helper.rb +5 -27
  361. data/spec/extensions/split_array_nil_spec.rb +1 -1
  362. data/spec/extensions/split_values_spec.rb +1 -1
  363. data/spec/extensions/sql_comments_spec.rb +1 -1
  364. data/spec/extensions/sql_expr_spec.rb +1 -1
  365. data/spec/extensions/static_cache_spec.rb +1 -1
  366. data/spec/extensions/string_agg_spec.rb +2 -2
  367. data/spec/extensions/string_date_time_spec.rb +1 -1
  368. data/spec/extensions/string_stripper_spec.rb +1 -1
  369. data/spec/extensions/subclasses_spec.rb +1 -1
  370. data/spec/extensions/subset_conditions_spec.rb +1 -1
  371. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  372. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  373. data/spec/extensions/table_select_spec.rb +4 -4
  374. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  375. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  376. data/spec/extensions/timestamps_spec.rb +3 -3
  377. data/spec/extensions/to_dot_spec.rb +1 -1
  378. data/spec/extensions/touch_spec.rb +1 -1
  379. data/spec/extensions/tree_spec.rb +1 -1
  380. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  381. data/spec/extensions/unlimited_update_spec.rb +1 -1
  382. data/spec/extensions/update_or_create_spec.rb +1 -1
  383. data/spec/extensions/update_primary_key_spec.rb +4 -3
  384. data/spec/extensions/update_refresh_spec.rb +1 -1
  385. data/spec/extensions/uuid_spec.rb +10 -12
  386. data/spec/extensions/validate_associated_spec.rb +1 -1
  387. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  388. data/spec/extensions/validation_contexts_spec.rb +1 -1
  389. data/spec/extensions/validation_helpers_spec.rb +10 -44
  390. data/spec/extensions/whitelist_security_spec.rb +5 -5
  391. data/spec/extensions/xml_serializer_spec.rb +3 -3
  392. data/spec/guards_helper.rb +2 -1
  393. data/spec/integration/associations_test.rb +1 -23
  394. data/spec/integration/database_test.rb +7 -7
  395. data/spec/integration/dataset_test.rb +5 -47
  396. data/spec/integration/eager_loader_test.rb +1 -1
  397. data/spec/integration/migrator_test.rb +1 -1
  398. data/spec/integration/model_test.rb +4 -82
  399. data/spec/integration/plugin_test.rb +6 -22
  400. data/spec/integration/prepared_statement_test.rb +8 -88
  401. data/spec/integration/schema_test.rb +6 -6
  402. data/spec/integration/spec_helper.rb +13 -21
  403. data/spec/integration/timezone_test.rb +5 -5
  404. data/spec/integration/transaction_test.rb +3 -55
  405. data/spec/integration/type_test.rb +9 -9
  406. data/spec/model/association_reflection_spec.rb +24 -9
  407. data/spec/model/associations_spec.rb +124 -303
  408. data/spec/model/base_spec.rb +18 -137
  409. data/spec/model/class_dataset_methods_spec.rb +2 -20
  410. data/spec/model/dataset_methods_spec.rb +1 -20
  411. data/spec/model/eager_loading_spec.rb +17 -11
  412. data/spec/model/hooks_spec.rb +5 -300
  413. data/spec/model/inflector_spec.rb +1 -1
  414. data/spec/model/model_spec.rb +15 -320
  415. data/spec/model/plugins_spec.rb +2 -16
  416. data/spec/model/record_spec.rb +29 -121
  417. data/spec/model/spec_helper.rb +5 -15
  418. data/spec/model/validations_spec.rb +1 -1
  419. data/spec/sequel_warning.rb +1 -12
  420. metadata +8 -64
  421. data/doc/active_record.rdoc +0 -927
  422. data/lib/sequel/adapters/cubrid.rb +0 -160
  423. data/lib/sequel/adapters/do.rb +0 -166
  424. data/lib/sequel/adapters/do/mysql.rb +0 -69
  425. data/lib/sequel/adapters/do/postgres.rb +0 -46
  426. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  427. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  428. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  429. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  430. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  431. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  432. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  433. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  434. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  435. data/lib/sequel/adapters/shared/informix.rb +0 -63
  436. data/lib/sequel/adapters/shared/progress.rb +0 -40
  437. data/lib/sequel/adapters/swift.rb +0 -169
  438. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  439. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  440. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  441. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  442. data/lib/sequel/dataset/mutation.rb +0 -98
  443. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  444. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  445. data/lib/sequel/extensions/filter_having.rb +0 -65
  446. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  447. data/lib/sequel/extensions/meta_def.rb +0 -37
  448. data/lib/sequel/extensions/query_literals.rb +0 -86
  449. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  450. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  451. data/lib/sequel/extensions/set_overrides.rb +0 -82
  452. data/lib/sequel/no_core_ext.rb +0 -4
  453. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  454. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  455. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  456. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  457. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  458. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  459. data/lib/sequel/plugins/schema.rb +0 -84
  460. data/lib/sequel/plugins/scissors.rb +0 -37
  461. data/spec/core/dataset_mutation_spec.rb +0 -253
  462. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  463. data/spec/extensions/before_after_save_spec.rb +0 -40
  464. data/spec/extensions/filter_having_spec.rb +0 -42
  465. data/spec/extensions/from_block_spec.rb +0 -21
  466. data/spec/extensions/hash_aliases_spec.rb +0 -26
  467. data/spec/extensions/identifier_columns_spec.rb +0 -19
  468. data/spec/extensions/meta_def_spec.rb +0 -35
  469. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  470. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  471. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  472. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  473. data/spec/extensions/query_literals_spec.rb +0 -185
  474. data/spec/extensions/schema_spec.rb +0 -123
  475. data/spec/extensions/scissors_spec.rb +0 -27
  476. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  477. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -22,9 +22,12 @@ module Sequel
22
22
  # truncate, unfiltered, ungraphed, ungrouped, union, unlimited, unordered, where, where_all,
23
23
  # where_each, where_single_value, with, with_recursive, with_sql
24
24
  module ClassMethods
25
- # Which columns should be the only columns allowed in a call to a mass assignment method (e.g. set)
26
- # (default: not set, so all columns not otherwise restricted are allowed).
27
- attr_reader :allowed_columns # SEQUEL5: Deprecate after release
25
+ # :nocov:
26
+ def allowed_columns
27
+ Sequel::Deprecation.deprecate("Model.allowed_columns", "It has been moved to the whitelist_security plugin")
28
+ nil
29
+ end
30
+ # :nocov:
28
31
 
29
32
  # Whether to cache the anonymous models created by Sequel::Model(), true by default. This is
30
33
  # required for reloading them correctly (avoiding the superclass mismatch).
@@ -80,24 +83,10 @@ module Sequel
80
83
  # Sequel will not check the number of rows modified (default: true).
81
84
  attr_accessor :require_modification
82
85
 
83
- # Requires that all models have valid tables, raising exceptions if creating a model
84
- # without a valid table backing it. Enabling this will break code like:
85
- #
86
- # class Foo < Sequel::Model
87
- # set_dataset :my_foo
88
- # end
89
- #
90
- # As when Sequel::Model is subclassed, before set_dataset is executed, it will try to
91
- # get the schema for the foos table, which will raise an exception. You would need to
92
- # switch to using:
93
- #
94
- # class Foo < Sequel::Model(:my_foo)
95
- # end
96
- #
97
- # or:
98
- #
99
- # Foo = Class.new(Sequel::Model)
100
- # Foo.set_dataset :my_foo
86
+ # If true (the default), tequires that all models have valid tables,
87
+ # raising exceptions if creating a model without a valid table backing it.
88
+ # Setting this to false will allow the creation of model classes where the
89
+ # underlying table doesn't exist.
101
90
  attr_accessor :require_valid_table
102
91
 
103
92
  # Should be the literal primary key column name if this Model's table has a simple primary key, or
@@ -108,7 +97,7 @@ module Sequel
108
97
  # or nil otherwise. This and simple_pk are used for an optimization in Model.[].
109
98
  attr_reader :simple_table
110
99
 
111
- # Whether new/set/update and their variants should raise an error
100
+ # Whether mass assigning via .create/.new/#set/#update should raise an error
112
101
  # if an invalid key is used. A key is invalid if no setter method exists
113
102
  # for that key or the access to the setter method is restricted (e.g. due to it
114
103
  # being a primary key field). If set to false, silently skip
@@ -127,10 +116,16 @@ module Sequel
127
116
  # database to typecast the value correctly.
128
117
  attr_accessor :typecast_on_assignment
129
118
 
130
- # Whether to enable the after_commit and after_rollback hooks when saving/destroying
131
- # instances. On by default, can be turned off for performance reasons or when using
132
- # prepared transactions (which aren't compatible with after commit/rollback).
133
- attr_accessor :use_after_commit_rollback # SEQUEL5: Deprecate after release
119
+ # :nocov:
120
+ def use_after_commit_rollback
121
+ Sequel::Deprecation.deprecate("Model.use_after_commit_rollback", "Model transaction hooks have been removed, switch to using database transaction hooks")
122
+ false
123
+ end
124
+ def use_after_commit_rollback=(v)
125
+ Sequel::Deprecation.deprecate("Model.use_after_commit_rollback=", "Model transaction hooks have been removed, switch to using database transaction hooks")
126
+ false
127
+ end
128
+ # :nocov:
134
129
 
135
130
  # Whether to use a transaction by default when saving/deleting records (default: true).
136
131
  # If you are sending database queries in before_* or after_* hooks, you shouldn't change
@@ -159,7 +154,7 @@ module Sequel
159
154
  # end
160
155
  def def_Model(mod)
161
156
  model = self
162
- (class << mod; self; end).send(:define_method, :Model) do |source|
157
+ mod.define_singleton_method(:Model) do |source|
163
158
  model.Model(source)
164
159
  end
165
160
  end
@@ -179,11 +174,8 @@ module Sequel
179
174
  # classes in order to create the dataset.
180
175
  #
181
176
  # The purpose of this method is to set the dataset/database automatically
182
- # for a model class, if the table name doesn't match the implicit
183
- # name. This is neater than using set_dataset inside the class,
184
- # doesn't require a bogus query for the schema, and works when using
185
- # +require_valid_table+, or with plugins that assume a model's dataset
186
- # is valid.
177
+ # for a model class, if the table name doesn't match the default table
178
+ # name that Sequel would use.
187
179
  #
188
180
  # When creating subclasses of Sequel::Model itself, this method is usually
189
181
  # called on Sequel itself, using <tt>Sequel::Model(:something)</tt>.
@@ -225,22 +217,6 @@ module Sequel
225
217
  klass
226
218
  end
227
219
 
228
- def initialize_copy(_)
229
- Sequel::Deprecation.deprecate("Model.clone", "Create a subclass of the model instead of cloning it")
230
- # raise(Error, "cannot dup/clone a Sequel::Model class") # SEQUEL5
231
- super
232
- end
233
- def dup
234
- Sequel::Deprecation.deprecate("Model.dup", "Create a subclass of the model instead of duping it")
235
- # raise(Error, "cannot dup/clone a Sequel::Model class") # SEQUEL5
236
- super
237
- end
238
-
239
- def <<(arg)
240
- Sequel::Deprecation.deprecate("Sequel::Model.<<", "Switch to using #insert")
241
- dataset << (arg)
242
- end
243
-
244
220
  # Returns the first record from the database matching the conditions.
245
221
  # If a hash is given, it is used as the conditions. If another
246
222
  # object is given, it finds the first record whose primary key(s) match
@@ -249,7 +225,7 @@ module Sequel
249
225
  # Artist[1] # SELECT * FROM artists WHERE id = 1
250
226
  # # => #<Artist {:id=>1, ...}>
251
227
  #
252
- # Artist[:name=>'Bob'] # SELECT * FROM artists WHERE (name = 'Bob') LIMIT 1
228
+ # Artist[name: 'Bob'] # SELECT * FROM artists WHERE (name = 'Bob') LIMIT 1
253
229
  # # => #<Artist {:name=>'Bob', ...}>
254
230
  def [](*args)
255
231
  args = args.first if args.size <= 1
@@ -286,7 +262,7 @@ module Sequel
286
262
 
287
263
  # Creates instance using new with the given values and block, and saves it.
288
264
  #
289
- # Artist.create(:name=>'Bob')
265
+ # Artist.create(name: 'Bob')
290
266
  # # INSERT INTO artists (name) VALUES ('Bob')
291
267
  #
292
268
  # Artist.create do |a|
@@ -315,7 +291,7 @@ module Sequel
315
291
  # a plugin with the methods defined in DatasetMethods.
316
292
  # This is the recommended way to add methods to model datasets.
317
293
  #
318
- # If an argument, it should be a module, and is used to extend
294
+ # If given an argument, it should be a module, and is used to extend
319
295
  # the underlying dataset. Otherwise an anonymous module is created, and
320
296
  # if a block is given, it is module_evaled, allowing you do define
321
297
  # dataset methods directly using the standard ruby def syntax.
@@ -342,7 +318,7 @@ module Sequel
342
318
  # named dataset methods:
343
319
  #
344
320
  # Album.dataset_module do
345
- # subset :released, Sequel.identifier(release_date) <= Sequel::CURRENT_DATE
321
+ # where(:released, Sequel[:release_date] <= Sequel::CURRENT_DATE)
346
322
  # order :by_release_date, :release_date
347
323
  # select :for_select_options, :id, :name, :release_date
348
324
  # end
@@ -359,6 +335,10 @@ module Sequel
359
335
  # group_append, having, limit, offset, order, order_append, order_prepend, select, select_all,
360
336
  # select_append, select_group, where, and server.
361
337
  #
338
+ # The advantage of using these DatasetModule methods to define your dataset
339
+ # methods is that they can take advantage of dataset caching to improve
340
+ # performance.
341
+ #
362
342
  # Any public methods in the dataset module will have class methods created that
363
343
  # call the method on the dataset, assuming that the class method is not already
364
344
  # defined.
@@ -382,7 +362,7 @@ module Sequel
382
362
  # been created, raises an error.
383
363
  #
384
364
  # Artist.db.transaction do # BEGIN
385
- # Artist.create(:name=>'Bob')
365
+ # Artist.create(name: 'Bob')
386
366
  # # INSERT INTO artists (name) VALUES ('Bob')
387
367
  # end # COMMIT
388
368
  def db
@@ -392,26 +372,23 @@ module Sequel
392
372
  @db
393
373
  end
394
374
 
395
- # Sets the database associated with the Model class. If the
396
- # model has an associated dataset, sets the model's dataset
397
- # to a dataset on the new database with the same options
398
- # used by the current dataset. This can be used directly on
399
- # Sequel::Model to set the default database to be used
400
- # by subclasses, or to override the database used for specific
401
- # models:
375
+ # Sets the database associated with the Model class.
376
+ # Should only be used if the Model class currently does not
377
+ # have a dataset defined.
378
+ #
379
+ # This can be used directly on Sequel::Model to set the default database to be used
380
+ # by subclasses, or to override the database used for specific models:
402
381
  #
403
382
  # Sequel::Model.db = DB1
383
+ # Artist = Class.new(Sequel::Model)
404
384
  # Artist.db = DB2
405
385
  #
406
386
  # Note that you should not use this to change the model's database
407
387
  # at runtime. If you have that need, you should look into Sequel's
408
- # sharding support.
388
+ # sharding support, or consider using separate model classes per Database.
409
389
  def db=(db)
390
+ raise Error, "Cannot use Sequel::Model.db= on model with existing dataset. Use Sequel::Model.dataset= instead." if @dataset
410
391
  @db = db
411
- if @dataset
412
- Sequel::Deprecation.deprecate("Sequel::Model.db= when the model has an existing dataset", "Use Sequel::Model.dataset= instead")
413
- set_dataset(db.dataset.clone(@dataset.opts))
414
- end
415
392
  end
416
393
 
417
394
  # Returns the cached schema information if available or gets it
@@ -438,44 +415,10 @@ module Sequel
438
415
  end
439
416
  end
440
417
 
441
- # If a block is given, define a method on the dataset (if the model currently has an dataset) with the given argument name using
442
- # the given block. Also define a class method on the model that calls the
443
- # dataset method. Stores the method name and block so that it can be reapplied if the model's
444
- # dataset changes.
445
- #
446
- # If a block is not given, just define a class method on the model for each argument
447
- # that calls the dataset method of the same argument name.
448
- #
449
- # Using dataset_module is recommended over using this method. In addition to allowing
450
- # more natural ruby syntax for defining methods manually, it also offers numerous
451
- # helper methods that make defining common dataset methods more easily, as well as
452
- # supporting dataset caching (assuming the arguments allow it).
453
- #
454
- # # Add new dataset method and class method that calls it
455
- # Artist.def_dataset_method(:by_name){order(:name)}
456
- # Artist.where(:name.like('A%')).by_name
457
- # Artist.by_name.where(:name.like('A%'))
458
- #
459
- # # Just add a class method that calls an existing dataset method
460
- # Artist.def_dataset_method(:paginate)
461
- # Artist.paginate(2, 10)
462
- def def_dataset_method(*args, &block)
463
- raise(Error, "No arguments given") if args.empty?
464
-
465
- if block
466
- raise(Error, "Defining a dataset method using a block requires only one argument") if args.length > 1
467
- Sequel::Deprecation.deprecate("Sequel::Model.def_dataset_method", "Define the method inside a dataset_module block, or use the def_dataset_method_plugin")
468
- dataset_module{define_method(args.first, &block)}
469
- else
470
- Sequel::Deprecation.deprecate("Sequel::Model.def_dataset_method", "Define a class method that calls the dataset method, or use the def_dataset_method_plugin")
471
- args.each{|arg| def_model_dataset_method(arg)}
472
- end
473
- end
474
-
475
418
  # Finds a single record according to the supplied filter.
476
419
  # You are encouraged to use Model.[] or Model.first instead of this method.
477
420
  #
478
- # Artist.find(:name=>'Bob')
421
+ # Artist.find(name: 'Bob')
479
422
  # # SELECT * FROM artists WHERE (name = 'Bob') LIMIT 1
480
423
  #
481
424
  # Artist.find{name > 'M'}
@@ -489,171 +432,33 @@ module Sequel
489
432
  # to +find+, but instead is passed to +create+ only if +find+ does not
490
433
  # return an object.
491
434
  #
492
- # Artist.find_or_create(:name=>'Bob')
435
+ # Artist.find_or_create(name: 'Bob')
493
436
  # # SELECT * FROM artists WHERE (name = 'Bob') LIMIT 1
494
437
  # # INSERT INTO artists (name) VALUES ('Bob')
495
438
  #
496
- # Artist.find_or_create(:name=>'Jim'){|a| a.hometown = 'Sactown'}
439
+ # Artist.find_or_create(name: 'Jim'){|a| a.hometown = 'Sactown'}
497
440
  # # SELECT * FROM artists WHERE (name = 'Jim') LIMIT 1
498
441
  # # INSERT INTO artists (name, hometown) VALUES ('Jim', 'Sactown')
499
442
  def find_or_create(cond, &block)
500
443
  find(cond) || create(cond, &block)
501
444
  end
502
445
 
503
- FINDER_TYPES = [:first, :all, :each, :get].freeze
504
-
505
- # Create an optimized finder method using a dataset placeholder literalizer.
506
- # This pre-computes the SQL to use for the query, except for given arguments.
507
- #
508
- # There are two ways to use this. The recommended way is to pass a symbol
509
- # that represents a model class method that returns a dataset:
510
- #
511
- # def Artist.by_name(name)
512
- # where(:name=>name)
513
- # end
514
- #
515
- # Artist.finder :by_name
516
- #
517
- # This creates an optimized first_by_name method, which you can call normally:
518
- #
519
- # Artist.first_by_name("Joe")
520
- #
521
- # The alternative way to use this to pass your own block:
522
- #
523
- # Artist.finder(:name=>:first_by_name){|pl, ds| ds.where(:name=>pl.arg).limit(1)}
524
- #
525
- # Note that if you pass your own block, you are responsible for manually setting
526
- # limits if necessary (as shown above).
527
- #
528
- # Options:
529
- # :arity :: When using a symbol method name, this specifies the arity of the method.
530
- # This should be used if if the method accepts an arbitrary number of arguments,
531
- # or the method has default argument values. Note that if the method is defined
532
- # as a dataset method, the class method Sequel creates accepts an arbitrary number
533
- # of arguments, so you should use this option in that case. If you want to handle
534
- # multiple possible arities, you need to call the finder method multiple times with
535
- # unique :arity and :name methods each time.
536
- # :name :: The name of the method to create. This must be given if you pass a block.
537
- # If you use a symbol, this defaults to the symbol prefixed by the type.
538
- # :mod :: The module in which to create the finder method. Defaults to the singleton
539
- # class of the model.
540
- # :type :: The type of query to run. Can be :first, :each, :all, or :get, defaults to
541
- # :first.
542
- #
543
- # Caveats:
544
- #
545
- # This doesn't handle all possible cases. For example, if you have a method such as:
546
- #
547
- # def Artist.by_name(name)
548
- # name ? where(:name=>name) : exclude(:name=>nil)
549
- # end
550
- #
551
- # Then calling a finder without an argument will not work as you expect.
552
- #
553
- # Artist.finder :by_name
554
- # Artist.by_name(nil).first
555
- # # WHERE (name IS NOT NULL)
556
- # Artist.first_by_name(nil)
557
- # # WHERE (name IS NULL)
558
- #
559
- # See Dataset::PlaceholderLiteralizer for additional caveats.
560
- def finder(meth=OPTS, opts=OPTS, &block)
561
- Sequel::Deprecation.deprecate("Sequel::Model.finder and Sequel::Model.prepared_finder", "They have been moved to the finder plugin")
562
- if block
563
- raise Error, "cannot pass both a method name argument and a block of Model.finder" unless meth.is_a?(Hash)
564
- raise Error, "cannot pass two option hashes to Model.finder" unless opts.equal?(OPTS)
565
- opts = meth
566
- raise Error, "must provide method name via :name option when passing block to Model.finder" unless meth_name = opts[:name]
567
- end
568
-
569
- type = opts.fetch(:type, :first)
570
- unless prepare = opts[:prepare]
571
- raise Error, ":type option to Model.finder must be :first, :all, :each, or :get" unless FINDER_TYPES.include?(type)
572
- end
573
- limit1 = type == :first || type == :get
574
- meth_name ||= opts[:name] || :"#{type}_#{meth}"
575
-
576
- argn = lambda do |model|
577
- if arity = opts[:arity]
578
- arity
579
- else
580
- method = block || model.method(meth)
581
- (method.arity < 0 ? method.arity.abs - 1 : method.arity)
582
- end
583
- end
584
-
585
- loader_proc = if prepare
586
- proc do |model|
587
- args = prepare_method_args('$a', argn.call(model))
588
- ds = if block
589
- model.instance_exec(*args, &block)
590
- else
591
- model.send(meth, *args)
592
- end
593
- ds = ds.limit(1) if limit1
594
- model_name = model.name
595
- if model_name.to_s.empty?
596
- model_name = model.object_id
597
- else
598
- model_name = model_name.gsub(/\W/, '_')
599
- end
600
- ds.prepare(type, :"#{model_name}_#{meth_name}")
601
- end
602
- else
603
- proc do |model|
604
- n = argn.call(model)
605
- block ||= lambda do |pl, model2|
606
- args = (0...n).map{pl.arg}
607
- ds = model2.send(meth, *args)
608
- ds = ds.limit(1) if limit1
609
- ds
610
- end
611
-
612
- Sequel::Dataset::PlaceholderLiteralizer.loader(model, &block)
613
- end
614
- end
615
-
616
- @finder_loaders[meth_name] = loader_proc
617
- mod = opts[:mod] || (class << self; self; end)
618
- if prepare
619
- def_prepare_method(mod, meth_name)
620
- else
621
- def_finder_method(mod, meth_name, type)
622
- end
623
- end
624
-
625
- def first_where(cond)
626
- Sequel::Deprecation.deprecate("Sequel::Model.first_where", "Instead, use Sequel::Model.first")
627
- if cond.is_a?(Integer)
628
- dataset.where(cond).first(cond)
629
- else
630
- dataset.first(cond)
631
- end
632
- end
633
-
634
446
  # Freeze a model class, disallowing any further changes to it.
635
447
  def freeze
636
448
  dataset_module.freeze
637
449
  overridable_methods_module.freeze
638
450
 
639
- @finder_loaders.freeze # SEQUEL5: Remove
640
-
641
451
  if @dataset
642
- @dataset.freeze
643
- @instance_dataset.freeze
644
452
  db_schema.freeze.each_value(&:freeze)
645
453
  columns.freeze
646
454
  setter_methods.freeze
647
- @finder_loaders.each_key{|k| finder_for(k)} # SEQUEL5: Remove
648
455
  else
649
456
  @setter_methods = [].freeze
650
457
  end
651
458
 
652
459
  @dataset_method_modules.freeze
653
460
  @default_set_fields_options.freeze
654
- @finders.freeze # SEQUEL5: Remove
655
461
  @plugins.freeze
656
- @allowed_columns.freeze if @allowed_columns # SEQUEL5: Remove
657
462
 
658
463
  super
659
464
  end
@@ -676,9 +481,9 @@ module Sequel
676
481
  # end
677
482
  def inherited(subclass)
678
483
  super
679
- ivs = subclass.instance_variables.map(&:to_s)
484
+ ivs = subclass.instance_variables
680
485
  inherited_instance_variables.each do |iv, dup|
681
- next if ivs.include?(iv.to_s)
486
+ next if ivs.include?(iv)
682
487
  if (sup_class_value = instance_variable_get(iv)) && dup
683
488
  sup_class_value = case dup
684
489
  when :dup
@@ -720,7 +525,7 @@ module Sequel
720
525
  call(values)
721
526
  end
722
527
 
723
- # Clear the setter_methods cache when a setter method is added
528
+ # Clear the setter_methods cache when a setter method is added.
724
529
  def method_added(meth)
725
530
  clear_setter_methods_cache if meth.to_s.end_with?('=')
726
531
  super
@@ -739,17 +544,16 @@ module Sequel
739
544
 
740
545
  # Loads a plugin for use with the model class, passing optional arguments
741
546
  # to the plugin. If the plugin is a module, load it directly. Otherwise,
742
- # require the plugin from either sequel/plugins/#{plugin} or
743
- # sequel_#{plugin}, and then attempt to load the module using a
744
- # the camelized plugin name under Sequel::Plugins.
547
+ # require the plugin from sequel/plugins/#{plugin} and then attempt to load
548
+ # the module using a the camelized plugin name under Sequel::Plugins.
745
549
  def plugin(plugin, *args, &block)
746
550
  m = plugin.is_a?(Module) ? plugin : plugin_module(plugin)
747
551
  unless @plugins.include?(m)
748
552
  @plugins << m
749
553
  m.apply(self, *args, &block) if m.respond_to?(:apply)
750
- extend(m::ClassMethods) if plugin_module_defined?(m, :ClassMethods)
751
- include(m::InstanceMethods) if plugin_module_defined?(m, :InstanceMethods)
752
- if plugin_module_defined?(m, :DatasetMethods)
554
+ extend(m::ClassMethods) if m.const_defined?(:ClassMethods, false)
555
+ include(m::InstanceMethods) if m.const_defined?(:InstanceMethods, false)
556
+ if m.const_defined?(:DatasetMethods, false)
753
557
  dataset_extend(m::DatasetMethods, :create_class_methods=>false)
754
558
  end
755
559
  end
@@ -797,28 +601,6 @@ module Sequel
797
601
  end
798
602
  end
799
603
 
800
- # Similar to finder, but uses a prepared statement instead of a placeholder
801
- # literalizer. This makes the SQL used static (cannot vary per call), but
802
- # allows binding argument values instead of literalizing them into the SQL
803
- # query string.
804
- #
805
- # If a block is used with this method, it is instance_execed by the model,
806
- # and should accept the desired number of placeholder arguments.
807
- #
808
- # The options are the same as the options for finder, with the following
809
- # exception:
810
- # :type :: Specifies the type of prepared statement to create
811
- def prepared_finder(meth=OPTS, opts=OPTS, &block)
812
- # SEQUEL5: Remove
813
- if block
814
- raise Error, "cannot pass both a method name argument and a block of Model.finder" unless meth.is_a?(Hash)
815
- meth = meth.merge(:prepare=>true)
816
- else
817
- opts = opts.merge(:prepare=>true)
818
- end
819
- finder(meth, opts, &block)
820
- end
821
-
822
604
  # Restrict the setting of the primary key(s) when using mass assignment (e.g. +set+). Because
823
605
  # this is the default, this only make sense to use in a subclass where the
824
606
  # parent class has used +unrestrict_primary_key+.
@@ -833,23 +615,6 @@ module Sequel
833
615
  @restrict_primary_key
834
616
  end
835
617
 
836
- # Set the columns to allow when using mass assignment (e.g. +set+). Using this means that
837
- # any columns not listed here will not be modified. If you have any virtual
838
- # setter methods (methods that end in =) that you want to be used during
839
- # mass assignment, they need to be listed here as well (without the =).
840
- #
841
- # It may be better to use a method such as +set_only+ or +set_fields+ that lets you specify
842
- # the allowed fields per call.
843
- #
844
- # Artist.set_allowed_columns(:name, :hometown)
845
- # Artist.set(:name=>'Bob', :hometown=>'Sactown') # No Error
846
- # Artist.set(:name=>'Bob', :records_sold=>30000) # Error
847
- def set_allowed_columns(*cols)
848
- Sequel::Deprecation.deprecate("Sequel::Model.set_allowed_columns", "Load the whitelist_security plugin into the model class")
849
- clear_setter_methods_cache
850
- @allowed_columns = cols
851
- end
852
-
853
618
  # Sets the dataset associated with the Model class. +ds+ can be a +Symbol+,
854
619
  # +LiteralString+, <tt>SQL::Identifier</tt>, <tt>SQL::QualifiedIdentifier</tt>,
855
620
  # <tt>SQL::AliasedExpression</tt>
@@ -864,26 +629,22 @@ module Sequel
864
629
  #
865
630
  # Note that you should not use this to change the model's dataset
866
631
  # at runtime. If you have that need, you should look into Sequel's
867
- # sharding support.
868
- #
869
- # You should avoid calling this method directly. Instead of doing:
870
- #
871
- # class Artist < Sequel::Model
872
- # set_dataset :tbl_artists
873
- # end
632
+ # sharding support, or creating a separate Model class per dataset
874
633
  #
875
- # You should use:
634
+ # You should avoid calling this method directly if possible. Instead you should
635
+ # set the table name or dataset when creating the model class:
876
636
  #
637
+ # # table name
877
638
  # class Artist < Sequel::Model(:tbl_artists)
878
639
  # end
879
640
  #
880
- # This ensures the class never uses an invalid dataset. Calling +set_dataset+
881
- # after creating a class can create a class with initial invalid dataset, which
882
- # will break when +require_valid_table+ or certain plugins are used.
641
+ # # dataset
642
+ # class Artist < Sequel::Model(DB[:tbl_artists])
643
+ # end
883
644
  def set_dataset(ds, opts=OPTS)
884
645
  inherited = opts[:inherited]
885
646
  @dataset = convert_input_dataset(ds)
886
- @require_modification = Sequel::Model.require_modification.nil? ? @dataset.provides_accurate_rows_matched? : Sequel::Model.require_modification
647
+ @require_modification = @dataset.provides_accurate_rows_matched? if require_modification.nil?
887
648
  if inherited
888
649
  self.simple_table = superclass.simple_table
889
650
  @columns = superclass.instance_variable_get(:@columns)
@@ -899,7 +660,7 @@ module Sequel
899
660
 
900
661
  # Sets the primary key for this model. You can use either a regular
901
662
  # or a composite primary key. To not use a primary key, set to nil
902
- # or use +no_primary_key+. On most adapters, Sequel can automatically
663
+ # or use +no_primary_key+. On most adapters, Sequel can automatically
903
664
  # determine the primary key to use, so this method is not needed often.
904
665
  #
905
666
  # class Person < Sequel::Model
@@ -926,39 +687,12 @@ module Sequel
926
687
  @primary_key = key
927
688
  end
928
689
 
929
- # Cache of setter methods to allow by default, in order to speed up new/set/update instance methods.
690
+ # Cache of setter methods to allow by default, in order to speed up mass assignment.
930
691
  def setter_methods
931
692
  return @setter_methods if @setter_methods
932
693
  @setter_methods = get_setter_methods
933
694
  end
934
695
 
935
- # Sets up a dataset method that returns a filtered dataset.
936
- # Sometimes thought of as a scope, and like most dataset methods,
937
- # they can be chained.
938
- # For example:
939
- #
940
- # Topic.subset(:joes, :username.like('%joe%'))
941
- # Topic.subset(:popular){num_posts > 100}
942
- # Topic.subset(:recent){created_on > Date.today - 7}
943
- #
944
- # Allows you to do:
945
- #
946
- # Topic.joes.recent.popular
947
- #
948
- # to get topics with a username that includes joe that
949
- # have more than 100 posts and were created less than
950
- # 7 days ago.
951
- #
952
- # Both the args given and the block are passed to <tt>Dataset#filter</tt>.
953
- #
954
- # This method creates dataset methods that do not accept arguments. To create
955
- # dataset methods that accept arguments, you should use define a
956
- # method directly inside a #dataset_module block.
957
- def subset(*args, &block)
958
- Sequel::Deprecation.deprecate("Sequel::Model.subset", "Use the subset method inside a dataset_module block, or use the def_dataset_method plugin")
959
- dataset_module{where(*args, &block)}
960
- end
961
-
962
696
  # Returns name of primary table for the dataset. If the table for the dataset
963
697
  # is aliased, returns the aliased name.
964
698
  #
@@ -972,9 +706,9 @@ module Sequel
972
706
  # Allow the setting of the primary key(s) when using the mass assignment methods.
973
707
  # Using this method can open up security issues, be very careful before using it.
974
708
  #
975
- # Artist.set(:id=>1) # Error
709
+ # Artist.set(id: 1) # Error
976
710
  # Artist.unrestrict_primary_key
977
- # Artist.set(:id=>1) # No Error
711
+ # Artist.set(id: 1) # No Error
978
712
  def unrestrict_primary_key
979
713
  clear_setter_methods_cache
980
714
  @restrict_primary_key = false
@@ -991,26 +725,18 @@ module Sequel
991
725
  end
992
726
 
993
727
  # Add model methods that call dataset methods
994
- Plugins.def_dataset_methods(self, (Dataset::ACTION_METHODS + Dataset::QUERY_METHODS + [:each_server]) - [:<<, :and, :or, :[], :columns, :columns!, :delete, :update, :add_graph_aliases])
995
- # SEQUEL5: add :set_graph_aliases to remove list and remove :and
728
+ Plugins.def_dataset_methods(self, (Dataset::ACTION_METHODS + Dataset::QUERY_METHODS + [:each_server]) - [:<<, :or, :[], :columns, :columns!, :delete, :update, :set_graph_aliases, :add_graph_aliases])
996
729
 
997
730
  private
998
731
 
999
- # Yield to the passed block and swallow all errors other than DatabaseConnectionErrors.
732
+ # Yield to the passed block and if do_raise is false, swallow all errors other than DatabaseConnectionErrors.
1000
733
  def check_non_connection_error(do_raise=require_valid_table)
1001
734
  begin
1002
735
  db.transaction(:savepoint=>:only){yield}
1003
736
  rescue Sequel::DatabaseConnectionError
1004
737
  raise
1005
738
  rescue Sequel::Error
1006
- case do_raise
1007
- when nil
1008
- Sequel::Deprecation.deprecate("Setting a model class dataset to an invalid dataset", "Either use a valid dataset or set require_valid_table = false for the model class")
1009
- when false
1010
- # nothing
1011
- else
1012
- raise
1013
- end
739
+ raise if do_raise
1014
740
  end
1015
741
  end
1016
742
 
@@ -1022,10 +748,7 @@ module Sequel
1022
748
  self.simple_table = db.literal(ds).freeze
1023
749
  ds = db.from(ds)
1024
750
  when Dataset
1025
- if ds.joined_dataset?
1026
- # raise Error, "Using a joined dataset as a model dataset is not support, use from_self on the dataset to wrap it in a subquery" # SEQUEL5
1027
- Sequel::Deprecation.deprecate("Using a joined dataset as a Sequel::Model dataset", respond_to?(:cti_base_model) ? "Use the class_table_inheritance plugin :alias option in #{cti_base_model.inspect}" : "Call from_self on the dataset to wrap it in a subquery")
1028
- end
751
+ ds = ds.from_self(:alias=>ds.first_source) if ds.joined_dataset?
1029
752
 
1030
753
  self.simple_table = if ds.send(:simple_select_all?)
1031
754
  ds.literal(ds.first_source_table).freeze
@@ -1064,16 +787,16 @@ module Sequel
1064
787
  clear_setter_methods_cache
1065
788
  columns, bad_columns = columns.partition{|x| /\A[A-Za-z_][A-Za-z0-9_]*\z/.match(x.to_s)}
1066
789
  bad_columns.each{|x| def_bad_column_accessor(x)}
1067
- im = instance_methods.map(&:to_s)
790
+ im = instance_methods
1068
791
  columns.each do |column|
1069
792
  meth = "#{column}="
1070
- overridable_methods_module.module_eval("def #{column}; self[:#{column}] end", __FILE__, __LINE__) unless im.include?(column.to_s)
793
+ overridable_methods_module.module_eval("def #{column}; self[:#{column}] end", __FILE__, __LINE__) unless im.include?(column)
1071
794
  overridable_methods_module.module_eval("def #{meth}(v); self[:#{column}] = v end", __FILE__, __LINE__) unless im.include?(meth)
1072
795
  end
1073
796
  end
1074
797
 
1075
798
  # Define a model method that calls the dataset method with the same name,
1076
- # only used for methods with names that can't be presented directly in
799
+ # only used for methods with names that can't be represented directly in
1077
800
  # ruby code.
1078
801
  def def_model_dataset_method(meth)
1079
802
  return if respond_to?(meth, true)
@@ -1081,37 +804,10 @@ module Sequel
1081
804
  if meth.to_s =~ /\A[A-Za-z_][A-Za-z0-9_]*\z/
1082
805
  instance_eval("def #{meth}(*args, &block); dataset.#{meth}(*args, &block) end", __FILE__, __LINE__)
1083
806
  else
1084
- (class << self; self; end).send(:define_method, meth){|*args, &block| dataset.send(meth, *args, &block)}
807
+ define_singleton_method(meth){|*args, &block| dataset.public_send(meth, *args, &block)}
1085
808
  end
1086
809
  end
1087
810
 
1088
- # Define a finder method in the given module with the given method name that
1089
- # load rows using the finder with the given name.
1090
- def def_finder_method(mod, meth, type)
1091
- # SEQUEL5: Remove
1092
- mod.send(:define_method, meth){|*args, &block| finder_for(meth).send(type, *args, &block)}
1093
- end
1094
-
1095
- # Define a prepared_finder method in the given module that will call the associated prepared
1096
- # statement.
1097
- def def_prepare_method(mod, meth)
1098
- # SEQUEL5: Remove
1099
- mod.send(:define_method, meth){|*args, &block| finder_for(meth).call(prepare_method_arg_hash(args), &block)}
1100
- end
1101
-
1102
- # Find the finder to use for the give method. If a finder has not been loaded
1103
- # for the method, load the finder and set correctly in the finders hash, then
1104
- # return the finder.
1105
- def finder_for(meth)
1106
- # SEQUEL5: Remove
1107
- unless finder = (frozen? ? @finders[meth] : Sequel.synchronize{@finders[meth]})
1108
- finder_loader = @finder_loaders.fetch(meth)
1109
- finder = finder_loader.call(self)
1110
- Sequel.synchronize{@finders[meth] = finder}
1111
- end
1112
- finder
1113
- end
1114
-
1115
811
  # Get the schema from the database, fall back on checking the columns
1116
812
  # via the database if that will return inaccurate results or if
1117
813
  # it raises an error.
@@ -1161,14 +857,9 @@ module Sequel
1161
857
  # Uncached version of setter_methods, to be overridden by plugins
1162
858
  # that want to modify the methods used.
1163
859
  def get_setter_methods
1164
- if allowed_columns
1165
- # SEQUEL5: Remove allowed_columns handling
1166
- allowed_columns.map{|x| "#{x}="}
1167
- else
1168
- meths = instance_methods.map(&:to_s).select{|l| l.end_with?('=')} - RESTRICTED_SETTER_METHODS
1169
- meths -= Array(primary_key).map{|x| "#{x}="} if primary_key && restrict_primary_key?
1170
- meths
1171
- end
860
+ meths = instance_methods.map(&:to_s).select{|l| l.end_with?('=')} - RESTRICTED_SETTER_METHODS
861
+ meths -= Array(primary_key).map{|x| "#{x}="} if primary_key && restrict_primary_key?
862
+ meths
1172
863
  end
1173
864
 
1174
865
  # A hash of instance variables to automatically set up in subclasses.
@@ -1179,7 +870,6 @@ module Sequel
1179
870
  # Proc :: Call with subclass to do the assignment
1180
871
  def inherited_instance_variables
1181
872
  {
1182
- :@allowed_columns=>:dup, # SEQUEL5: Remove
1183
873
  :@cache_anonymous_models=>nil,
1184
874
  :@dataset_method_modules=>:dup,
1185
875
  :@dataset_module_class=>nil,
@@ -1187,8 +877,6 @@ module Sequel
1187
877
  :@default_set_fields_options=>:dup,
1188
878
  :@fast_instance_delete_sql=>nil,
1189
879
  :@fast_pk_lookup_sql=>nil,
1190
- :@finder_loaders=>:dup, # SEQUEL5: Remove
1191
- :@finders=>:dup, # SEQUEL5: Remove
1192
880
  :@plugins=>:dup,
1193
881
  :@primary_key=>nil,
1194
882
  :@raise_on_save_failure=>nil,
@@ -1202,7 +890,6 @@ module Sequel
1202
890
  :@strict_param_setting=>nil,
1203
891
  :@typecast_empty_string_to_nil=>nil,
1204
892
  :@typecast_on_assignment=>nil,
1205
- :@use_after_commit_rollback=>nil,
1206
893
  :@use_transactions=>nil
1207
894
  }
1208
895
  end
@@ -1240,54 +927,19 @@ module Sequel
1240
927
  # defined, the corresponding plugin required.
1241
928
  def plugin_module(plugin)
1242
929
  module_name = plugin.to_s.gsub(/(^|_)(.)/){|x| x[-1..-1].upcase}
1243
- if !Sequel::Plugins.const_defined?(module_name) ||
1244
- (Sequel.const_defined?(module_name) &&
1245
- Sequel::Plugins.const_get(module_name) == Sequel.const_get(module_name))
1246
- begin
1247
- require "sequel/plugins/#{plugin}"
1248
- rescue LoadError => e
1249
- begin
1250
- require "sequel_#{plugin}"
1251
- Sequel::Deprecation.deprecate("requiring 'sequel_#{plugin}' to load a plugin", "Update the #{plugin} plugin to be required via 'sequel/plugins/#{plugin}'")
1252
- rescue LoadError => e2
1253
- e.message << "; #{e2.message}"
1254
- raise e
1255
- end
1256
- end
930
+ unless Sequel::Plugins.const_defined?(module_name, false)
931
+ require "sequel/plugins/#{plugin}"
1257
932
  end
1258
933
  Sequel::Plugins.const_get(module_name)
1259
934
  end
1260
935
 
1261
- # Check if the plugin module +plugin+ defines the constant named by +submod+.
936
+ # :nocov:
1262
937
  def plugin_module_defined?(plugin, submod)
1263
- if RUBY_VERSION >= '1.9'
1264
- plugin.const_defined?(submod, false)
1265
- else
1266
- # :nocov:
1267
- plugin.const_defined?(submod)
1268
- # :nocov:
1269
- end
938
+ Sequel::Deprecation.deprecate("Model.plugin_module_defined? (private method)", "Use const_defined?(submod, false)")
939
+ plugin.const_defined?(submod, false)
1270
940
  end
941
+ # :nocov:
1271
942
 
1272
- # An hash of prepared argument values for the given arguments, with keys
1273
- # starting at a. Used by the methods created by prepared_finder.
1274
- def prepare_method_arg_hash(args)
1275
- # SEQUEL5: Remove
1276
- h = {}
1277
- prepare_method_args('a', args.length).zip(args).each{|k, v| h[k] = v}
1278
- h
1279
- end
1280
-
1281
- # An array of prepared statement argument names, of length n and starting with base.
1282
- def prepare_method_args(base, n)
1283
- # SEQUEL5: Remove
1284
- (0...n).map do
1285
- s = base.to_sym
1286
- base = base.next
1287
- s
1288
- end
1289
- end
1290
-
1291
943
  # Find the row in the dataset that matches the primary key. Uses
1292
944
  # a static SQL optimization if the table and primary key are simple.
1293
945
  #
@@ -1301,9 +953,6 @@ module Sequel
1301
953
  ds.literal_append(sql, pk)
1302
954
  ds.fetch_rows(sql){|r| return ds.row_proc.call(r)}
1303
955
  nil
1304
- elsif dataset.joined_dataset?
1305
- # SEQUEL5: Remove as joined model datasets are not allowed
1306
- dataset.first(qualified_primary_key_hash(pk))
1307
956
  else
1308
957
  dataset.first(primary_key_hash(pk))
1309
958
  end
@@ -1318,17 +967,16 @@ module Sequel
1318
967
  # are used, or set it to nil if not used.
1319
968
  def reset_fast_pk_lookup_sql
1320
969
  @fast_pk_lookup_sql = if @simple_table && @simple_pk
1321
- "SELECT * FROM #@simple_table WHERE #@simple_pk = ".freeze
970
+ "SELECT * FROM #{@simple_table} WHERE #{@simple_pk} = ".freeze
1322
971
  end
1323
972
  @fast_instance_delete_sql = if @simple_table && @simple_pk
1324
- "DELETE FROM #@simple_table WHERE #@simple_pk = ".freeze
973
+ "DELETE FROM #{@simple_table} WHERE #{@simple_pk} = ".freeze
1325
974
  end
1326
975
  end
1327
976
 
1328
977
  # Reset the instance dataset to a modified copy of the current dataset,
1329
978
  # should be used whenever the model's dataset is modified.
1330
979
  def reset_instance_dataset
1331
- Sequel.synchronize{@finders.clear} if @finders && !@finders.frozen?
1332
980
  @instance_dataset = @dataset.limit(1).naked.skip_limit_check if @dataset
1333
981
  end
1334
982
 
@@ -1384,26 +1032,35 @@ module Sequel
1384
1032
  # Define instance method(s) that calls class method(s) of the
1385
1033
  # same name. Replaces the construct:
1386
1034
  #
1387
- # define_method(meth){self.class.send(meth)}
1035
+ # define_method(meth){self.class.public_send(meth)}
1388
1036
  [:columns, :db, :primary_key, :db_schema].each{|meth| class_eval("def #{meth}; self.class.#{meth} end", __FILE__, __LINE__)}
1389
1037
 
1390
1038
  # Define instance method(s) that calls class method(s) of the
1391
1039
  # same name, caching the result in an instance variable. Define
1392
1040
  # standard attr_writer method for modifying that instance variable.
1393
- [:typecast_empty_string_to_nil, :typecast_on_assignment, :strict_param_setting, \
1394
- :raise_on_save_failure, :raise_on_typecast_failure, :require_modification, :use_transactions,
1395
- :use_after_commit_rollback # SEQUEL5: Remove
1396
- ].each do |meth|
1041
+ [:typecast_empty_string_to_nil, :typecast_on_assignment, :strict_param_setting,
1042
+ :raise_on_save_failure, :raise_on_typecast_failure, :require_modification, :use_transactions].each do |meth|
1397
1043
  class_eval("def #{meth}; !defined?(@#{meth}) ? (frozen? ? self.class.#{meth} : (@#{meth} = self.class.#{meth})) : @#{meth} end", __FILE__, __LINE__)
1398
1044
  attr_writer(meth)
1399
1045
  end
1400
1046
 
1047
+ # :nocov:
1048
+ def use_after_commit_rollback
1049
+ Sequel::Deprecation.deprecate("Model#use_after_commit_rollback", "Model transaction hooks have been removed, switch to using database transaction hooks")
1050
+ false
1051
+ end
1052
+ def use_after_commit_rollback=(v)
1053
+ Sequel::Deprecation.deprecate("Model#use_after_commit_rollback=", "Model transaction hooks have been removed, switch to using database transaction hooks")
1054
+ false
1055
+ end
1056
+ # :nocov:
1057
+
1401
1058
  # The hash of attribute values. Keys are symbols with the names of the
1402
1059
  # underlying database columns. The returned hash is a reference to the
1403
1060
  # receiver's values hash, and modifying it will also modify the receiver's
1404
1061
  # values.
1405
1062
  #
1406
- # Artist.new(:name=>'Bob').values # => {:name=>'Bob'}
1063
+ # Artist.new(name: 'Bob').values # => {:name=>'Bob'}
1407
1064
  # Artist[1].values # => {:id=>1, :name=>'Jim', ...}
1408
1065
  attr_reader :values
1409
1066
  alias to_hash values
@@ -1414,7 +1071,7 @@ module Sequel
1414
1071
  # method names.
1415
1072
  alias get_column_value send
1416
1073
 
1417
- # Set the value of the column. Takes two argument. The first is a
1074
+ # Set the value of the column. Takes two arguments. The first is a
1418
1075
  # symbol or string argument for the column name, suffixed with =. The
1419
1076
  # second is the value to set for the column. By default it calls send
1420
1077
  # with the argument to set the value. This can be overridden if you have
@@ -1428,7 +1085,7 @@ module Sequel
1428
1085
  # Arguments:
1429
1086
  # values :: should be a hash to pass to set.
1430
1087
  #
1431
- # Artist.new(:name=>'Bob')
1088
+ # Artist.new(name: 'Bob')
1432
1089
  #
1433
1090
  # Artist.new do |a|
1434
1091
  # a.name = 'Bob'
@@ -1530,11 +1187,8 @@ module Sequel
1530
1187
  end
1531
1188
 
1532
1189
  # Like delete but runs hooks before and after delete.
1533
- # If before_destroy returns false, returns false without
1534
- # deleting the object from the database. Otherwise, deletes
1535
- # the item from the database and returns self. Uses a transaction
1536
- # if use_transactions is true or if the :transaction option is given and
1537
- # true.
1190
+ # Uses a transaction if use_transactions is true or if the
1191
+ # :transaction option is given and true.
1538
1192
  #
1539
1193
  # Artist[1].destroy # BEGIN; DELETE FROM artists WHERE (id = 1); COMMIT;
1540
1194
  # # => #<Artist {:id=>1, ...}>
@@ -1598,7 +1252,7 @@ module Sequel
1598
1252
  validate
1599
1253
  errors.freeze
1600
1254
  end
1601
- this.freeze if !new? && model.primary_key
1255
+ this if !new? && model.primary_key
1602
1256
  super
1603
1257
  end
1604
1258
 
@@ -1606,9 +1260,9 @@ module Sequel
1606
1260
  # the same class and values (if pk is nil).
1607
1261
  #
1608
1262
  # Artist[1].hash == Artist[1].hash # true
1609
- # Artist[1].set(:name=>'Bob').hash == Artist[1].hash # true
1263
+ # Artist[1].set(name: 'Bob').hash == Artist[1].hash # true
1610
1264
  # Artist.new.hash == Artist.new.hash # true
1611
- # Artist.new(:name=>'Bob').hash == Artist.new.hash # false
1265
+ # Artist.new(name: 'Bob').hash == Artist.new.hash # false
1612
1266
  def hash
1613
1267
  case primary_key
1614
1268
  when Array
@@ -1637,7 +1291,7 @@ module Sequel
1637
1291
  # Returns the keys in +values+. May not include all column names.
1638
1292
  #
1639
1293
  # Artist.new.keys # => []
1640
- # Artist.new(:name=>'Bob').keys # => [:name]
1294
+ # Artist.new(name: 'Bob').keys # => [:name]
1641
1295
  # Artist[1].keys # => [:id, :name]
1642
1296
  def keys
1643
1297
  @values.keys
@@ -1709,7 +1363,7 @@ module Sequel
1709
1363
  #
1710
1364
  # a = Artist[1]
1711
1365
  # a.modified? # => false
1712
- # a.set(:name=>'Jim')
1366
+ # a.set(name: 'Jim')
1713
1367
  # a.modified? # => true
1714
1368
  #
1715
1369
  # If a column is given, specifically check if the given column has
@@ -1801,9 +1455,6 @@ module Sequel
1801
1455
  #
1802
1456
  # If it succeeds, it returns self.
1803
1457
  #
1804
- # You can provide an optional list of columns to update, in which
1805
- # case it only updates those columns, or a options hash.
1806
- #
1807
1458
  # Takes the following options:
1808
1459
  #
1809
1460
  # :changed :: save all changed columns, instead of all columns or the columns given
@@ -1818,12 +1469,15 @@ module Sequel
1818
1469
  def save(opts=OPTS)
1819
1470
  raise Sequel::Error, "can't save frozen object" if frozen?
1820
1471
  set_server(opts[:server]) if opts[:server]
1821
- _before_validation
1822
- if opts[:validate] != false # SEQUEL5: Remove if
1823
- unless checked_save_failure(opts){_valid?(opts)}
1824
- raise(ValidationFailed.new(self)) if raise_on_failure?(opts)
1825
- return
1826
- end
1472
+ # :nocov:
1473
+ if method(:_before_validation).owner != InstanceMethods
1474
+ Sequel::Deprecation.deprecate("Using Model#_before_validation", "You should switch to using Model#before_validation")
1475
+ _before_validation
1476
+ end
1477
+ # :nocov:
1478
+ unless checked_save_failure(opts){_valid?(opts)}
1479
+ raise(ValidationFailed.new(self)) if raise_on_failure?(opts)
1480
+ return
1827
1481
  end
1828
1482
  checked_save_failure(opts){checked_transaction(opts){_save(opts)}}
1829
1483
  end
@@ -1846,23 +1500,12 @@ module Sequel
1846
1500
  # a setter method (or ignoring it if <tt>strict_param_setting = false</tt>).
1847
1501
  # Does not save the record.
1848
1502
  #
1849
- # artist.set(:name=>'Jim')
1503
+ # artist.set(name: 'Jim')
1850
1504
  # artist.name # => 'Jim'
1851
1505
  def set(hash)
1852
1506
  set_restricted(hash, :default)
1853
1507
  end
1854
1508
 
1855
- # Set all values using the entries in the hash, ignoring any setting of
1856
- # allowed_columns in the model.
1857
- #
1858
- # Artist.set_allowed_columns(:num_albums)
1859
- # artist.set_all(:name=>'Jim')
1860
- # artist.name # => 'Jim'
1861
- def set_all(hash)
1862
- Sequel::Deprecation.deprecate("Sequel::Model#set_all", "Switch to set or load the whitelist_security plugin into the model class")
1863
- set_restricted(hash, :all)
1864
- end
1865
-
1866
1509
  # For each of the fields in the given array +fields+, call the setter
1867
1510
  # method with the value of that +hash+ entry for the field. Returns self.
1868
1511
  #
@@ -1875,19 +1518,19 @@ module Sequel
1875
1518
  #
1876
1519
  # Examples:
1877
1520
  #
1878
- # artist.set_fields({:name=>'Jim'}, [:name])
1521
+ # artist.set_fields({name: 'Jim'}, [:name])
1879
1522
  # artist.name # => 'Jim'
1880
1523
  #
1881
- # artist.set_fields({:hometown=>'LA'}, [:name])
1524
+ # artist.set_fields({hometown: 'LA'}, [:name])
1882
1525
  # artist.name # => nil
1883
1526
  # artist.hometown # => 'Sac'
1884
1527
  #
1885
1528
  # artist.name # => 'Jim'
1886
- # artist.set_fields({}, [:name], :missing=>:skip)
1529
+ # artist.set_fields({}, [:name], missing: :skip)
1887
1530
  # artist.name # => 'Jim'
1888
1531
  #
1889
1532
  # artist.name # => 'Jim'
1890
- # artist.set_fields({}, [:name], :missing=>:raise)
1533
+ # artist.set_fields({}, [:name], missing: :raise)
1891
1534
  # # Sequel::Error raised
1892
1535
  def set_fields(hash, fields, opts=nil)
1893
1536
  opts = if opts
@@ -1921,19 +1564,6 @@ module Sequel
1921
1564
  self
1922
1565
  end
1923
1566
 
1924
- # Set the values using the entries in the hash, only if the key
1925
- # is included in only. It may be a better idea to use +set_fields+
1926
- # instead of this method.
1927
- #
1928
- # artist.set_only({:name=>'Jim'}, :name)
1929
- # artist.name # => 'Jim'
1930
- #
1931
- # artist.set_only({:hometown=>'LA'}, :name) # Raise Error
1932
- def set_only(hash, *only)
1933
- Sequel::Deprecation.deprecate("Sequel::Model#set_only", "Switch to set_fields with the :missing=>:skip option or load the whitelist_security plugin into the model class")
1934
- set_restricted(hash, only.flatten)
1935
- end
1936
-
1937
1567
  # Set the shard that this object is tied to. Returns self.
1938
1568
  def set_server(s)
1939
1569
  @server = s
@@ -1954,60 +1584,29 @@ module Sequel
1954
1584
  def this
1955
1585
  return @this if @this
1956
1586
  raise Error, "No dataset for model #{model}" unless ds = model.instance_dataset
1957
-
1958
- cond = if ds.joined_dataset?
1959
- # SEQUEL5: Remove as joined model datasets are now allowed
1960
- qualified_pk_hash
1961
- else
1962
- pk_hash
1963
- end
1964
-
1965
- @this = use_server(ds.where(cond))
1587
+ @this = use_server(ds.where(pk_hash))
1966
1588
  end
1967
1589
 
1968
1590
  # Runs #set with the passed hash and then runs save_changes.
1969
1591
  #
1970
- # artist.update(:name=>'Jim') # UPDATE artists SET name = 'Jim' WHERE (id = 1)
1592
+ # artist.update(name: 'Jim') # UPDATE artists SET name = 'Jim' WHERE (id = 1)
1971
1593
  def update(hash)
1972
1594
  update_restricted(hash, :default)
1973
1595
  end
1974
1596
 
1975
- # Update all values using the entries in the hash, ignoring any setting of
1976
- # +allowed_columns+ in the model.
1977
- #
1978
- # Artist.set_allowed_columns(:num_albums)
1979
- # artist.update_all(:name=>'Jim') # UPDATE artists SET name = 'Jim' WHERE (id = 1)
1980
- def update_all(hash)
1981
- Sequel::Deprecation.deprecate("Sequel::Model#update_all", "Switch to update or load the whitelist_security plugin into the model class")
1982
- update_restricted(hash, :all)
1983
- end
1984
-
1985
1597
  # Update the instances values by calling +set_fields+ with the arguments, then
1986
1598
  # saves any changes to the record. Returns self.
1987
1599
  #
1988
- # artist.update_fields({:name=>'Jim'}, [:name])
1600
+ # artist.update_fields({name: 'Jim'}, [:name])
1989
1601
  # # UPDATE artists SET name = 'Jim' WHERE (id = 1)
1990
1602
  #
1991
- # artist.update_fields({:hometown=>'LA'}, [:name])
1603
+ # artist.update_fields({hometown: 'LA'}, [:name])
1992
1604
  # # UPDATE artists SET name = NULL WHERE (id = 1)
1993
1605
  def update_fields(hash, fields, opts=nil)
1994
1606
  set_fields(hash, fields, opts)
1995
1607
  save_changes
1996
1608
  end
1997
1609
 
1998
- # Update the values using the entries in the hash, only if the key
1999
- # is included in only. It may be a better idea to use +update_fields+
2000
- # instead of this method.
2001
- #
2002
- # artist.update_only({:name=>'Jim'}, :name)
2003
- # # UPDATE artists SET name = 'Jim' WHERE (id = 1)
2004
- #
2005
- # artist.update_only({:hometown=>'LA'}, :name) # Raise Error
2006
- def update_only(hash, *only)
2007
- Sequel::Deprecation.deprecate("Sequel::Model#update_only", "Switch to update_fields with the :missing=>:skip option or load the whitelist_security plugin into the model class")
2008
- update_restricted(hash, only.flatten)
2009
- end
2010
-
2011
1610
  # Validates the object. If the object is invalid, errors should be added
2012
1611
  # to the errors attribute. By default, does nothing, as all models
2013
1612
  # are valid by default. See the {"Model Validations" guide}[rdoc-ref:doc/validations.rdoc].
@@ -2019,11 +1618,16 @@ module Sequel
2019
1618
 
2020
1619
  # Validates the object and returns true if no errors are reported.
2021
1620
  #
2022
- # artist.set(:name=>'Valid').valid? # => true
2023
- # artist.set(:name=>'Invalid').valid? # => false
1621
+ # artist.set(name: 'Valid').valid? # => true
1622
+ # artist.set(name: 'Invalid').valid? # => false
2024
1623
  # artist.errors.full_messages # => ['name cannot be Invalid']
2025
1624
  def valid?(opts = OPTS)
2026
- _before_validation
1625
+ # :nocov:
1626
+ if method(:_before_validation).owner != InstanceMethods
1627
+ Sequel::Deprecation.deprecate("Using Model#_before_validation", "You should switch to using Model#before_validation")
1628
+ _before_validation
1629
+ end
1630
+ # :nocov:
2027
1631
  begin
2028
1632
  _valid?(opts)
2029
1633
  rescue HookFailed
@@ -2033,39 +1637,7 @@ module Sequel
2033
1637
 
2034
1638
  private
2035
1639
 
2036
- # Run code directly after the INSERT query, before after_create.
2037
- # This is only a temporary API, it should not be overridden by external code.
2038
- def _after_create(pk)
2039
- # SEQUEL5: Remove
2040
- @this = nil
2041
- @new = false
2042
- @was_new = true
2043
- end
2044
-
2045
- # Run code after around_save returns, before calling after_commit.
2046
- # This is only a temporary API, it should not be overridden by external code.
2047
- def _after_save(pk)
2048
- # SEQUEL5: Remove
2049
- if @was_new
2050
- @was_new = nil
2051
- pk ? _save_refresh : changed_columns.clear
2052
- else
2053
- @columns_updated = nil
2054
- end
2055
- @modified = false
2056
- end
2057
-
2058
- # Run code directly after the UPDATE query, before after_update.
2059
- # This is only a temporary API, it should not be overridden by external code.
2060
- def _after_update
2061
- # SEQUEL5: Remove
2062
- @this = nil
2063
- end
2064
-
2065
- # Run code before any validation is done, but also run it before saving
2066
- # even if validation is skipped. This is a private hook. It exists so that
2067
- # plugins can set values automatically before validation (as the values
2068
- # need to be validated), but should be set even if validation is skipped.
1640
+ # SEQUEL51: Remove
2069
1641
  def _before_validation
2070
1642
  end
2071
1643
 
@@ -2077,7 +1649,7 @@ module Sequel
2077
1649
  n
2078
1650
  end
2079
1651
 
2080
- # The dataset to use when deleting the object. The same as the object's
1652
+ # The dataset to use when deleting the object. The same as the object's
2081
1653
  # dataset by default.
2082
1654
  def _delete_dataset
2083
1655
  this
@@ -2099,28 +1671,14 @@ module Sequel
2099
1671
  # Internal destroy method, separted from destroy to
2100
1672
  # allow running inside a transaction
2101
1673
  def _destroy(opts)
2102
- sh = {:server=>this_server}
2103
- uacr = use_after_commit_rollback
2104
- if uacr.nil? ? (method(:after_destroy_rollback).owner != InstanceMethods) : uacr
2105
- Sequel::Deprecation.deprecate("Model#after_destroy_rollback", "Instead, call db.after_rollback in Model#before_destroy")
2106
- db.after_rollback(sh){after_destroy_rollback}
2107
- end
2108
1674
  called = false
2109
1675
  around_destroy do
2110
1676
  called = true
2111
- if before_destroy == false
2112
- Sequel::Deprecation.deprecate("Having before_destroy return false to cancel the destroy", "Instead, call cancel_action inside before_destroy")
2113
- raise_hook_failure(:before_destroy)
2114
- end
1677
+ before_destroy
2115
1678
  _destroy_delete
2116
1679
  after_destroy
2117
- true
2118
1680
  end
2119
1681
  raise_hook_failure(:around_destroy) unless called
2120
- if uacr.nil? ? (method(:after_destroy_commit).owner != InstanceMethods) : uacr
2121
- Sequel::Deprecation.deprecate("Model#after_destroy_commit", "Instead, call db.after_commit in Model#after_destroy")
2122
- db.after_commit(sh){after_destroy_commit}
2123
- end
2124
1682
  self
2125
1683
  end
2126
1684
 
@@ -2187,7 +1745,7 @@ module Sequel
2187
1745
  end
2188
1746
  end
2189
1747
 
2190
- # Set the refreshed values after
1748
+ # Set the values to the given hash after refreshing.
2191
1749
  def _refresh_set_values(h)
2192
1750
  @values = h
2193
1751
  end
@@ -2195,36 +1753,22 @@ module Sequel
2195
1753
  # Internal version of save, split from save to allow running inside
2196
1754
  # it's own transaction.
2197
1755
  def _save(opts)
2198
- sh = {:server=>this_server}
2199
- uacr = use_after_commit_rollback
2200
- if uacr.nil? ? (method(:after_rollback).owner != InstanceMethods) : uacr
2201
- Sequel::Deprecation.deprecate("Model#after_rollback", "Instead, call db.after_rollback in Model#before_save")
2202
- db.after_rollback(sh){after_rollback}
2203
- end
2204
1756
  pk = nil
2205
1757
  called_save = false
2206
1758
  called_cu = false
2207
1759
  around_save do
2208
1760
  called_save = true
2209
- if before_save == false
2210
- Sequel::Deprecation.deprecate("Having before_save return false to cancel the save", "Instead, call cancel_action inside before_save")
2211
- raise_hook_failure(:before_save)
2212
- end
1761
+ before_save
2213
1762
 
2214
1763
  if new?
2215
1764
  around_create do
2216
1765
  called_cu = true
2217
- if before_create == false
2218
- Sequel::Deprecation.deprecate("Having before_create return false to cancel the create", "Instead, call cancel_action inside before_create")
2219
- raise_hook_failure(:before_create)
2220
- end
1766
+ before_create
2221
1767
  pk = _insert
2222
- _after_create(pk) # SEQUEL5: Remove
2223
- # SEQUEL5
2224
- # @this = nil
2225
- # @new = false
2226
- # @modified = false
2227
- # pk ? _save_refresh : changed_columns.clear
1768
+ @this = nil
1769
+ @new = false
1770
+ @modified = false
1771
+ pk ? _save_refresh : changed_columns.clear
2228
1772
  after_create
2229
1773
  true
2230
1774
  end
@@ -2232,13 +1776,10 @@ module Sequel
2232
1776
  else
2233
1777
  around_update do
2234
1778
  called_cu = true
2235
- if before_update == false
2236
- Sequel::Deprecation.deprecate("Having before_update return false to cancel the update", "Instead, call cancel_action inside before_update")
2237
- raise_hook_failure(:before_update)
2238
- end
1779
+ before_update
2239
1780
  columns = opts[:columns]
2240
1781
  if columns.nil?
2241
- columns_updated = if opts[:changed] # SEQUEL5: Use local variable instead of instance variable
1782
+ columns_updated = if opts[:changed]
2242
1783
  @values.reject{|k,v| !changed_columns.include?(k)}
2243
1784
  else
2244
1785
  _save_update_all_columns_hash
@@ -2250,10 +1791,8 @@ module Sequel
2250
1791
  changed_columns.reject!{|c| columns.include?(c)}
2251
1792
  end
2252
1793
  _update_columns(columns_updated)
2253
- _after_update # SEQUEL5: Remove
2254
- # SEQUEL5
2255
- # @this = nil
2256
- # @modified = false
1794
+ @this = nil
1795
+ @modified = false
2257
1796
  after_update
2258
1797
  true
2259
1798
  end
@@ -2263,11 +1802,6 @@ module Sequel
2263
1802
  true
2264
1803
  end
2265
1804
  raise_hook_failure(:around_save) unless called_save
2266
- _after_save(pk) # SEQUEL5: Remove
2267
- if uacr.nil? ? (method(:after_commit).owner != InstanceMethods) : uacr
2268
- Sequel::Deprecation.deprecate("Model#after_commit", "Instead, call db.after_commit in Model#after_save")
2269
- db.after_commit(sh){after_commit}
2270
- end
2271
1805
  self
2272
1806
  end
2273
1807
 
@@ -2301,7 +1835,6 @@ module Sequel
2301
1835
  # Plugins can override this method in order to update with
2302
1836
  # additional columns, even when the column hash is initially empty.
2303
1837
  def _update_columns(columns)
2304
- @columns_updated ||= DeprecatedColumnsUpdated.new(columns) # SEQUEL5: Remove
2305
1838
  _update(columns) unless columns.empty?
2306
1839
  end
2307
1840
 
@@ -2334,18 +1867,16 @@ module Sequel
2334
1867
  return errors.empty? if frozen?
2335
1868
  errors.clear
2336
1869
  called = false
2337
- # skip_validate = opts[:validate] == false # SEQUEL5
1870
+ skip_validate = opts[:validate] == false
2338
1871
  around_validation do
2339
1872
  called = true
2340
- if before_validation == false
2341
- Sequel::Deprecation.deprecate("Having before_validation return false to mark the object as invalid", "Instead, call cancel_action inside before_validation")
2342
- raise_hook_failure(:before_validation)
2343
- else
2344
- validate # unless skip_validate # SEQUEL5
2345
- after_validation
2346
- end
1873
+ before_validation
1874
+ validate unless skip_validate
1875
+ after_validation
2347
1876
  end
2348
- # return true if skip_validate # SEQUEL5
1877
+
1878
+ return true if skip_validate
1879
+
2349
1880
  if called
2350
1881
  errors.empty?
2351
1882
  else
@@ -2384,24 +1915,12 @@ module Sequel
2384
1915
  Errors
2385
1916
  end
2386
1917
 
2387
- if RUBY_VERSION >= '1.9'
2388
- # Clone constructor -- freeze internal data structures if the original's
2389
- # are frozen.
2390
- def initialize_clone(other)
2391
- super
2392
- freeze if other.frozen?
2393
- self
2394
- end
2395
- else
2396
- # :nocov:
2397
- # Ruby 1.8 doesn't support initialize_clone, so override clone to dup and freeze.
2398
- def clone
2399
- o = dup
2400
- o.freeze if frozen?
2401
- o
2402
- end
2403
- public :clone
2404
- # :nocov:
1918
+ # Clone constructor -- freeze internal data structures if the original's
1919
+ # are frozen.
1920
+ def initialize_clone(other)
1921
+ super
1922
+ freeze if other.frozen?
1923
+ self
2405
1924
  end
2406
1925
 
2407
1926
  # Copy constructor -- Duplicate internal data structures.
@@ -2410,7 +1929,6 @@ module Sequel
2410
1929
  @values = Hash[@values]
2411
1930
  @changed_columns = @changed_columns.dup if @changed_columns
2412
1931
  @errors = @errors.dup if @errors
2413
- @this = @this.dup if @this
2414
1932
  self
2415
1933
  end
2416
1934
 
@@ -2489,19 +2007,13 @@ module Sequel
2489
2007
  # :all :: Allow setting all setters, except those specifically restricted (such as ==).
2490
2008
  # Array :: Only allow setting of columns in the given array.
2491
2009
  def setter_methods(type)
2492
- if type == :default
2493
- if !@singleton_setter_added || model.allowed_columns # SEQUEL5: Remove model.allowed_columns
2494
- return model.setter_methods
2495
- end
2010
+ if type == :default && !@singleton_setter_added
2011
+ return model.setter_methods
2496
2012
  end
2497
2013
 
2498
- if type.is_a?(Array)
2499
- type.map{|x| "#{x}="}
2500
- else
2501
- meths = methods.map(&:to_s).select{|l| l.end_with?('=')} - RESTRICTED_SETTER_METHODS
2502
- meths -= Array(primary_key).map{|x| "#{x}="} if type != :all && primary_key && model.restrict_primary_key?
2503
- meths
2504
- end
2014
+ meths = methods.map(&:to_s).select{|l| l.end_with?('=')} - RESTRICTED_SETTER_METHODS
2015
+ meths -= Array(primary_key).map{|x| "#{x}="} if primary_key && model.restrict_primary_key?
2016
+ meths
2505
2017
  end
2506
2018
 
2507
2019
  # The server/shard that the model object's dataset uses, or :default if the
@@ -2551,8 +2063,6 @@ module Sequel
2551
2063
 
2552
2064
  # DatasetMethods contains methods that all model datasets have.
2553
2065
  module DatasetMethods
2554
- Dataset.def_deprecated_opts_setter(self, :model)
2555
-
2556
2066
  # The model class associated with this dataset
2557
2067
  #
2558
2068
  # Artist.dataset.model # => Artist
@@ -2586,53 +2096,6 @@ module Sequel
2586
2096
  model.use_transactions ? @db.transaction(:server=>opts[:server], &pr) : pr.call
2587
2097
  end
2588
2098
 
2589
- # Allow Sequel::Model classes to be used as dataset arguments when graphing:
2590
- #
2591
- # Artist.graph(Album, :artist_id=>id)
2592
- # # SELECT artists.id, artists.name, albums.id AS albums_id, albums.artist_id, albums.name AS albums_name
2593
- # # FROM artists LEFT OUTER JOIN albums ON (albums.artist_id = artists.id)
2594
- def graph(table, *args, &block)
2595
- if table.is_a?(Class) && table < Sequel::Model
2596
- Sequel::Deprecation.deprecate("Passing Sequel::Model class as first argument to Sequel::Dataset#graph", "Pass the model's dataset as the first argument instead")
2597
- super(table.dataset, *args, &block)
2598
- else
2599
- super
2600
- end
2601
- end
2602
-
2603
- # Handle Sequel::Model instances when inserting, using the model instance's
2604
- # values for the insert, unless the model instance can be used directly in
2605
- # SQL.
2606
- #
2607
- # Album.insert(Album.load(:name=>'A'))
2608
- # # INSERT INTO albums (name) VALUES ('A')
2609
- def insert_sql(*values)
2610
- if values.size == 1 && (v = values[0]).is_a?(Sequel::Model) && !v.respond_to?(:sql_literal_append)
2611
- Sequel::Deprecation.deprecate("Passing Sequel::Model instance argument to Sequel::Dataset#insert", "Pass model_instance.values or model_instance.to_hash as the argument instead")
2612
- super(v.to_hash)
2613
- else
2614
- super
2615
- end
2616
- end
2617
-
2618
- # Allow Sequel::Model classes to be used as table name arguments in dataset
2619
- # join methods:
2620
- #
2621
- # Artist.join(Album, :artist_id=>id)
2622
- # # SELECT * FROM artists INNER JOIN albums ON (albums.artist_id = artists.id)
2623
- def join_table(type, table, *args, &block)
2624
- if table.is_a?(Class) && table < Sequel::Model
2625
- Sequel::Deprecation.deprecate("Passing Sequel::Model class to a dataset join method", "Pass the model's table name or dataset as the first argument instead")
2626
- if table.dataset.simple_select_all?
2627
- super(type, table.table_name, *args, &block)
2628
- else
2629
- super(type, table.dataset, *args, &block)
2630
- end
2631
- else
2632
- super
2633
- end
2634
- end
2635
-
2636
2099
  # If there is no order already defined on this dataset, order it by
2637
2100
  # the primary key and call last.
2638
2101
  #
@@ -2710,14 +2173,6 @@ module Sequel
2710
2173
 
2711
2174
  private
2712
2175
 
2713
- # SEQUEL5: Remove
2714
- def _model_where_loader
2715
- # :nocov:
2716
- Sequel::Deprecation.deprecate("Dataset#_model_where_loader", "Use _where_loader instead")
2717
- _where_loader
2718
- # :nocov:
2719
- end
2720
-
2721
2176
  # If the dataset is not already ordered, and the model has a primary key,
2722
2177
  # return a clone ordered by the primary key.
2723
2178
  def _primary_key_order
@@ -2750,5 +2205,10 @@ module Sequel
2750
2205
 
2751
2206
  extend ClassMethods
2752
2207
  plugin self
2208
+
2209
+ singleton_class.send(:undef_method, :dup, :clone, :initialize_copy)
2210
+ if RUBY_VERSION >= '1.9.3'
2211
+ singleton_class.send(:undef_method, :initialize_clone, :initialize_dup)
2212
+ end
2753
2213
  end
2754
2214
  end