sequel 4.49.0 → 5.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (484) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +130 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +6 -9
  6. data/doc/advanced_associations.rdoc +91 -168
  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/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.2.0.txt +33 -0
  30. data/doc/release_notes/5.3.0.txt +121 -0
  31. data/doc/schema_modification.rdoc +78 -64
  32. data/doc/security.rdoc +97 -88
  33. data/doc/sharding.rdoc +43 -30
  34. data/doc/sql.rdoc +53 -65
  35. data/doc/testing.rdoc +4 -5
  36. data/doc/thread_safety.rdoc +2 -4
  37. data/doc/transactions.rdoc +18 -17
  38. data/doc/validations.rdoc +48 -45
  39. data/doc/virtual_rows.rdoc +87 -115
  40. data/lib/sequel/adapters/ado/access.rb +7 -13
  41. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  42. data/lib/sequel/adapters/ado.rb +9 -25
  43. data/lib/sequel/adapters/amalgalite.rb +3 -18
  44. data/lib/sequel/adapters/ibmdb.rb +9 -45
  45. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  46. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  47. data/lib/sequel/adapters/jdbc/h2.rb +6 -26
  48. data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
  49. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  50. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  51. data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
  52. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  53. data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
  54. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  55. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  56. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  57. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  58. data/lib/sequel/adapters/jdbc.rb +18 -74
  59. data/lib/sequel/adapters/mock.rb +4 -30
  60. data/lib/sequel/adapters/mysql.rb +7 -44
  61. data/lib/sequel/adapters/mysql2.rb +5 -23
  62. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  63. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  64. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  65. data/lib/sequel/adapters/odbc.rb +0 -19
  66. data/lib/sequel/adapters/oracle.rb +8 -13
  67. data/lib/sequel/adapters/postgres.rb +28 -150
  68. data/lib/sequel/adapters/postgresql.rb +1 -1
  69. data/lib/sequel/adapters/shared/access.rb +11 -51
  70. data/lib/sequel/adapters/shared/db2.rb +3 -61
  71. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  72. data/lib/sequel/adapters/shared/mysql.rb +61 -227
  73. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  74. data/lib/sequel/adapters/shared/postgres.rb +58 -264
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  76. data/lib/sequel/adapters/shared/sqlite.rb +22 -101
  77. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  78. data/lib/sequel/adapters/sqlite.rb +2 -19
  79. data/lib/sequel/adapters/tinytds.rb +5 -15
  80. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
  82. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  83. data/lib/sequel/adapters/utils/replace.rb +0 -5
  84. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  85. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  86. data/lib/sequel/ast_transformer.rb +3 -94
  87. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  88. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  89. data/lib/sequel/connection_pool/single.rb +0 -2
  90. data/lib/sequel/connection_pool/threaded.rb +94 -110
  91. data/lib/sequel/connection_pool.rb +38 -28
  92. data/lib/sequel/core.rb +42 -101
  93. data/lib/sequel/database/connecting.rb +23 -60
  94. data/lib/sequel/database/dataset.rb +6 -9
  95. data/lib/sequel/database/dataset_defaults.rb +4 -48
  96. data/lib/sequel/database/features.rb +5 -4
  97. data/lib/sequel/database/logging.rb +2 -9
  98. data/lib/sequel/database/misc.rb +36 -55
  99. data/lib/sequel/database/query.rb +8 -13
  100. data/lib/sequel/database/schema_generator.rb +93 -64
  101. data/lib/sequel/database/schema_methods.rb +61 -79
  102. data/lib/sequel/database/transactions.rb +4 -24
  103. data/lib/sequel/database.rb +12 -2
  104. data/lib/sequel/dataset/actions.rb +57 -107
  105. data/lib/sequel/dataset/dataset_module.rb +4 -16
  106. data/lib/sequel/dataset/features.rb +35 -30
  107. data/lib/sequel/dataset/graph.rb +40 -49
  108. data/lib/sequel/dataset/misc.rb +12 -37
  109. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  110. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  111. data/lib/sequel/dataset/query.rb +91 -161
  112. data/lib/sequel/dataset/sql.rb +33 -225
  113. data/lib/sequel/dataset.rb +18 -10
  114. data/lib/sequel/deprecated.rb +18 -27
  115. data/lib/sequel/exceptions.rb +1 -17
  116. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  117. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  118. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  119. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  120. data/lib/sequel/extensions/connection_validator.rb +1 -1
  121. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  122. data/lib/sequel/extensions/core_extensions.rb +39 -49
  123. data/lib/sequel/extensions/core_refinements.rb +39 -45
  124. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  125. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  126. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  127. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  128. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  129. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  130. data/lib/sequel/extensions/from_block.rb +1 -35
  131. data/lib/sequel/extensions/graph_each.rb +2 -2
  132. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  133. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  134. data/lib/sequel/extensions/inflector.rb +4 -4
  135. data/lib/sequel/extensions/migration.rb +27 -43
  136. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  137. data/lib/sequel/extensions/null_dataset.rb +2 -8
  138. data/lib/sequel/extensions/pagination.rb +1 -17
  139. data/lib/sequel/extensions/pg_array.rb +20 -189
  140. data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
  141. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  142. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  143. data/lib/sequel/extensions/pg_inet.rb +3 -16
  144. data/lib/sequel/extensions/pg_interval.rb +1 -20
  145. data/lib/sequel/extensions/pg_json.rb +7 -27
  146. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  147. data/lib/sequel/extensions/pg_range.rb +6 -121
  148. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  149. data/lib/sequel/extensions/pg_row.rb +5 -77
  150. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  151. data/lib/sequel/extensions/query.rb +3 -4
  152. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  153. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  154. data/lib/sequel/extensions/select_remove.rb +3 -3
  155. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  156. data/lib/sequel/extensions/sql_comments.rb +2 -2
  157. data/lib/sequel/extensions/string_agg.rb +11 -8
  158. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  159. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  160. data/lib/sequel/model/associations.rb +129 -131
  161. data/lib/sequel/model/base.rb +133 -731
  162. data/lib/sequel/model/default_inflections.rb +1 -1
  163. data/lib/sequel/model/errors.rb +0 -3
  164. data/lib/sequel/model/exceptions.rb +2 -6
  165. data/lib/sequel/model/inflections.rb +1 -26
  166. data/lib/sequel/model/plugins.rb +1 -0
  167. data/lib/sequel/model.rb +27 -62
  168. data/lib/sequel/plugins/active_model.rb +2 -5
  169. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  170. data/lib/sequel/plugins/association_pks.rb +14 -28
  171. data/lib/sequel/plugins/association_proxies.rb +6 -7
  172. data/lib/sequel/plugins/auto_validations.rb +4 -4
  173. data/lib/sequel/plugins/before_after_save.rb +0 -43
  174. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  175. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  176. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  177. data/lib/sequel/plugins/caching.rb +5 -5
  178. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  179. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  180. data/lib/sequel/plugins/column_select.rb +2 -2
  181. data/lib/sequel/plugins/composition.rb +15 -24
  182. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  183. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  184. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  185. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  186. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  187. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  188. data/lib/sequel/plugins/finder.rb +16 -10
  189. data/lib/sequel/plugins/force_encoding.rb +1 -7
  190. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  191. data/lib/sequel/plugins/input_transformer.rb +10 -11
  192. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  193. data/lib/sequel/plugins/instance_filters.rb +5 -5
  194. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  195. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  196. data/lib/sequel/plugins/json_serializer.rb +19 -19
  197. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  198. data/lib/sequel/plugins/list.rb +6 -6
  199. data/lib/sequel/plugins/many_through_many.rb +11 -8
  200. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  201. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  202. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  203. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  204. data/lib/sequel/plugins/pg_row.rb +2 -11
  205. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  206. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  207. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  208. data/lib/sequel/plugins/serialization.rb +15 -33
  209. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  210. data/lib/sequel/plugins/sharding.rb +2 -8
  211. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  212. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  213. data/lib/sequel/plugins/static_cache.rb +8 -9
  214. data/lib/sequel/plugins/string_stripper.rb +3 -3
  215. data/lib/sequel/plugins/subclasses.rb +1 -1
  216. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  217. data/lib/sequel/plugins/table_select.rb +2 -2
  218. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  219. data/lib/sequel/plugins/timestamps.rb +6 -7
  220. data/lib/sequel/plugins/touch.rb +4 -8
  221. data/lib/sequel/plugins/tree.rb +3 -3
  222. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  223. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  224. data/lib/sequel/plugins/update_or_create.rb +3 -3
  225. data/lib/sequel/plugins/update_refresh.rb +3 -3
  226. data/lib/sequel/plugins/uuid.rb +7 -11
  227. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  228. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  229. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  230. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  231. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  232. data/lib/sequel/sql.rb +145 -276
  233. data/lib/sequel/timezones.rb +8 -23
  234. data/lib/sequel/version.rb +2 -2
  235. data/lib/sequel.rb +1 -1
  236. data/spec/adapter_spec.rb +1 -1
  237. data/spec/adapters/db2_spec.rb +2 -103
  238. data/spec/adapters/mssql_spec.rb +89 -68
  239. data/spec/adapters/mysql_spec.rb +111 -478
  240. data/spec/adapters/oracle_spec.rb +1 -9
  241. data/spec/adapters/postgres_spec.rb +459 -664
  242. data/spec/adapters/spec_helper.rb +12 -31
  243. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  244. data/spec/adapters/sqlite_spec.rb +8 -146
  245. data/spec/bin_spec.rb +11 -16
  246. data/spec/core/connection_pool_spec.rb +173 -74
  247. data/spec/core/database_spec.rb +96 -244
  248. data/spec/core/dataset_spec.rb +99 -414
  249. data/spec/core/deprecated_spec.rb +3 -3
  250. data/spec/core/expression_filters_spec.rb +37 -144
  251. data/spec/core/mock_adapter_spec.rb +241 -4
  252. data/spec/core/object_graph_spec.rb +11 -60
  253. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  254. data/spec/core/schema_generator_spec.rb +51 -40
  255. data/spec/core/schema_spec.rb +88 -77
  256. data/spec/core/spec_helper.rb +6 -24
  257. data/spec/core/version_spec.rb +1 -1
  258. data/spec/core_extensions_spec.rb +7 -83
  259. data/spec/core_model_spec.rb +2 -2
  260. data/spec/deprecation_helper.rb +2 -14
  261. data/spec/extensions/accessed_columns_spec.rb +1 -1
  262. data/spec/extensions/active_model_spec.rb +3 -3
  263. data/spec/extensions/after_initialize_spec.rb +1 -1
  264. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  265. data/spec/extensions/association_dependencies_spec.rb +1 -1
  266. data/spec/extensions/association_pks_spec.rb +30 -92
  267. data/spec/extensions/association_proxies_spec.rb +1 -1
  268. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  269. data/spec/extensions/auto_validations_spec.rb +1 -1
  270. data/spec/extensions/blacklist_security_spec.rb +1 -1
  271. data/spec/extensions/blank_spec.rb +1 -1
  272. data/spec/extensions/boolean_readers_spec.rb +1 -1
  273. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  274. data/spec/extensions/caching_spec.rb +1 -1
  275. data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
  276. data/spec/extensions/column_conflicts_spec.rb +1 -1
  277. data/spec/extensions/column_select_spec.rb +4 -4
  278. data/spec/extensions/columns_introspection_spec.rb +1 -1
  279. data/spec/extensions/columns_updated_spec.rb +1 -1
  280. data/spec/extensions/composition_spec.rb +8 -30
  281. data/spec/extensions/connection_expiration_spec.rb +3 -3
  282. data/spec/extensions/connection_validator_spec.rb +3 -3
  283. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  284. data/spec/extensions/constraint_validations_spec.rb +1 -1
  285. data/spec/extensions/core_refinements_spec.rb +1 -3
  286. data/spec/extensions/csv_serializer_spec.rb +4 -9
  287. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  288. data/spec/extensions/dataset_associations_spec.rb +2 -1
  289. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  290. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  291. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  292. data/spec/extensions/defaults_setter_spec.rb +2 -2
  293. data/spec/extensions/delay_add_association_spec.rb +8 -9
  294. data/spec/extensions/dirty_spec.rb +1 -1
  295. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  296. data/spec/extensions/eager_each_spec.rb +2 -2
  297. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  298. data/spec/extensions/error_splitter_spec.rb +1 -1
  299. data/spec/extensions/error_sql_spec.rb +1 -1
  300. data/spec/extensions/eval_inspect_spec.rb +1 -1
  301. data/spec/extensions/finder_spec.rb +1 -1
  302. data/spec/extensions/force_encoding_spec.rb +2 -5
  303. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  304. data/spec/extensions/graph_each_spec.rb +5 -5
  305. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  306. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  307. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  308. data/spec/extensions/inflector_spec.rb +1 -1
  309. data/spec/extensions/input_transformer_spec.rb +7 -2
  310. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  311. data/spec/extensions/instance_filters_spec.rb +1 -1
  312. data/spec/extensions/instance_hooks_spec.rb +1 -95
  313. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  314. data/spec/extensions/json_serializer_spec.rb +1 -1
  315. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  316. data/spec/extensions/list_spec.rb +5 -6
  317. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  318. data/spec/extensions/many_through_many_spec.rb +25 -33
  319. data/spec/extensions/migration_spec.rb +12 -2
  320. data/spec/extensions/modification_detection_spec.rb +1 -1
  321. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  322. data/spec/extensions/named_timezones_spec.rb +3 -3
  323. data/spec/extensions/nested_attributes_spec.rb +1 -29
  324. data/spec/extensions/null_dataset_spec.rb +1 -11
  325. data/spec/extensions/optimistic_locking_spec.rb +2 -2
  326. data/spec/extensions/pagination_spec.rb +1 -1
  327. data/spec/extensions/pg_array_associations_spec.rb +22 -26
  328. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_array_spec.rb +3 -48
  330. data/spec/extensions/pg_enum_spec.rb +1 -1
  331. data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
  332. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  333. data/spec/extensions/pg_hstore_spec.rb +22 -31
  334. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_inet_spec.rb +1 -14
  336. data/spec/extensions/pg_interval_spec.rb +3 -13
  337. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  338. data/spec/extensions/pg_json_spec.rb +1 -13
  339. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  340. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  341. data/spec/extensions/pg_range_spec.rb +3 -88
  342. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  343. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  344. data/spec/extensions/pg_row_spec.rb +1 -44
  345. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  346. data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
  347. data/spec/extensions/prepared_statements_spec.rb +13 -48
  348. data/spec/extensions/pretty_table_spec.rb +40 -9
  349. data/spec/extensions/query_spec.rb +1 -12
  350. data/spec/extensions/rcte_tree_spec.rb +23 -34
  351. data/spec/extensions/round_timestamps_spec.rb +1 -5
  352. data/spec/extensions/s_spec.rb +1 -1
  353. data/spec/extensions/schema_caching_spec.rb +1 -1
  354. data/spec/extensions/schema_dumper_spec.rb +43 -32
  355. data/spec/extensions/select_remove_spec.rb +1 -1
  356. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  357. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  358. data/spec/extensions/serialization_spec.rb +5 -17
  359. data/spec/extensions/server_block_spec.rb +1 -1
  360. data/spec/extensions/server_logging_spec.rb +2 -2
  361. data/spec/extensions/sharding_spec.rb +1 -1
  362. data/spec/extensions/shared_caching_spec.rb +1 -28
  363. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  364. data/spec/extensions/singular_table_names_spec.rb +1 -1
  365. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  366. data/spec/extensions/spec_helper.rb +5 -27
  367. data/spec/extensions/split_array_nil_spec.rb +1 -1
  368. data/spec/extensions/split_values_spec.rb +1 -1
  369. data/spec/extensions/sql_comments_spec.rb +1 -1
  370. data/spec/extensions/sql_expr_spec.rb +1 -1
  371. data/spec/extensions/static_cache_spec.rb +1 -1
  372. data/spec/extensions/string_agg_spec.rb +2 -2
  373. data/spec/extensions/string_date_time_spec.rb +1 -1
  374. data/spec/extensions/string_stripper_spec.rb +1 -1
  375. data/spec/extensions/subclasses_spec.rb +1 -1
  376. data/spec/extensions/subset_conditions_spec.rb +1 -1
  377. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  378. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  379. data/spec/extensions/synchronize_sql_spec.rb +124 -0
  380. data/spec/extensions/table_select_spec.rb +4 -4
  381. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  382. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  383. data/spec/extensions/timestamps_spec.rb +5 -7
  384. data/spec/extensions/to_dot_spec.rb +1 -1
  385. data/spec/extensions/touch_spec.rb +1 -1
  386. data/spec/extensions/tree_spec.rb +1 -1
  387. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  388. data/spec/extensions/unlimited_update_spec.rb +1 -1
  389. data/spec/extensions/update_or_create_spec.rb +12 -16
  390. data/spec/extensions/update_primary_key_spec.rb +4 -3
  391. data/spec/extensions/update_refresh_spec.rb +1 -1
  392. data/spec/extensions/uuid_spec.rb +10 -13
  393. data/spec/extensions/validate_associated_spec.rb +1 -1
  394. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  395. data/spec/extensions/validation_contexts_spec.rb +1 -1
  396. data/spec/extensions/validation_helpers_spec.rb +10 -44
  397. data/spec/extensions/whitelist_security_spec.rb +5 -5
  398. data/spec/extensions/xml_serializer_spec.rb +8 -13
  399. data/spec/guards_helper.rb +2 -1
  400. data/spec/integration/associations_test.rb +1 -23
  401. data/spec/integration/database_test.rb +7 -7
  402. data/spec/integration/dataset_test.rb +12 -47
  403. data/spec/integration/eager_loader_test.rb +1 -1
  404. data/spec/integration/migrator_test.rb +1 -1
  405. data/spec/integration/model_test.rb +4 -82
  406. data/spec/integration/plugin_test.rb +7 -23
  407. data/spec/integration/prepared_statement_test.rb +8 -88
  408. data/spec/integration/schema_test.rb +10 -10
  409. data/spec/integration/spec_helper.rb +17 -21
  410. data/spec/integration/timezone_test.rb +5 -5
  411. data/spec/integration/transaction_test.rb +3 -55
  412. data/spec/integration/type_test.rb +9 -9
  413. data/spec/model/association_reflection_spec.rb +24 -9
  414. data/spec/model/associations_spec.rb +124 -303
  415. data/spec/model/base_spec.rb +43 -137
  416. data/spec/model/class_dataset_methods_spec.rb +2 -20
  417. data/spec/model/dataset_methods_spec.rb +1 -20
  418. data/spec/model/eager_loading_spec.rb +48 -17
  419. data/spec/model/hooks_spec.rb +5 -300
  420. data/spec/model/inflector_spec.rb +1 -1
  421. data/spec/model/model_spec.rb +29 -339
  422. data/spec/model/plugins_spec.rb +2 -16
  423. data/spec/model/record_spec.rb +33 -129
  424. data/spec/model/spec_helper.rb +5 -15
  425. data/spec/model/validations_spec.rb +1 -1
  426. data/spec/sequel_warning.rb +1 -12
  427. metadata +19 -65
  428. data/doc/active_record.rdoc +0 -927
  429. data/lib/sequel/adapters/cubrid.rb +0 -160
  430. data/lib/sequel/adapters/do/mysql.rb +0 -69
  431. data/lib/sequel/adapters/do/postgres.rb +0 -46
  432. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  433. data/lib/sequel/adapters/do.rb +0 -166
  434. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  435. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  436. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  437. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  438. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  439. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  440. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  441. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  442. data/lib/sequel/adapters/shared/informix.rb +0 -63
  443. data/lib/sequel/adapters/shared/progress.rb +0 -40
  444. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  445. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  446. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  447. data/lib/sequel/adapters/swift.rb +0 -169
  448. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  449. data/lib/sequel/dataset/mutation.rb +0 -98
  450. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  451. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  452. data/lib/sequel/extensions/filter_having.rb +0 -65
  453. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  454. data/lib/sequel/extensions/meta_def.rb +0 -37
  455. data/lib/sequel/extensions/query_literals.rb +0 -86
  456. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  457. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  458. data/lib/sequel/extensions/set_overrides.rb +0 -82
  459. data/lib/sequel/no_core_ext.rb +0 -4
  460. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  461. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  462. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  463. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  464. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  465. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  466. data/lib/sequel/plugins/schema.rb +0 -84
  467. data/lib/sequel/plugins/scissors.rb +0 -37
  468. data/spec/core/dataset_mutation_spec.rb +0 -253
  469. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  470. data/spec/extensions/before_after_save_spec.rb +0 -40
  471. data/spec/extensions/filter_having_spec.rb +0 -42
  472. data/spec/extensions/from_block_spec.rb +0 -21
  473. data/spec/extensions/hash_aliases_spec.rb +0 -26
  474. data/spec/extensions/identifier_columns_spec.rb +0 -19
  475. data/spec/extensions/meta_def_spec.rb +0 -35
  476. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  477. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  478. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  479. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  480. data/spec/extensions/query_literals_spec.rb +0 -185
  481. data/spec/extensions/schema_spec.rb +0 -123
  482. data/spec/extensions/scissors_spec.rb +0 -27
  483. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  484. data/spec/extensions/set_overrides_spec.rb +0 -75
