sequel 4.49.0 → 5.3.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 (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
@@ -32,7 +32,7 @@
32
32
  #
33
33
  # So if you want to insert an array into an integer[] database column:
34
34
  #
35
- # DB[:table].insert(:column=>Sequel.pg_array([1, 2, 3]))
35
+ # DB[:table].insert(column: Sequel.pg_array([1, 2, 3]))
36
36
  #
37
37
  # To use this extension, first load it into your Sequel::Database instance:
38
38
  #
@@ -71,7 +71,6 @@
71
71
 
72
72
  require 'delegate'
73
73
  require 'strscan'
74
- Sequel.require 'adapters/shared/postgres'
75
74
 
76
75
  module Sequel
77
76
  module Postgres
@@ -79,108 +78,16 @@ module Sequel
79
78
  class PGArray < DelegateClass(Array)
80
79
  include Sequel::SQL::AliasMethods
81
80
 
82
- ARRAY = "ARRAY".freeze
83
- Sequel::Deprecation.deprecate_constant(self, :ARRAY)
84
- DOUBLE_COLON = '::'.freeze
85
- Sequel::Deprecation.deprecate_constant(self, :DOUBLE_COLON)
86
- EMPTY_ARRAY = "'{}'".freeze
87
- Sequel::Deprecation.deprecate_constant(self, :EMPTY_ARRAY)
88
- EMPTY_BRACKET = '[]'.freeze
89
- Sequel::Deprecation.deprecate_constant(self, :EMPTY_BRACKET)
90
- OPEN_BRACKET = '['.freeze
91
- Sequel::Deprecation.deprecate_constant(self, :OPEN_BRACKET)
92
- CLOSE_BRACKET = ']'.freeze
93
- Sequel::Deprecation.deprecate_constant(self, :CLOSE_BRACKET)
94
- COMMA = ','.freeze
95
- Sequel::Deprecation.deprecate_constant(self, :COMMA)
96
- BACKSLASH = '\\'.freeze
97
- Sequel::Deprecation.deprecate_constant(self, :BACKSLASH)
98
- EMPTY_STRING = ''.freeze
99
- Sequel::Deprecation.deprecate_constant(self, :EMPTY_STRING)
100
- OPEN_BRACE = '{'.freeze
101
- Sequel::Deprecation.deprecate_constant(self, :OPEN_BRACE)
102
- CLOSE_BRACE = '}'.freeze
103
- Sequel::Deprecation.deprecate_constant(self, :CLOSE_BRACE)
104
- NULL = 'NULL'.freeze
105
- Sequel::Deprecation.deprecate_constant(self, :NULL)
106
- QUOTE = '"'.freeze
107
- Sequel::Deprecation.deprecate_constant(self, :QUOTE)
108
-
109
- # SEQUEL5: Remove
110
- ARRAY_TYPES = {}
111
-
112
- # SEQUEL5: Remove
113
- def self.register(db_type, opts=OPTS, &block)
114
- Sequel::Deprecation.deprecate("Sequel::Postgres::PGArray.register", "Use Database#register_array_type on a Database instance using the pg_array extension") unless opts[:skip_deprecation_warning]
115
-
116
- db_type = db_type.to_s
117
- type = (opts[:type_symbol] || db_type).to_sym
118
- type_procs = opts[:type_procs] || PG__TYPES
119
- mod = opts[:typecast_methods_module] || DatabaseMethods
120
- typecast_method_map = opts[:typecast_method_map] || ARRAY_TYPES
121
-
122
- if converter = opts[:converter]
123
- raise Error, "can't provide both a block and :converter option to register" if block
124
- else
125
- converter = block
126
- end
127
-
128
- if soid = opts[:scalar_oid]
129
- raise Error, "can't provide both a converter and :scalar_oid option to register" if converter
130
- converter = type_procs[soid]
131
- end
132
-
133
- array_type = (opts[:array_type] || db_type).to_s.dup.freeze
134
- creator = Creator.new(array_type, converter)
135
-
136
- typecast_method_map[db_type] = :"#{type}_array"
137
-
138
- define_array_typecast_method(mod, type, creator, opts.fetch(:scalar_typecast, type))
139
-
140
- if oid = opts[:oid]
141
- if opts[:skip_deprecation_warning]
142
- def creator.call(s)
143
- Sequel::Deprecation.deprecate("Conversion proc for #{type}[] added globally by pg_array or other pg_* extension", "Load the appropriate pg_* extension(s) into the Database instance")
144
- super
145
- end
146
- end
147
- type_procs[oid] = creator
148
- end
149
-
150
- nil
151
- end
152
-
153
- # SEQUEL5: Remove
154
- def self.define_array_typecast_method(mod, type, creator, scalar_typecast)
155
- mod.class_eval do
156
- meth = :"typecast_value_#{type}_array"
157
- scalar_typecast_method = :"typecast_value_#{scalar_typecast}"
158
- define_method(meth){|v| typecast_value_pg_array(v, creator, scalar_typecast_method)}
159
- private meth
160
- end
161
- end
162
- private_class_method :define_array_typecast_method
163
-
164
81
  module DatabaseMethods
165
- APOS = "'".freeze
166
- Sequel::Deprecation.deprecate_constant(self, :APOS)
167
- DOUBLE_APOS = "''".freeze
168
- Sequel::Deprecation.deprecate_constant(self, :DOUBLE_APOS)
169
- ESCAPE_RE = /("|\\)/.freeze
170
- Sequel::Deprecation.deprecate_constant(self, :ESCAPE_RE)
171
- ESCAPE_REPLACEMENT = '\\\\\1'.freeze
172
- Sequel::Deprecation.deprecate_constant(self, :ESCAPE_REPLACEMENT)
173
-
174
82
  BLOB_RANGE = 1...-1
175
83
 
176
84
  # Create the local hash of database type strings to schema type symbols,
177
85
  # used for array types local to this database.
178
86
  def self.extended(db)
179
- db.instance_eval do
87
+ db.instance_exec do
180
88
  @pg_array_schema_types ||= {}
181
- procs = conversion_procs
182
- add_conversion_proc(1115, Creator.new("timestamp without time zone", procs[1114]))
183
- add_conversion_proc(1185, Creator.new("timestamp with time zone", procs[1184]))
89
+ register_array_type('timestamp without time zone', :oid=>1115, :scalar_oid=>1114, :type_symbol=>:datetime)
90
+ register_array_type('timestamp with time zone', :oid=>1185, :scalar_oid=>1184, :type_symbol=>:datetime_timezone, :scalar_typecast=>:datetime)
184
91
 
185
92
  register_array_type('text', :oid=>1009, :scalar_oid=>25, :type_symbol=>:string)
186
93
  register_array_type('integer', :oid=>1007, :scalar_oid=>23)
@@ -220,6 +127,15 @@ module Sequel
220
127
  end
221
128
  end
222
129
 
130
+ def add_named_conversion_proc(name, &block)
131
+ ret = super
132
+ name = name.to_s if name.is_a?(Symbol)
133
+ from(:pg_type).where(:typname=>name).select_map([:oid, :typarray]).each do |scalar_oid, array_oid|
134
+ register_array_type(name, :oid=>array_oid.to_i, :scalar_oid=>scalar_oid.to_i)
135
+ end
136
+ ret
137
+ end
138
+
223
139
  # Handle arrays in bound variables
224
140
  def bound_variable_arg(arg, conn)
225
141
  case arg
@@ -260,9 +176,6 @@ module Sequel
260
176
  #
261
177
  # If a block is given, it is treated as the :converter option.
262
178
  def register_array_type(db_type, opts=OPTS, &block)
263
- # Only for convert_named_procs_to_procs usage
264
- type_procs = opts[:type_procs] || conversion_procs # SEQUEL5: Remove
265
-
266
179
  oid = opts[:oid]
267
180
  soid = opts[:scalar_oid]
268
181
 
@@ -286,17 +199,16 @@ module Sequel
286
199
 
287
200
  if soid
288
201
  raise Error, "can't provide both a converter and :scalar_oid option to register" if has_converter
289
- converter = type_procs[soid] # SEQUEL5: conversion_procs[soid]
202
+ converter = conversion_procs[soid]
290
203
  end
291
204
 
292
205
  array_type = (opts[:array_type] || db_type).to_s.dup.freeze
293
206
  creator = Creator.new(array_type, converter)
294
- type_procs[oid] = creator # SEQUEL5: Remove
295
- #add_conversion_proc(oid, creator) # SEQUEL5
207
+ add_conversion_proc(oid, creator)
296
208
 
297
209
  typecast_method_map[db_type] = :"#{type}_array"
298
210
 
299
- (class << self; self end).class_eval do # singleton_class.class_eval do # SEQUEL5
211
+ singleton_class.class_eval do
300
212
  meth = :"typecast_value_#{type}_array"
301
213
  scalar_typecast_method = :"typecast_value_#{opts.fetch(:scalar_typecast, type)}"
302
214
  define_method(meth){|v| typecast_value_pg_array(v, creator, scalar_typecast_method)}
@@ -304,15 +216,9 @@ module Sequel
304
216
  end
305
217
 
306
218
  @schema_type_classes[:"#{type}_array"] = PGArray
307
- conversion_procs_updated # SEQUEL5: Remove
308
219
  nil
309
220
  end
310
221
 
311
- # SEQUEL5: Remove
312
- def schema_type_class(type)
313
- super || (ARRAY_TYPES.each_value{|v| return PGArray if type == v}; nil)
314
- end
315
-
316
222
  private
317
223
 
318
224
  # Format arrays used in bound variables.
@@ -331,32 +237,11 @@ module Sequel
331
237
  end
332
238
  end
333
239
 
334
- # Automatically handle array types for the given named types.
335
- def convert_named_procs_to_procs(named_procs)
336
- h = super
337
- unless h.empty?
338
- from(:pg_type).where(:oid=>h.keys).select_map([:typname, :oid, :typarray]).each do |name, scalar_oid, array_oid|
339
- register_array_type(name, :type_procs=>h, :oid=>array_oid.to_i, :scalar_oid=>scalar_oid.to_i)
340
- end
341
- end
342
- h
343
- end
344
-
345
- # SEQUEL5: Remove
346
- def get_conversion_procs
347
- procs = super
348
-
349
- procs[1115] = Creator.new("timestamp without time zone", procs[1114])
350
- procs[1185] = Creator.new("timestamp with time zone", procs[1184])
351
-
352
- procs
353
- end
354
-
355
240
  # Look into both the current database's array schema types and the global
356
241
  # array schema types to get the type symbol for the given database type
357
242
  # string.
358
243
  def pg_array_schema_type(type)
359
- @pg_array_schema_types[type] || ARRAY_TYPES[type] # SEQUEL5: Remove || ARRAY_TYPES[type]
244
+ @pg_array_schema_types[type]
360
245
  end
361
246
 
362
247
  # Make the column type detection handle registered array types.
@@ -408,15 +293,6 @@ module Sequel
408
293
  # Note that does not handle all forms out input that PostgreSQL will
409
294
  # accept, and it will not raise an error for all forms of invalid input.
410
295
  class Parser < StringScanner
411
- UNQUOTED_RE = /[{}",]|[^{}",]+/
412
- Sequel::Deprecation.deprecate_constant(self, :UNQUOTED_RE)
413
- QUOTED_RE = /["\\]|[^"\\]+/
414
- Sequel::Deprecation.deprecate_constant(self, :QUOTED_RE)
415
- NULL_RE = /NULL",/
416
- Sequel::Deprecation.deprecate_constant(self, :NULL_RE)
417
- OPEN_RE = /((\[\d+:\d+\])+=)?\{/
418
- Sequel::Deprecation.deprecate_constant(self, :OPEN_RE)
419
-
420
296
  # Set the source for the input, and any converter callable
421
297
  # to call with objects to be created. For nested parsers
422
298
  # the source may contain text after the end current parse,
@@ -425,8 +301,8 @@ module Sequel
425
301
  super(source)
426
302
  @converter = converter
427
303
  @stack = [[]]
428
- @recorded = new_entry_buffer
429
- #@encoding = string.encoding # SEQUEL5
304
+ @encoding = string.encoding
305
+ @recorded = String.new.force_encoding(@encoding)
430
306
  end
431
307
 
432
308
  # Take the buffer of recorded characters and add it to the array
@@ -440,7 +316,7 @@ module Sequel
440
316
  entry = @converter.call(entry)
441
317
  end
442
318
  @stack.last.push(entry)
443
- @recorded = new_entry_buffer
319
+ @recorded = String.new.force_encoding(@encoding)
444
320
  end
445
321
  end
446
322
 
@@ -499,21 +375,6 @@ module Sequel
499
375
 
500
376
  raise Sequel::Error, "array parsing finished with array unclosed"
501
377
  end
502
-
503
- private
504
-
505
- if RUBY_VERSION < '1.9.0'
506
- # :nocov:
507
- def new_entry_buffer
508
- String.new
509
- end
510
- # :nocov:
511
- else
512
- def new_entry_buffer
513
- String.new.force_encoding(string.encoding)
514
- #String.new.force_encoding(@encoding) # SEQUEL5
515
- end
516
- end
517
378
  end unless Sequel::Postgres.respond_to?(:parse_pg_array)
518
379
 
519
380
  # Callable object that takes the input string and parses it using Parser.
@@ -596,36 +457,6 @@ module Sequel
596
457
  end
597
458
  sql << ']'
598
459
  end
599
-
600
- # SEQUEL5: Remove
601
- register('text', :oid=>1009, :scalar_oid=>25, :type_symbol=>:string, :skip_deprecation_warning=>true)
602
- register('integer', :oid=>1007, :scalar_oid=>23, :skip_deprecation_warning=>true)
603
- register('bigint', :oid=>1016, :scalar_oid=>20, :scalar_typecast=>:integer, :skip_deprecation_warning=>true)
604
- register('numeric', :oid=>1231, :scalar_oid=>1700, :type_symbol=>:decimal, :skip_deprecation_warning=>true)
605
- register('double precision', :oid=>1022, :scalar_oid=>701, :type_symbol=>:float, :skip_deprecation_warning=>true)
606
- register('boolean', :oid=>1000, :scalar_oid=>16, :skip_deprecation_warning=>true)
607
- register('bytea', :oid=>1001, :scalar_oid=>17, :type_symbol=>:blob, :skip_deprecation_warning=>true)
608
- register('date', :oid=>1182, :scalar_oid=>1082, :skip_deprecation_warning=>true)
609
- register('time without time zone', :oid=>1183, :scalar_oid=>1083, :type_symbol=>:time, :skip_deprecation_warning=>true)
610
- register('timestamp without time zone', :oid=>1115, :scalar_oid=>1114, :type_symbol=>:datetime, :skip_deprecation_warning=>true)
611
- register('time with time zone', :oid=>1270, :scalar_oid=>1083, :type_symbol=>:time_timezone, :scalar_typecast=>:time, :skip_deprecation_warning=>true)
612
- register('timestamp with time zone', :oid=>1185, :scalar_oid=>1184, :type_symbol=>:datetime_timezone, :scalar_typecast=>:datetime, :skip_deprecation_warning=>true)
613
- register('smallint', :oid=>1005, :scalar_oid=>21, :scalar_typecast=>:integer, :skip_deprecation_warning=>true)
614
- register('oid', :oid=>1028, :scalar_oid=>26, :scalar_typecast=>:integer, :skip_deprecation_warning=>true)
615
- register('real', :oid=>1021, :scalar_oid=>700, :scalar_typecast=>:float, :skip_deprecation_warning=>true)
616
- register('character', :oid=>1014, :array_type=>:text, :scalar_typecast=>:string, :skip_deprecation_warning=>true)
617
- register('character varying', :oid=>1015, :scalar_typecast=>:string, :type_symbol=>:varchar, :skip_deprecation_warning=>true)
618
- register('xml', :oid=>143, :scalar_oid=>142, :skip_deprecation_warning=>true)
619
- register('money', :oid=>791, :scalar_oid=>790, :skip_deprecation_warning=>true)
620
- register('bit', :oid=>1561, :scalar_oid=>1560, :skip_deprecation_warning=>true)
621
- register('bit varying', :oid=>1563, :scalar_oid=>1562, :type_symbol=>:varbit, :skip_deprecation_warning=>true)
622
- register('uuid', :oid=>2951, :scalar_oid=>2950, :skip_deprecation_warning=>true)
623
- register('xid', :oid=>1011, :scalar_oid=>28, :skip_deprecation_warning=>true)
624
- register('cid', :oid=>1012, :scalar_oid=>29, :skip_deprecation_warning=>true)
625
- register('name', :oid=>1003, :scalar_oid=>19, :skip_deprecation_warning=>true)
626
- register('tid', :oid=>1010, :scalar_oid=>27, :skip_deprecation_warning=>true)
627
- register('int2vector', :oid=>1006, :scalar_oid=>22, :skip_deprecation_warning=>true)
628
- register('oidvector', :oid=>1013, :scalar_oid=>30, :skip_deprecation_warning=>true)
629
460
  end
630
461
  end
631
462
 
@@ -0,0 +1,230 @@
1
+ # frozen-string-literal: true
2
+ #
3
+ # The pg_extended_date_support extension allows support
4
+ # for BC dates/timestamps by default, and infinite
5
+ # dates/timestamps if configured. Without this extension,
6
+ # BC and infinite dates/timestamps will be handled incorrectly
7
+ # or raise an error. This behavior isn't the default because
8
+ # it can hurt performance, and few users need support for BC
9
+ # and infinite dates/timestamps.
10
+ #
11
+ # To load the extension into the database:
12
+ #
13
+ # DB.extension :pg_extended_date_support
14
+ #
15
+ # To enable support for infinite dates/timestamps:
16
+ #
17
+ # DB.convert_infinite_timestamps = 'string' # or 'nil' or 'float'
18
+ #
19
+ # Related module: Sequel::Postgres::ExtendedDateSupport
20
+
21
+ #
22
+ module Sequel
23
+ module Postgres
24
+ module ExtendedDateSupport
25
+ DATE_YEAR_1 = Date.new(1)
26
+ DATETIME_YEAR_1 = DateTime.new(1)
27
+ TIME_YEAR_1 = Time.at(-62135596800).utc
28
+ INFINITE_TIMESTAMP_STRINGS = ['infinity'.freeze, '-infinity'.freeze].freeze
29
+ INFINITE_DATETIME_VALUES = ([PLUS_INFINITY, MINUS_INFINITY] + INFINITE_TIMESTAMP_STRINGS).freeze
30
+ PLUS_DATE_INFINITY = Date::Infinity.new
31
+ MINUS_DATE_INFINITY = -PLUS_DATE_INFINITY
32
+
33
+ # Add dataset methods and update the conversion proces for dates and timestamps.
34
+ def self.extended(db)
35
+ db.extend_datasets(DatasetMethods)
36
+ procs = db.conversion_procs
37
+ procs[1082] = ::Sequel.method(:string_to_date)
38
+ procs[1184] = procs[1114] = db.method(:to_application_timestamp)
39
+ end
40
+
41
+ # Whether infinite timestamps/dates should be converted on retrieval. By default, no
42
+ # conversion is done, so an error is raised if you attempt to retrieve an infinite
43
+ # timestamp/date. You can set this to :nil to convert to nil, :string to leave
44
+ # as a string, or :float to convert to an infinite float.
45
+ attr_reader :convert_infinite_timestamps
46
+
47
+ # Set whether to allow infinite timestamps/dates. Make sure the
48
+ # conversion proc for date reflects that setting.
49
+ def convert_infinite_timestamps=(v)
50
+ @convert_infinite_timestamps = case v
51
+ when Symbol
52
+ v
53
+ when 'nil'
54
+ :nil
55
+ when 'string'
56
+ :string
57
+ when 'date'
58
+ :date
59
+ when 'float'
60
+ :float
61
+ when String, true
62
+ typecast_value_boolean(v)
63
+ else
64
+ false
65
+ end
66
+
67
+ pr = old_pr = Sequel.method(:string_to_date)
68
+ if @convert_infinite_timestamps
69
+ pr = lambda do |val|
70
+ case val
71
+ when *INFINITE_TIMESTAMP_STRINGS
72
+ infinite_timestamp_value(val)
73
+ else
74
+ old_pr.call(val)
75
+ end
76
+ end
77
+ end
78
+ add_conversion_proc(1082, pr)
79
+ end
80
+
81
+ # Handle BC dates in timestamps by moving the BC from after the time to
82
+ # after the date, to appease ruby's date parser.
83
+ # If convert_infinite_timestamps is true and the value is infinite, return an appropriate
84
+ # value based on the convert_infinite_timestamps setting.
85
+ def to_application_timestamp(value)
86
+ if value.is_a?(String) && (m = value.match(/(?:(?:[-+]\d\d:\d\d)(:\d\d)?)?( BC)?\z/)) && (m[1] || m[2])
87
+ if m[2]
88
+ value = value.sub(' BC', '').sub(' ', ' BC ')
89
+ end
90
+ if m[1]
91
+ dt = DateTime.parse(value)
92
+ dt = dt.to_time unless Sequel.datetime_class == DateTime
93
+ Sequel.convert_output_timestamp(dt, Sequel.application_timezone)
94
+ else
95
+ super(value)
96
+ end
97
+ elsif convert_infinite_timestamps
98
+ case value
99
+ when *INFINITE_TIMESTAMP_STRINGS
100
+ infinite_timestamp_value(value)
101
+ else
102
+ super
103
+ end
104
+ else
105
+ super
106
+ end
107
+ end
108
+
109
+ private
110
+
111
+ # Return an appropriate value for the given infinite timestamp string.
112
+ def infinite_timestamp_value(value)
113
+ case convert_infinite_timestamps
114
+ when :nil
115
+ nil
116
+ when :string
117
+ value
118
+ when :date
119
+ value == 'infinity' ? PLUS_DATE_INFINITY : MINUS_DATE_INFINITY
120
+ else
121
+ value == 'infinity' ? PLUS_INFINITY : MINUS_INFINITY
122
+ end
123
+ end
124
+
125
+ # If the value is an infinite value (either an infinite float or a string returned by
126
+ # by PostgreSQL for an infinite date), return it without converting it if
127
+ # convert_infinite_timestamps is set.
128
+ def typecast_value_date(value)
129
+ if convert_infinite_timestamps
130
+ case value
131
+ when *INFINITE_DATETIME_VALUES
132
+ value
133
+ else
134
+ super
135
+ end
136
+ else
137
+ super
138
+ end
139
+ end
140
+
141
+ # If the value is an infinite value (either an infinite float or a string returned by
142
+ # by PostgreSQL for an infinite timestamp), return it without converting it if
143
+ # convert_infinite_timestamps is set.
144
+ def typecast_value_datetime(value)
145
+ if convert_infinite_timestamps
146
+ case value
147
+ when *INFINITE_DATETIME_VALUES
148
+ value
149
+ else
150
+ super
151
+ end
152
+ else
153
+ super
154
+ end
155
+ end
156
+
157
+ module DatasetMethods
158
+ private
159
+
160
+ # Handle BC Date objects.
161
+ def literal_date(date)
162
+ if date < DATE_YEAR_1
163
+ date <<= ((date.year) * 24 - 12)
164
+ date.strftime("'%Y-%m-%d BC'")
165
+ else
166
+ super
167
+ end
168
+ end
169
+
170
+ # Handle BC DateTime objects.
171
+ def literal_datetime(date)
172
+ if date < DATETIME_YEAR_1
173
+ date <<= ((date.year) * 24 - 12)
174
+ date = db.from_application_timestamp(date)
175
+ minutes = (date.is_a?(DateTime) ? date.offset * 1440 : date.utc_offset/60).to_i
176
+ date.strftime("'%Y-%m-%d %H:%M:%S.%N#{format_timestamp_offset(*minutes.divmod(60))} BC'")
177
+ else
178
+ super
179
+ end
180
+ end
181
+
182
+ # Handle Date::Infinity values
183
+ def literal_other_append(sql, v)
184
+ if v.is_a?(Date::Infinity)
185
+ sql << (v > 0 ? "'infinity'" : "'-infinity'")
186
+ else
187
+ super
188
+ end
189
+ end
190
+
191
+ if RUBY_ENGINE == 'jruby'
192
+ # :nocov:
193
+
194
+ # Work around JRuby bug #4822 in Time#to_datetime for times before date of calendar reform
195
+ def literal_time(time)
196
+ if time < TIME_YEAR_1
197
+ literal_datetime(DateTime.parse(super))
198
+ else
199
+ super
200
+ end
201
+ end
202
+
203
+ ExtendedDateSupport::CONVERT_TYPES = [Java::JavaSQL::Types::DATE, Java::JavaSQL::Types::TIMESTAMP]
204
+
205
+ # Use non-JDBC parsing as JDBC parsing doesn't work for BC dates/timestamps.
206
+ def type_convertor(map, meta, type, i)
207
+ case type
208
+ when *CONVERT_TYPES
209
+ db.oid_convertor_proc(meta.getField(i).getOID)
210
+ else
211
+ super
212
+ end
213
+ end
214
+ # :nocov:
215
+ else
216
+ # Handle BC Time objects.
217
+ def literal_time(time)
218
+ if time < TIME_YEAR_1
219
+ literal_datetime(time.to_datetime)
220
+ else
221
+ super
222
+ end
223
+ end
224
+ end
225
+ end
226
+ end
227
+ end
228
+
229
+ Database.register_extension(:pg_extended_date_support, Postgres::ExtendedDateSupport)
230
+ end
@@ -30,7 +30,7 @@
30
30
  # Since the hstore type only supports strings, non string keys and
31
31
  # values are converted to strings
32
32
  #
33
- # Sequel.hstore(:foo=>1).to_hash # {'foo'=>'1'}
33
+ # Sequel.hstore(foo: 1).to_hash # {'foo'=>'1'}
34
34
  # v = Sequel.hstore({})
35
35
  # v[:foo] = 1
36
36
  # v # {'foo'=>'1'}
@@ -68,7 +68,7 @@
68
68
  #
69
69
  # If you want to insert a hash into an hstore database column:
70
70
  #
71
- # DB[:table].insert(:column=>Sequel.hstore('foo'=>'bar'))
71
+ # DB[:table].insert(column: Sequel.hstore('foo'=>'bar'))
72
72
  #
73
73
  # To use this extension, first load it into your Sequel::Database instance:
74
74
  #
@@ -91,21 +91,6 @@ module Sequel
91
91
 
92
92
  # Parser for PostgreSQL hstore output format.
93
93
  class Parser < StringScanner
94
- QUOTE_RE = /"/.freeze
95
- Sequel::Deprecation.deprecate_constant(self, :QUOTE_RE)
96
- KV_SEP_RE = /"\s*=>\s*/.freeze
97
- Sequel::Deprecation.deprecate_constant(self, :KV_SEP_RE)
98
- NULL_RE = /NULL/.freeze
99
- Sequel::Deprecation.deprecate_constant(self, :NULL_RE)
100
- SEP_RE = /,\s*/.freeze
101
- Sequel::Deprecation.deprecate_constant(self, :SEP_RE)
102
- QUOTED_RE = /(\\"|[^"])*/.freeze
103
- Sequel::Deprecation.deprecate_constant(self, :QUOTED_RE)
104
- REPLACE_RE = /\\(.)/.freeze
105
- Sequel::Deprecation.deprecate_constant(self, :REPLACE_RE)
106
- REPLACE_WITH = '\1'.freeze
107
- Sequel::Deprecation.deprecate_constant(self, :REPLACE_WITH)
108
-
109
94
  # Parse the output format that PostgreSQL uses for hstore
110
95
  # columns. Note that this does not attempt to parse all
111
96
  # input formats that PostgreSQL will accept. For instance,
@@ -144,7 +129,7 @@ module Sequel
144
129
 
145
130
  module DatabaseMethods
146
131
  def self.extended(db)
147
- db.instance_eval do
132
+ db.instance_exec do
148
133
  add_named_conversion_proc(:hstore, &HStore.method(:parse))
149
134
  @schema_type_classes[:hstore] = HStore
150
135
  end
@@ -162,13 +147,6 @@ module Sequel
162
147
  end
163
148
  end
164
149
 
165
- # SEQUEL5: Remove
166
- def reset_conversion_procs
167
- procs = super
168
- add_named_conversion_proc(:hstore, &HStore.method(:parse))
169
- procs
170
- end
171
-
172
150
  private
173
151
 
174
152
  # Recognize the hstore database type.
@@ -198,29 +176,12 @@ module Sequel
198
176
  # keys to strings during lookup.
199
177
  DEFAULT_PROC = lambda{|h, k| h[k.to_s] unless k.is_a?(String)}
200
178
 
201
- QUOTE = '"'.freeze
202
- Sequel::Deprecation.deprecate_constant(self, :QUOTE)
203
- COMMA = ",".freeze
204
- Sequel::Deprecation.deprecate_constant(self, :COMMA)
205
- KV_SEP = "=>".freeze
206
- Sequel::Deprecation.deprecate_constant(self, :KV_SEP)
207
- NULL = "NULL".freeze
208
- Sequel::Deprecation.deprecate_constant(self, :NULL)
209
- ESCAPE_RE = /("|\\)/.freeze
210
- Sequel::Deprecation.deprecate_constant(self, :ESCAPE_RE)
211
- ESCAPE_REPLACE = '\\\\\1'.freeze
212
- Sequel::Deprecation.deprecate_constant(self, :ESCAPE_REPLACE)
213
- HSTORE_CAST = '::hstore'.freeze
214
- Sequel::Deprecation.deprecate_constant(self, :HSTORE_CAST)
215
-
216
- if RUBY_VERSION >= '1.9'
217
- # Undef 1.9 marshal_{dump,load} methods in the delegate class,
218
- # so that ruby 1.9 uses the old style _dump/_load methods defined
219
- # in the delegate class, instead of the marshal_{dump,load} methods
220
- # in the Hash class.
221
- undef_method :marshal_load
222
- undef_method :marshal_dump
223
- end
179
+ # Undef marshal_{dump,load} methods in the delegate class,
180
+ # so that ruby uses the old style _dump/_load methods defined
181
+ # in the delegate class, instead of the marshal_{dump,load} methods
182
+ # in the Hash class.
183
+ undef_method :marshal_load
184
+ undef_method :marshal_dump
224
185
 
225
186
  # Use custom marshal loading, since underlying hash uses a default proc.
226
187
  def self._load(args)
@@ -234,12 +195,12 @@ module Sequel
234
195
  end
235
196
 
236
197
  # Override methods that accept key argument to convert to string.
237
- (%w'[] delete has_key? include? key? member?' + Array((%w'assoc' if RUBY_VERSION >= '1.9.0'))).each do |m|
198
+ %w'[] delete has_key? include? key? member? assoc'.each do |m|
238
199
  class_eval("def #{m}(k) super(k.to_s) end", __FILE__, __LINE__)
239
200
  end
240
201
 
241
202
  # Override methods that accept value argument to convert to string unless nil.
242
- (%w'has_value? value?' + Array((%w'key rassoc' if RUBY_VERSION >= '1.9.0'))).each do |m|
203
+ %w'has_value? value? key rassoc'.each do |m|
243
204
  class_eval("def #{m}(v) super(convert_value(v)) end", __FILE__, __LINE__)
244
205
  end
245
206
 
@@ -57,10 +57,10 @@
57
57
  # Here are a couple examples for updating an existing hstore column:
58
58
  #
59
59
  # # Add a key, or update an existing key with a new value
60
- # DB[:tab].update(:h=>Sequel.hstore_op(:h).concat('c'=>3))
60
+ # DB[:tab].update(h: Sequel.hstore_op(:h).concat('c'=>3))
61
61
  #
62
62
  # # Delete a key
63
- # DB[:tab].update(:h=>Sequel.hstore_op(:h).delete('k1'))
63
+ # DB[:tab].update(h: Sequel.hstore_op(:h).delete('k1'))
64
64
  #
65
65
  # See the PostgreSQL hstore function and operator documentation for more
66
66
  # details on what these functions and operators do.