data/doc/postgresql.rdoc CHANGED
@@ -19,10 +19,10 @@ rarely used PostgreSQL features that Sequel supports which are not mentioned her
19
19
 
20
20
  Some of this this support depends on the specific adapter or underlying driver in use.
21
21
  <tt>postgres only</tt> will denote support specific to the postgres adapter (i.e.
22
- not available when connecting to PostgreSQL via the jdbc, do, or swift adapters).
22
+ not available when connecting to PostgreSQL via the jdbc adapter).
23
23
  <tt>postgres/pg only</tt> will denote support specific to the postgres adapter when
24
- pg is used as the underlying driver (i.e. not available when using the postgres-pr or
25
- postgres drivers).
24
+ pg is used as the underlying driver (i.e. not available when using the postgres-pr
25
+ driver).
26
26
 
27
27
  == PostgreSQL-specific Database Type Support
28
28
 
@@ -44,7 +44,7 @@ pg_range :: ranges (for any scalar type), as a ruby Range-like object
44
44
  pg_row :: row-valued/composite types, as a ruby Hash-like or Sequel::Model object
45
45
 
46
46
  In general, these extensions just add support for Database objects to return retrieved
47
- column values as the appropriate type (<tt>postgres and jdbc/postgres only</tt>), and support for literalizing
47
+ column values as the appropriate type and support for literalizing
48
48
  the objects correctly for use in an SQL string, or using them as bound variable values (<tt>postgres/pg and jdbc/postgres only</tt>).
49
49
 
50
50
  There are also type-specific extensions that make it easy to use database functions
@@ -56,6 +56,13 @@ pg_json_ops :: json-related functions and operators
56
56
  pg_range_ops :: range-related functions and operators
57
57
  pg_row_ops :: row-valued/composite type syntax support
58
58
 
59
+ These extensions aren't Database specific, they are global extensions, so you should
60
+ load them via <tt>Sequel.extension</tt>, after loading support for the specific types
61
+ into the Database instance:
62
+
63
+ DB.extension :pg_array
64
+ Sequel.extension :pg_array_ops
65
+
59
66
  == PostgreSQL-specific DDL Support
60
67
 
61
68
  === Exclusion Constraints
@@ -64,7 +71,7 @@ In +create_table+ blocks, you can use the +exclude+ method to set up exclusion c
64
71
 
65
72
  DB.create_table(:table) do
66
73
  daterange :during
67
- exclude([[:during, '&&']], :name=>:table_during_excl)
74
+ exclude([[:during, '&&']], name: :table_during_excl)
68
75
  end
69
76
  # CREATE TABLE "table" ("during" daterange,
70
77
  # CONSTRAINT "table_during_excl" EXCLUDE USING gist ("during" WITH &&))
@@ -72,20 +79,20 @@ In +create_table+ blocks, you can use the +exclude+ method to set up exclusion c
72
79
  You can also add exclusion constraints in +alter_table+ blocks using add_exclusion_constraint:
73
80
 
74
81
  DB.alter_table(:table) do
75
- add_exclusion_constraint([[:during, '&&']], :name=>:table_during_excl)
82
+ add_exclusion_constraint([[:during, '&&']], name: :table_during_excl)
76
83
  end
77
84
  # ALTER TABLE "table" ADD CONSTRAINT "table_during_excl" EXCLUDE USING gist ("during" WITH &&)
78
85
 
79
86
  === Adding Foreign Key and Check Constraints Without Initial Validation
80
87
 
81
- You can add a <tt>:not_valid=>true</tt> option when adding constraints to existing tables so
88
+ You can add a <tt>not_valid: true</tt> option when adding constraints to existing tables so
82
89
  that it doesn't check if all current rows are valid:
83
90
 
84
91
  DB.alter_table(:table) do
85
92
  # Assumes t_id column already exists
86
- add_foreign_key([:t_id], :table, :not_valid=>true, :name=>:table_fk)
93
+ add_foreign_key([:t_id], :table, not_valid: true, name: :table_fk)
87
94
 
88
- constraint({:name=>:col_123, :not_valid=>true}, :col=>[1,2,3])
95
+ constraint({name: :col_123, not_valid: true}, col: [1,2,3])
89
96
  end
90
97
  # ALTER TABLE "table" ADD CONSTRAINT "table_fk" FOREIGN KEY ("t_id") REFERENCES "table" NOT VALID
91
98
  # ALTER TABLE "table" ADD CONSTRAINT "col_123" CHECK (col IN (1, 2, 3)) NOT VALID
@@ -102,14 +109,14 @@ all existing rows have been fixed, you can validate the constraint:
102
109
 
103
110
  === Creating Indexes Concurrently
104
111
 
105
- You can create indexes concurrently using the <tt>:concurrently=>true</tt> option:
112
+ You can create indexes concurrently using the <tt>concurrently: true</tt> option:
106
113
 
107
- DB.add_index(:table, :t_id, :concurrently=>true)
114
+ DB.add_index(:table, :t_id, concurrently: true)
108
115
  # CREATE INDEX CONCURRENTLY "table_t_id_index" ON "table" ("t_id")
109
116
 
110
117
  Similarly, you can drop indexes concurrently as well:
111
118
 
112
- DB.drop_index(:table, :t_id, :concurrently=>true)
119
+ DB.drop_index(:table, :t_id, concurrently: true)
113
120
  # DROP INDEX CONCURRENTLY "table_t_id_index"
114
121
 
115
122
  === Specific Conversions When Altering Column Types
@@ -119,7 +126,7 @@ conversion via a USING clause, and Sequel supports this using the <tt>:using</tt
119
126
 
120
127
  DB.alter_table(:table) do
121
128
  # Assume unix_time column is stored as an integer, and you want to change it to timestamp
122
- set_column_type :unix_time, Time, :using=>(Sequel.cast('epoch', Time) + Sequel.cast('1 second', :interval) * :unix_time)
129
+ set_column_type :unix_time, Time, using: (Sequel.cast('epoch', Time) + Sequel.cast('1 second', :interval) * :unix_time)
123
130
  end
124
131
  # ALTER TABLE "table" ALTER COLUMN "unix_time" TYPE timestamp
125
132
  # USING (CAST('epoch' AS timestamp) + (CAST('1 second' AS interval) * "unix_time"))
@@ -127,9 +134,9 @@ conversion via a USING clause, and Sequel supports this using the <tt>:using</tt
127
134
  === Creating Unlogged Tables
128
135
 
129
136
  PostgreSQL allows users to create unlogged tables, which are faster but not crash safe. Sequel
130
- allows you do create an unlogged table by specifying the <tt>:unlogged=>true</tt> option to +create_table+:
137
+ allows you do create an unlogged table by specifying the <tt>unlogged: true</tt> option to +create_table+:
131
138
 
132
- DB.create_table(:table, :unlogged=>true){Integer :i}
139
+ DB.create_table(:table, unlogged: true){Integer :i}
133
140
  # CREATE UNLOGGED TABLE "table" ("i" integer)
134
141
 
135
142
  === Creating/Dropping Schemas, Languages, Functions, and Triggers
@@ -146,7 +153,7 @@ Sequel has built in support for creating and dropping PostgreSQL schemas, proced
146
153
  DB.drop_language(:plperl)
147
154
  # DROP LANGUAGE plperl
148
155
 
149
- DB.create_function(:set_updated_at, <<-SQL, :language=>:plpgsql, :returns=>:trigger)
156
+ DB.create_function(:set_updated_at, <<-SQL, language: :plpgsql, returns: :trigger)
150
157
  BEGIN
151
158
  NEW.updated_at := CURRENT_TIMESTAMP;
152
159
  RETURN NEW;
@@ -160,11 +167,13 @@ Sequel has built in support for creating and dropping PostgreSQL schemas, proced
160
167
  DB.drop_function(:set_updated_at)
161
168
  # DROP FUNCTION set_updated_at()
162
169
 
163
- DB.create_trigger(:table, :trg_updated_at, :set_updated_at, :events=>:update, :each_row=>true, :when => {Sequel[:new][:updated_at] => Sequel[:old][:updated_at]})
170
+ DB.create_trigger(:table, :trg_updated_at, :set_updated_at, events: :update, each_row: true, when: {Sequel[:new][:updated_at] => Sequel[:old][:updated_at]})
164
171
  # CREATE TRIGGER trg_updated_at BEFORE UPDATE ON "table" FOR EACH ROW WHEN ("new"."updated_at" = "old"."updated_at") EXECUTE PROCEDURE set_updated_at()
165
172
  DB.drop_trigger(:table, :trg_updated_at)
166
173
  # DROP TRIGGER trg_updated_at ON "table"
167
174
 
175
+ However, you may want to consider just use <tt>Database#run</tt> with the necessary SQL code, at least for functions and triggers.
176
+
168
177
  == PostgreSQL-specific DML Support
169
178
 
170
179
  === Returning Rows From Insert, Update, and Delete Statements
@@ -178,12 +187,12 @@ Sequel supports the ability to return rows from insert, update, and delete state
178
187
  DB[:table].returning(:id).delete
179
188
  # DELETE FROM "table" RETURNING "id"
180
189
 
181
- DB[:table].returning(:id, Sequel.*(:id, :id).as(:idsq)).update(:id=>2)
190
+ DB[:table].returning(:id, Sequel.*(:id, :id).as(:idsq)).update(id: 2)
182
191
  # UPDATE "table" SET "id" = 2 RETURNING "id", ("id" * "id") AS "idsq"
183
192
 
184
193
  When returning is used, instead of returning the number of rows affected (for updated/delete)
185
194
  or the serial primary key value (for insert), it will return an array of hashes with the
186
- returned results.
195
+ returning results.
187
196
 
188
197
  === VALUES Support
189
198
 
@@ -203,27 +212,27 @@ Sequel offers support for the +VALUES+ statement using <tt>Database#values</tt>:
203
212
  Starting with PostgreSQL 9.5, you can do an upsert or ignore unique or exclusion constraint
204
213
  violations when inserting using <tt>Dataset#insert_conflict</tt>:
205
214
 
206
- DB[:table].insert_conflict.insert(:a=>1, :b=>2)
215
+ DB[:table].insert_conflict.insert(a: 1, b: 2)
207
216
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
208
217
  # ON CONFLICT DO NOTHING
209
218
 
210
219
  For compatibility with Sequel's MySQL support, you can also use +insert_ignore+:
211
220
 
212
- DB[:table].insert_ignore.insert(:a=>1, :b=>2)
221
+ DB[:table].insert_ignore.insert(a: 1, b: 2)
213
222
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
214
223
  # ON CONFLICT DO NOTHING
215
224
 
216
225
  You can pass a specific constraint name using +:constraint+, to only ignore a specific
217
226
  constraint violation:
218
227
 
219
- DB[:table].insert_conflict(:constraint=>:table_a_uidx).insert(:a=>1, :b=>2)
228
+ DB[:table].insert_conflict(constraint: :table_a_uidx).insert(a: 1, b: 2)
220
229
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
221
230
  # ON CONFLICT ON CONSTRAINT table_a_uidx DO NOTHING
222
231
 
223
232
  If the unique or exclusion constraint covers the whole table (e.g. it isn't a partial unique
224
233
  index), then you can just specify the column using the +:target+ option:
225
234
 
226
- DB[:table].insert_conflict(:target=>:a).insert(:a=>1, :b=>2)
235
+ DB[:table].insert_conflict(target: :a).insert(a: 1, b: 2)
227
236
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
228
237
  # ON CONFLICT (a) DO NOTHING
229
238
 
@@ -231,7 +240,7 @@ If you want to update the existing row instead of ignoring the constraint violat
231
240
  can pass an +:update+ option with a hash of values to update. You must pass either the
232
241
  +:target+ or +:constraint+ options when passing the +:update+ option:
233
242
 
234
- DB[:table].insert_conflict(:target=>:a, :update=>{:b=>Sequel[:excluded][:b]}).insert(:a=>1, :b=>2)
243
+ DB[:table].insert_conflict(target: :a, update: {b: Sequel[:excluded][:b]}).insert(a: 1, b: 2)
235
244
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
236
245
  # ON CONFLICT (a) DO UPDATE SET b = excluded.b
237
246
 
@@ -239,8 +248,9 @@ Additionally, if you only want to do the update in certain cases, you can specif
239
248
  +:update_where+ option, which will be used as a filter. If the row doesn't match the
240
249
  conditions, the constraint violation will be ignored, but the row will not be updated:
241
250
 
242
- DB[:table].insert_conflict(:constraint=>:table_a_uidx,
243
- :update=>{:b=>Sequel[:excluded][:b]}, :update_where=>{Sequel[:table][:status_id]=>1}).insert(:a=>1, :b=>2)
251
+ DB[:table].insert_conflict(constraint::table_a_uidx,
252
+ update: {b: Sequel[:excluded][:b]},
253
+ update_where: {Sequel[:table][:status_id]=>1}).insert(a: 1, b: 2)
244
254
  # INSERT INTO TABLE (a, b) VALUES (1, 2)
245
255
  # ON CONFLICT ON CONSTRAINT table_a_uidx
246
256
  # DO UPDATE SET b = excluded.b WHERE (table.status_id = 1)
@@ -271,19 +281,19 @@ without keeping all rows in memory:
271
281
  This support is used by default when using <tt>Dataset#paged_each</tt>.
272
282
 
273
283
  Using cursors, it is possible to update individual rows of a large dataset
274
- easily using the <tt>:rows_per_fetch=>1</tt> option in conjunction with
284
+ easily using the <tt>rows_per_fetch: 1</tt> option in conjunction with
275
285
  <tt>Dataset#where_current_of</tt>. This is useful if the logic needed to
276
286
  update the rows exists in the application and not in the database:
277
287
 
278
- ds.use_cursor(:rows_per_fetch=>1).each do |row|
279
- ds.where_current_of.update(:col=>new_col_value(row))
288
+ ds.use_cursor(rows_per_fetch: 1).each do |row|
289
+ ds.where_current_of.update(col: new_col_value(row))
280
290
  end
281
291
 
282
292
  === Truncate Modifiers
283
293
 
284
294
  Sequel supports PostgreSQL-specific truncate options:
285
295
 
286
- DB[:table].truncate(:cascade => true, :only=>true, :restart=>true)
296
+ DB[:table].truncate(cascade: true, only: true, restart: true)
287
297
  # TRUNCATE TABLE ONLY "table" RESTART IDENTITY CASCADE
288
298
 
289
299
  === COPY Support <tt>postgres/pg and jdbc/postgres only</tt>
@@ -292,14 +302,14 @@ PostgreSQL's COPY feature is pretty much the fastest way to get data in or out o
292
302
  Sequel supports getting data out of the database via <tt>Database#copy_table</tt>, either for
293
303
  a specific table or for an arbitrary dataset:
294
304
 
295
- DB.copy_table(:table, :format=>:csv)
305
+ DB.copy_table(:table, format: :csv)
296
306
  # COPY "table" TO STDOUT (FORMAT csv)
297
- DB.copy_table(DB[:table], :format=>:csv)
307
+ DB.copy_table(DB[:table], format: :csv)
298
308
  # COPY (SELECT * FROM "table") TO STDOUT (FORMAT csv)
299
309
 
300
310
  It supports putting data into the database via <tt>Database#copy_into</tt>:
301
311
 
302
- DB.copy_into(:table, :format=>:csv, :columns=>[:column1, :column2], :data=>"1,2\n2,3\n")
312
+ DB.copy_into(:table, format: :csv, columns: [:column1, :column2], data: "1,2\n2,3\n")
303
313
  # COPY "table"("column1", "column2") FROM STDIN (FORMAT csv)
304
314
 
305
315
  === Anonymous Function Execution
@@ -336,7 +346,7 @@ this blocks until the listening thread is notified:
336
346
  Note that +listen+ by default only listens for a single notification. If you want to loop and process
337
347
  notifications:
338
348
 
339
- DB.listen(:channel, :loop=>true){|channel| p channel}
349
+ DB.listen(:channel, loop: true){|channel| p channel}
340
350
 
341
351
  The +pg_static_cache_updater+ extension uses this support to automatically update
342
352
  the caches for models using the +static_cache+ plugin. Look at the documentation of that
@@ -348,7 +358,7 @@ Sequel makes it easy to lock tables, though it is generally better to let the da
348
358
  handle locking:
349
359
 
350
360
  DB[:table].lock('EXCLUSIVE') do
351
- DB[:table].insert(:id=>DB[:table].max(:id)+1)
361
+ DB[:table].insert(id: DB[:table].max(:id)+1)
352
362
  end
353
363
  # BEGIN;
354
364
  # LOCK TABLE "table" IN EXCLUSIVE MODE;
@@ -360,14 +370,14 @@ handle locking:
360
370
 
361
371
  When the postgres adapter is used with the pg driver, Sequel automatically checks for sequel_pg, and
362
372
  loads it if it is available. sequel_pg is a C extension that optimizes the fetching of rows, generally
363
- resulting in a 2-6x speedup. It is highly recommended to install sequel_pg if you are using the
373
+ resulting in a ~2x speedup. It is highly recommended to install sequel_pg if you are using the
364
374
  postgres adapter with pg.
365
375
 
366
- sequel_pg has additional optimizations when using the Dataset +map+, +to_hash+,
376
+ sequel_pg has additional optimizations when using the Dataset +map+, +as_hash+,
367
377
  +to_hash_groups+, +select_hash+, +select_hash_groups+, +select_map+, and +select_order_map+ methods,
368
378
  which avoids creating intermediate hashes and can add further speedups.
369
379
 
370
- In addition to optimization, sequel_pg also adds streaming support if used on PostgreSQL 9.2. Streaming
380
+ In addition to optimization, sequel_pg also adds streaming support if used on PostgreSQL 9.2+. Streaming
371
381
  support is similar to using a cursor, but it is faster and more transparent.
372
382
 
373
383
  You can enable the streaming support:
@@ -14,7 +14,7 @@ the following adapters:
14
14
  * sqlite
15
15
  * tinytds
16
16
 
17
- Support on other adapters is emulated via string interpolation.
17
+ Support on other adapters is emulated.
18
18
 
19
19
  You can use the prepared_statements model plugin to automatically use prepared
20
20
  statements for some common model actions such as saving or deleting a model
@@ -29,7 +29,7 @@ significantly for placeholders (e.g. :name, $1, ?). Sequel abstracts all of
29
29
  that and allows you to specify placeholders by using the :$name format for
30
30
  placeholders, e.g.:
31
31
 
32
- ds = DB[:items].where(:name=>:$n)
32
+ ds = DB[:items].where(name: :$n)
33
33
 
34
34
  You can use these placeholders in most places where you can use the value
35
35
  directly. For example, if you want to use placeholders while also using
@@ -41,45 +41,49 @@ raw SQL, you can do:
41
41
 
42
42
  Using bound variables for this query is simple:
43
43
 
44
- ds.call(:select, :n=>'Jim')
44
+ ds.call(:select, n: 'Jim')
45
45
 
46
46
  This will do the equivalent of selecting records that have the name 'Jim'. It
47
47
  returns all records, and can take a block that is passed to <tt>Dataset#all</tt>.
48
48
 
49
49
  Deleting or returning the first record works similarly:
50
50
 
51
- ds.call(:first, :n=>'Jim') # First record with name 'Jim'
52
- ds.call(:delete, :n=>'Jim') # Delete records with name 'Jim'
51
+ ds.call(:first, n: 'Jim') # First record with name 'Jim'
52
+ ds.call(:delete, n: 'Jim') # Delete records with name 'Jim'
53
53
 
54
54
  For inserting/updating records, you should also specify a value hash, which
55
55
  may itself contain placeholders:
56
56
 
57
57
  # Insert record with 'Jim', note that the previous filter is ignored
58
- ds.call(:insert, {:n=>'Jim'}, :name=>:$n)
58
+ ds.call(:insert, {n: 'Jim'}, name: :$n)
59
59
  # Change name to 'Bob' for all records with name of 'Jim'
60
- ds.call(:update, {:n=>'Jim', :new_n=>'Bob'}, :name=>:$new_n)
60
+ ds.call(:update, {n: 'Jim', new_n: 'Bob'}, name: :$new_n)
61
61
 
62
62
  == Prepared Statements
63
63
 
64
64
  Prepared statement support is similar to bound variable support, but you
65
65
  use <tt>Dataset#prepare</tt> with a name, and <tt>Dataset#call</tt> or <tt>Database#call</tt> later with the values:
66
66
 
67
- ds = DB[:items].where(:name=>:$n)
67
+ ds = DB[:items].where(name: :$n)
68
68
  ps = ds.prepare(:select, :select_by_name)
69
- ps.call(:n=>'Jim')
70
- DB.call(:select_by_name, :n=>'Jim') # same as above
69
+
70
+ ps.call(n: 'Jim')
71
+ DB.call(:select_by_name, n: 'Jim') # same
71
72
 
72
73
  The <tt>Dataset#prepare</tt> method returns a prepared statement, and also stores a
73
74
  copy of the prepared statement in the database for later use. For insert
74
75
  and update queries, the hash to insert/update is passed to +prepare+:
75
76
 
76
- ps1 = DB[:items].prepare(:insert, :insert_with_name, :name=>:$n)
77
- ps1.call(:n=>'Jim')
78
- DB.call(:insert_with_name, :n=>'Jim') # same as above
79
- ds = DB[:items].where(:name=>:$n)
80
- ps2 = ds.prepare(:update, :update_name, :name=>:$new_n)
81
- ps2.call(:n=>'Jim', :new_n=>'Bob')
82
- DB.call(:update_name, :n=>'Jim', :new_n=>'Bob') # same as above
77
+ ps1 = DB[:items].prepare(:insert, :insert_with_name, name: :$n)
78
+
79
+ ps1.call(n: 'Jim')
80
+ DB.call(:insert_with_name, n: 'Jim') # same
81
+
82
+ ds = DB[:items].where(name: :$n)
83
+ ps2 = ds.prepare(:update, :update_name, name: :$new_n)
84
+
85
+ ps2.call(n: 'Jim', new_n: 'Bob')
86
+ DB.call(:update_name, n: 'Jim', new_n: 'Bob') # same
83
87
 
84
88
  == Implementation Issues
85
89
 
@@ -92,7 +96,7 @@ to create prepared statements dynamically at runtime.
92
96
 
93
97
  === PostgreSQL
94
98
 
95
- If you are using the ruby-postgres or postgres-pr driver, PostgreSQL uses the
99
+ If you are using the postgres-pr driver, PostgreSQL uses the
96
100
  default emulated support. If you are using ruby-pg, there is native support
97
101
  for both prepared statements and bound variables. Prepared statements are
98
102
  always server side.
@@ -103,9 +107,10 @@ SQLite supports both prepared statements and bound variables.
103
107
 
104
108
  === MySQL/Mysql2
105
109
 
106
- The MySQL/Mysql2 ruby drivers do not support bound variables, so the bound
107
- variable methods fall back to string interpolation. It uses server side
108
- prepared statements.
110
+ The MySQL and Mysql2 <0.4 ruby drivers do not support bound variables, so the bound
111
+ variable methods are emulated. It uses server side prepared statements.
112
+
113
+ Mysql2 0.4+ supports both prepared statements and bound variables.
109
114
 
110
115
  === JDBC
111
116
 
@@ -136,4 +141,4 @@ not currently supported.
136
141
 
137
142
  === All Others
138
143
 
139
- Support is emulated using interpolation.
144
+ Support is emulated.