sequel 4.26.0 → 5.37.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 (692) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +405 -5656
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +232 -157
  5. data/bin/sequel +32 -9
  6. data/doc/advanced_associations.rdoc +252 -188
  7. data/doc/association_basics.rdoc +231 -273
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +75 -48
  10. data/doc/code_order.rdoc +28 -10
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +74 -31
  16. data/doc/migration.rdoc +72 -46
  17. data/doc/model_dataset_method_design.rdoc +129 -0
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +12 -12
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +59 -69
  22. data/doc/opening_databases.rdoc +84 -94
  23. data/doc/postgresql.rdoc +268 -38
  24. data/doc/prepared_statements.rdoc +29 -24
  25. data/doc/querying.rdoc +184 -164
  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.10.0.txt +84 -0
  30. data/doc/release_notes/5.11.0.txt +83 -0
  31. data/doc/release_notes/5.12.0.txt +141 -0
  32. data/doc/release_notes/5.13.0.txt +27 -0
  33. data/doc/release_notes/5.14.0.txt +63 -0
  34. data/doc/release_notes/5.15.0.txt +39 -0
  35. data/doc/release_notes/5.16.0.txt +110 -0
  36. data/doc/release_notes/5.17.0.txt +31 -0
  37. data/doc/release_notes/5.18.0.txt +69 -0
  38. data/doc/release_notes/5.19.0.txt +28 -0
  39. data/doc/release_notes/5.2.0.txt +33 -0
  40. data/doc/release_notes/5.20.0.txt +89 -0
  41. data/doc/release_notes/5.21.0.txt +87 -0
  42. data/doc/release_notes/5.22.0.txt +48 -0
  43. data/doc/release_notes/5.23.0.txt +56 -0
  44. data/doc/release_notes/5.24.0.txt +56 -0
  45. data/doc/release_notes/5.25.0.txt +32 -0
  46. data/doc/release_notes/5.26.0.txt +35 -0
  47. data/doc/release_notes/5.27.0.txt +21 -0
  48. data/doc/release_notes/5.28.0.txt +16 -0
  49. data/doc/release_notes/5.29.0.txt +22 -0
  50. data/doc/release_notes/5.3.0.txt +121 -0
  51. data/doc/release_notes/5.30.0.txt +20 -0
  52. data/doc/release_notes/5.31.0.txt +148 -0
  53. data/doc/release_notes/5.32.0.txt +46 -0
  54. data/doc/release_notes/5.33.0.txt +24 -0
  55. data/doc/release_notes/5.34.0.txt +40 -0
  56. data/doc/release_notes/5.35.0.txt +56 -0
  57. data/doc/release_notes/5.36.0.txt +60 -0
  58. data/doc/release_notes/5.37.0.txt +30 -0
  59. data/doc/release_notes/5.4.0.txt +80 -0
  60. data/doc/release_notes/5.5.0.txt +61 -0
  61. data/doc/release_notes/5.6.0.txt +31 -0
  62. data/doc/release_notes/5.7.0.txt +108 -0
  63. data/doc/release_notes/5.8.0.txt +170 -0
  64. data/doc/release_notes/5.9.0.txt +99 -0
  65. data/doc/schema_modification.rdoc +102 -77
  66. data/doc/security.rdoc +160 -87
  67. data/doc/sharding.rdoc +74 -47
  68. data/doc/sql.rdoc +135 -122
  69. data/doc/testing.rdoc +34 -18
  70. data/doc/thread_safety.rdoc +2 -4
  71. data/doc/transactions.rdoc +101 -19
  72. data/doc/validations.rdoc +64 -51
  73. data/doc/virtual_rows.rdoc +90 -109
  74. data/lib/sequel.rb +3 -1
  75. data/lib/sequel/adapters/ado.rb +154 -22
  76. data/lib/sequel/adapters/ado/access.rb +21 -21
  77. data/lib/sequel/adapters/ado/mssql.rb +8 -15
  78. data/lib/sequel/adapters/amalgalite.rb +17 -25
  79. data/lib/sequel/adapters/ibmdb.rb +52 -58
  80. data/lib/sequel/adapters/jdbc.rb +149 -127
  81. data/lib/sequel/adapters/jdbc/db2.rb +32 -40
  82. data/lib/sequel/adapters/jdbc/derby.rb +56 -58
  83. data/lib/sequel/adapters/jdbc/h2.rb +40 -30
  84. data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
  85. data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
  86. data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
  87. data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
  88. data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
  89. data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
  90. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
  91. data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
  92. data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
  93. data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
  94. data/lib/sequel/adapters/mock.rb +104 -113
  95. data/lib/sequel/adapters/mysql.rb +42 -61
  96. data/lib/sequel/adapters/mysql2.rb +126 -35
  97. data/lib/sequel/adapters/odbc.rb +21 -28
  98. data/lib/sequel/adapters/odbc/db2.rb +3 -1
  99. data/lib/sequel/adapters/odbc/mssql.rb +11 -15
  100. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  101. data/lib/sequel/adapters/oracle.rb +62 -68
  102. data/lib/sequel/adapters/postgres.rb +257 -311
  103. data/lib/sequel/adapters/postgresql.rb +3 -1
  104. data/lib/sequel/adapters/shared/access.rb +75 -79
  105. data/lib/sequel/adapters/shared/db2.rb +96 -74
  106. data/lib/sequel/adapters/shared/mssql.rb +258 -213
  107. data/lib/sequel/adapters/shared/mysql.rb +284 -216
  108. data/lib/sequel/adapters/shared/oracle.rb +175 -60
  109. data/lib/sequel/adapters/shared/postgres.rb +829 -383
  110. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
  111. data/lib/sequel/adapters/shared/sqlite.rb +382 -159
  112. data/lib/sequel/adapters/sqlanywhere.rb +53 -38
  113. data/lib/sequel/adapters/sqlite.rb +111 -105
  114. data/lib/sequel/adapters/tinytds.rb +38 -46
  115. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
  116. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
  117. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  118. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  119. data/lib/sequel/adapters/utils/replace.rb +3 -4
  120. data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
  121. data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
  122. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  123. data/lib/sequel/ast_transformer.rb +13 -89
  124. data/lib/sequel/connection_pool.rb +54 -26
  125. data/lib/sequel/connection_pool/sharded_single.rb +19 -12
  126. data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
  127. data/lib/sequel/connection_pool/single.rb +21 -12
  128. data/lib/sequel/connection_pool/threaded.rb +137 -119
  129. data/lib/sequel/core.rb +352 -320
  130. data/lib/sequel/database.rb +19 -2
  131. data/lib/sequel/database/connecting.rb +70 -55
  132. data/lib/sequel/database/dataset.rb +15 -5
  133. data/lib/sequel/database/dataset_defaults.rb +20 -102
  134. data/lib/sequel/database/features.rb +20 -4
  135. data/lib/sequel/database/logging.rb +25 -7
  136. data/lib/sequel/database/misc.rb +132 -118
  137. data/lib/sequel/database/query.rb +51 -28
  138. data/lib/sequel/database/schema_generator.rb +188 -75
  139. data/lib/sequel/database/schema_methods.rb +161 -92
  140. data/lib/sequel/database/transactions.rb +260 -58
  141. data/lib/sequel/dataset.rb +28 -12
  142. data/lib/sequel/dataset/actions.rb +354 -170
  143. data/lib/sequel/dataset/dataset_module.rb +46 -0
  144. data/lib/sequel/dataset/features.rb +81 -34
  145. data/lib/sequel/dataset/graph.rb +82 -58
  146. data/lib/sequel/dataset/misc.rb +139 -47
  147. data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
  148. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  149. data/lib/sequel/dataset/query.rb +428 -214
  150. data/lib/sequel/dataset/sql.rb +446 -339
  151. data/lib/sequel/deprecated.rb +14 -2
  152. data/lib/sequel/exceptions.rb +48 -16
  153. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  154. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  155. data/lib/sequel/extensions/_pretty_table.rb +10 -9
  156. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  157. data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
  158. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  159. data/lib/sequel/extensions/blank.rb +2 -0
  160. data/lib/sequel/extensions/caller_logging.rb +79 -0
  161. data/lib/sequel/extensions/columns_introspection.rb +9 -4
  162. data/lib/sequel/extensions/connection_expiration.rb +99 -0
  163. data/lib/sequel/extensions/connection_validator.rb +26 -13
  164. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  165. data/lib/sequel/extensions/constraint_validations.rb +93 -38
  166. data/lib/sequel/extensions/core_extensions.rb +45 -53
  167. data/lib/sequel/extensions/core_refinements.rb +44 -46
  168. data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
  169. data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
  170. data/lib/sequel/extensions/date_arithmetic.rb +42 -16
  171. data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
  172. data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
  173. data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
  174. data/lib/sequel/extensions/error_sql.rb +7 -3
  175. data/lib/sequel/extensions/escaped_like.rb +100 -0
  176. data/lib/sequel/extensions/eval_inspect.rb +14 -15
  177. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  178. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  179. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  180. data/lib/sequel/extensions/from_block.rb +2 -31
  181. data/lib/sequel/extensions/graph_each.rb +19 -6
  182. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  183. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  184. data/lib/sequel/extensions/index_caching.rb +109 -0
  185. data/lib/sequel/extensions/inflector.rb +8 -4
  186. data/lib/sequel/extensions/integer64.rb +32 -0
  187. data/lib/sequel/extensions/looser_typecasting.rb +19 -9
  188. data/lib/sequel/extensions/migration.rb +132 -80
  189. data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
  190. data/lib/sequel/extensions/named_timezones.rb +88 -23
  191. data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
  192. data/lib/sequel/extensions/null_dataset.rb +12 -8
  193. data/lib/sequel/extensions/pagination.rb +35 -28
  194. data/lib/sequel/extensions/pg_array.rb +227 -316
  195. data/lib/sequel/extensions/pg_array_ops.rb +19 -7
  196. data/lib/sequel/extensions/pg_enum.rb +69 -24
  197. data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
  198. data/lib/sequel/extensions/pg_hstore.rb +50 -59
  199. data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
  200. data/lib/sequel/extensions/pg_inet.rb +34 -15
  201. data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
  202. data/lib/sequel/extensions/pg_interval.rb +26 -26
  203. data/lib/sequel/extensions/pg_json.rb +422 -141
  204. data/lib/sequel/extensions/pg_json_ops.rb +248 -9
  205. data/lib/sequel/extensions/pg_loose_count.rb +5 -1
  206. data/lib/sequel/extensions/pg_range.rb +162 -146
  207. data/lib/sequel/extensions/pg_range_ops.rb +10 -5
  208. data/lib/sequel/extensions/pg_row.rb +53 -87
  209. data/lib/sequel/extensions/pg_row_ops.rb +36 -13
  210. data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
  211. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  212. data/lib/sequel/extensions/pretty_table.rb +4 -0
  213. data/lib/sequel/extensions/query.rb +12 -7
  214. data/lib/sequel/extensions/round_timestamps.rb +6 -9
  215. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  216. data/lib/sequel/extensions/s.rb +59 -0
  217. data/lib/sequel/extensions/schema_caching.rb +14 -1
  218. data/lib/sequel/extensions/schema_dumper.rb +83 -55
  219. data/lib/sequel/extensions/select_remove.rb +8 -4
  220. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  221. data/lib/sequel/extensions/server_block.rb +50 -17
  222. data/lib/sequel/extensions/server_logging.rb +61 -0
  223. data/lib/sequel/extensions/split_array_nil.rb +8 -4
  224. data/lib/sequel/extensions/sql_comments.rb +96 -0
  225. data/lib/sequel/extensions/sql_expr.rb +4 -1
  226. data/lib/sequel/extensions/string_agg.rb +181 -0
  227. data/lib/sequel/extensions/string_date_time.rb +2 -0
  228. data/lib/sequel/extensions/symbol_aref.rb +53 -0
  229. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  230. data/lib/sequel/extensions/symbol_as.rb +23 -0
  231. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  232. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  233. data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
  234. data/lib/sequel/extensions/to_dot.rb +15 -5
  235. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  236. data/lib/sequel/model.rb +36 -126
  237. data/lib/sequel/model/associations.rb +850 -257
  238. data/lib/sequel/model/base.rb +652 -764
  239. data/lib/sequel/model/dataset_module.rb +13 -10
  240. data/lib/sequel/model/default_inflections.rb +3 -1
  241. data/lib/sequel/model/errors.rb +3 -3
  242. data/lib/sequel/model/exceptions.rb +12 -12
  243. data/lib/sequel/model/inflections.rb +8 -19
  244. data/lib/sequel/model/plugins.rb +111 -0
  245. data/lib/sequel/plugins/accessed_columns.rb +2 -0
  246. data/lib/sequel/plugins/active_model.rb +32 -7
  247. data/lib/sequel/plugins/after_initialize.rb +3 -1
  248. data/lib/sequel/plugins/association_dependencies.rb +27 -18
  249. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  250. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  251. data/lib/sequel/plugins/association_pks.rb +181 -83
  252. data/lib/sequel/plugins/association_proxies.rb +33 -9
  253. data/lib/sequel/plugins/auto_validations.rb +58 -23
  254. data/lib/sequel/plugins/before_after_save.rb +8 -0
  255. data/lib/sequel/plugins/blacklist_security.rb +23 -12
  256. data/lib/sequel/plugins/boolean_readers.rb +9 -6
  257. data/lib/sequel/plugins/boolean_subsets.rb +64 -0
  258. data/lib/sequel/plugins/caching.rb +27 -16
  259. data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
  260. data/lib/sequel/plugins/column_conflicts.rb +18 -3
  261. data/lib/sequel/plugins/column_select.rb +9 -5
  262. data/lib/sequel/plugins/columns_updated.rb +42 -0
  263. data/lib/sequel/plugins/composition.rb +36 -24
  264. data/lib/sequel/plugins/constraint_validations.rb +37 -16
  265. data/lib/sequel/plugins/csv_serializer.rb +58 -35
  266. data/lib/sequel/plugins/dataset_associations.rb +60 -18
  267. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  268. data/lib/sequel/plugins/defaults_setter.rb +74 -13
  269. data/lib/sequel/plugins/delay_add_association.rb +4 -1
  270. data/lib/sequel/plugins/dirty.rb +65 -24
  271. data/lib/sequel/plugins/eager_each.rb +27 -3
  272. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  273. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  274. data/lib/sequel/plugins/error_splitter.rb +19 -12
  275. data/lib/sequel/plugins/finder.rb +246 -0
  276. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  277. data/lib/sequel/plugins/force_encoding.rb +9 -12
  278. data/lib/sequel/plugins/hook_class_methods.rb +39 -54
  279. data/lib/sequel/plugins/input_transformer.rb +20 -10
  280. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  281. data/lib/sequel/plugins/insert_returning_select.rb +4 -2
  282. data/lib/sequel/plugins/instance_filters.rb +12 -8
  283. data/lib/sequel/plugins/instance_hooks.rb +36 -17
  284. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  285. data/lib/sequel/plugins/inverted_subsets.rb +24 -13
  286. data/lib/sequel/plugins/json_serializer.rb +123 -47
  287. data/lib/sequel/plugins/lazy_attributes.rb +20 -14
  288. data/lib/sequel/plugins/list.rb +40 -26
  289. data/lib/sequel/plugins/many_through_many.rb +28 -12
  290. data/lib/sequel/plugins/modification_detection.rb +17 -5
  291. data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
  292. data/lib/sequel/plugins/nested_attributes.rb +55 -28
  293. data/lib/sequel/plugins/optimistic_locking.rb +5 -3
  294. data/lib/sequel/plugins/pg_array_associations.rb +52 -18
  295. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
  296. data/lib/sequel/plugins/pg_row.rb +7 -51
  297. data/lib/sequel/plugins/prepared_statements.rb +53 -72
  298. data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
  299. data/lib/sequel/plugins/rcte_tree.rb +43 -63
  300. data/lib/sequel/plugins/serialization.rb +37 -44
  301. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
  302. data/lib/sequel/plugins/sharding.rb +17 -10
  303. data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
  304. data/lib/sequel/plugins/singular_table_names.rb +2 -0
  305. data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
  306. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  307. data/lib/sequel/plugins/split_values.rb +13 -6
  308. data/lib/sequel/plugins/static_cache.rb +79 -53
  309. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  310. data/lib/sequel/plugins/string_stripper.rb +5 -3
  311. data/lib/sequel/plugins/subclasses.rb +20 -2
  312. data/lib/sequel/plugins/subset_conditions.rb +48 -0
  313. data/lib/sequel/plugins/table_select.rb +4 -2
  314. data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
  315. data/lib/sequel/plugins/throw_failures.rb +110 -0
  316. data/lib/sequel/plugins/timestamps.rb +22 -8
  317. data/lib/sequel/plugins/touch.rb +21 -8
  318. data/lib/sequel/plugins/tree.rb +57 -30
  319. data/lib/sequel/plugins/typecast_on_load.rb +14 -4
  320. data/lib/sequel/plugins/unlimited_update.rb +3 -7
  321. data/lib/sequel/plugins/update_or_create.rb +6 -4
  322. data/lib/sequel/plugins/update_primary_key.rb +3 -1
  323. data/lib/sequel/plugins/update_refresh.rb +28 -15
  324. data/lib/sequel/plugins/uuid.rb +70 -0
  325. data/lib/sequel/plugins/validate_associated.rb +20 -0
  326. data/lib/sequel/plugins/validation_class_methods.rb +40 -19
  327. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  328. data/lib/sequel/plugins/validation_helpers.rb +49 -31
  329. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  330. data/lib/sequel/plugins/xml_serializer.rb +31 -30
  331. data/lib/sequel/sql.rb +479 -329
  332. data/lib/sequel/timezones.rb +62 -32
  333. data/lib/sequel/version.rb +10 -3
  334. metadata +177 -477
  335. data/Rakefile +0 -165
  336. data/doc/active_record.rdoc +0 -912
  337. data/doc/release_notes/1.0.txt +0 -38
  338. data/doc/release_notes/1.1.txt +0 -143
  339. data/doc/release_notes/1.3.txt +0 -101
  340. data/doc/release_notes/1.4.0.txt +0 -53
  341. data/doc/release_notes/1.5.0.txt +0 -155
  342. data/doc/release_notes/2.0.0.txt +0 -298
  343. data/doc/release_notes/2.1.0.txt +0 -271
  344. data/doc/release_notes/2.10.0.txt +0 -328
  345. data/doc/release_notes/2.11.0.txt +0 -215
  346. data/doc/release_notes/2.12.0.txt +0 -534
  347. data/doc/release_notes/2.2.0.txt +0 -253
  348. data/doc/release_notes/2.3.0.txt +0 -88
  349. data/doc/release_notes/2.4.0.txt +0 -106
  350. data/doc/release_notes/2.5.0.txt +0 -137
  351. data/doc/release_notes/2.6.0.txt +0 -157
  352. data/doc/release_notes/2.7.0.txt +0 -166
  353. data/doc/release_notes/2.8.0.txt +0 -171
  354. data/doc/release_notes/2.9.0.txt +0 -97
  355. data/doc/release_notes/3.0.0.txt +0 -221
  356. data/doc/release_notes/3.1.0.txt +0 -406
  357. data/doc/release_notes/3.10.0.txt +0 -286
  358. data/doc/release_notes/3.11.0.txt +0 -254
  359. data/doc/release_notes/3.12.0.txt +0 -304
  360. data/doc/release_notes/3.13.0.txt +0 -210
  361. data/doc/release_notes/3.14.0.txt +0 -118
  362. data/doc/release_notes/3.15.0.txt +0 -78
  363. data/doc/release_notes/3.16.0.txt +0 -45
  364. data/doc/release_notes/3.17.0.txt +0 -58
  365. data/doc/release_notes/3.18.0.txt +0 -120
  366. data/doc/release_notes/3.19.0.txt +0 -67
  367. data/doc/release_notes/3.2.0.txt +0 -268
  368. data/doc/release_notes/3.20.0.txt +0 -41
  369. data/doc/release_notes/3.21.0.txt +0 -87
  370. data/doc/release_notes/3.22.0.txt +0 -39
  371. data/doc/release_notes/3.23.0.txt +0 -172
  372. data/doc/release_notes/3.24.0.txt +0 -420
  373. data/doc/release_notes/3.25.0.txt +0 -88
  374. data/doc/release_notes/3.26.0.txt +0 -88
  375. data/doc/release_notes/3.27.0.txt +0 -82
  376. data/doc/release_notes/3.28.0.txt +0 -304
  377. data/doc/release_notes/3.29.0.txt +0 -459
  378. data/doc/release_notes/3.3.0.txt +0 -192
  379. data/doc/release_notes/3.30.0.txt +0 -135
  380. data/doc/release_notes/3.31.0.txt +0 -146
  381. data/doc/release_notes/3.32.0.txt +0 -202
  382. data/doc/release_notes/3.33.0.txt +0 -157
  383. data/doc/release_notes/3.34.0.txt +0 -671
  384. data/doc/release_notes/3.35.0.txt +0 -144
  385. data/doc/release_notes/3.36.0.txt +0 -245
  386. data/doc/release_notes/3.37.0.txt +0 -338
  387. data/doc/release_notes/3.38.0.txt +0 -234
  388. data/doc/release_notes/3.39.0.txt +0 -237
  389. data/doc/release_notes/3.4.0.txt +0 -325
  390. data/doc/release_notes/3.40.0.txt +0 -73
  391. data/doc/release_notes/3.41.0.txt +0 -155
  392. data/doc/release_notes/3.42.0.txt +0 -74
  393. data/doc/release_notes/3.43.0.txt +0 -105
  394. data/doc/release_notes/3.44.0.txt +0 -152
  395. data/doc/release_notes/3.45.0.txt +0 -179
  396. data/doc/release_notes/3.46.0.txt +0 -122
  397. data/doc/release_notes/3.47.0.txt +0 -270
  398. data/doc/release_notes/3.48.0.txt +0 -477
  399. data/doc/release_notes/3.5.0.txt +0 -510
  400. data/doc/release_notes/3.6.0.txt +0 -366
  401. data/doc/release_notes/3.7.0.txt +0 -179
  402. data/doc/release_notes/3.8.0.txt +0 -151
  403. data/doc/release_notes/3.9.0.txt +0 -233
  404. data/doc/release_notes/4.0.0.txt +0 -262
  405. data/doc/release_notes/4.1.0.txt +0 -85
  406. data/doc/release_notes/4.10.0.txt +0 -226
  407. data/doc/release_notes/4.11.0.txt +0 -147
  408. data/doc/release_notes/4.12.0.txt +0 -105
  409. data/doc/release_notes/4.13.0.txt +0 -169
  410. data/doc/release_notes/4.14.0.txt +0 -68
  411. data/doc/release_notes/4.15.0.txt +0 -56
  412. data/doc/release_notes/4.16.0.txt +0 -36
  413. data/doc/release_notes/4.17.0.txt +0 -38
  414. data/doc/release_notes/4.18.0.txt +0 -36
  415. data/doc/release_notes/4.19.0.txt +0 -45
  416. data/doc/release_notes/4.2.0.txt +0 -129
  417. data/doc/release_notes/4.20.0.txt +0 -79
  418. data/doc/release_notes/4.21.0.txt +0 -94
  419. data/doc/release_notes/4.22.0.txt +0 -72
  420. data/doc/release_notes/4.23.0.txt +0 -65
  421. data/doc/release_notes/4.24.0.txt +0 -99
  422. data/doc/release_notes/4.25.0.txt +0 -181
  423. data/doc/release_notes/4.26.0.txt +0 -44
  424. data/doc/release_notes/4.3.0.txt +0 -40
  425. data/doc/release_notes/4.4.0.txt +0 -92
  426. data/doc/release_notes/4.5.0.txt +0 -34
  427. data/doc/release_notes/4.6.0.txt +0 -30
  428. data/doc/release_notes/4.7.0.txt +0 -103
  429. data/doc/release_notes/4.8.0.txt +0 -175
  430. data/doc/release_notes/4.9.0.txt +0 -190
  431. data/lib/sequel/adapters/cubrid.rb +0 -142
  432. data/lib/sequel/adapters/do.rb +0 -156
  433. data/lib/sequel/adapters/do/mysql.rb +0 -64
  434. data/lib/sequel/adapters/do/postgres.rb +0 -42
  435. data/lib/sequel/adapters/do/sqlite3.rb +0 -40
  436. data/lib/sequel/adapters/jdbc/as400.rb +0 -82
  437. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
  438. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
  439. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
  440. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
  441. data/lib/sequel/adapters/odbc/progress.rb +0 -8
  442. data/lib/sequel/adapters/shared/cubrid.rb +0 -243
  443. data/lib/sequel/adapters/shared/firebird.rb +0 -245
  444. data/lib/sequel/adapters/shared/informix.rb +0 -52
  445. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
  446. data/lib/sequel/adapters/shared/progress.rb +0 -38
  447. data/lib/sequel/adapters/swift.rb +0 -158
  448. data/lib/sequel/adapters/swift/mysql.rb +0 -47
  449. data/lib/sequel/adapters/swift/postgres.rb +0 -45
  450. data/lib/sequel/adapters/swift/sqlite.rb +0 -47
  451. data/lib/sequel/adapters/utils/pg_types.rb +0 -68
  452. data/lib/sequel/dataset/mutation.rb +0 -109
  453. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
  454. data/lib/sequel/extensions/filter_having.rb +0 -59
  455. data/lib/sequel/extensions/hash_aliases.rb +0 -45
  456. data/lib/sequel/extensions/meta_def.rb +0 -31
  457. data/lib/sequel/extensions/query_literals.rb +0 -80
  458. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
  459. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
  460. data/lib/sequel/extensions/set_overrides.rb +0 -72
  461. data/lib/sequel/no_core_ext.rb +0 -1
  462. data/lib/sequel/plugins/association_autoreloading.rb +0 -7
  463. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
  464. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
  465. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
  466. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
  467. data/lib/sequel/plugins/schema.rb +0 -80
  468. data/lib/sequel/plugins/scissors.rb +0 -33
  469. data/spec/adapters/db2_spec.rb +0 -160
  470. data/spec/adapters/firebird_spec.rb +0 -411
  471. data/spec/adapters/informix_spec.rb +0 -100
  472. data/spec/adapters/mssql_spec.rb +0 -706
  473. data/spec/adapters/mysql_spec.rb +0 -1287
  474. data/spec/adapters/oracle_spec.rb +0 -313
  475. data/spec/adapters/postgres_spec.rb +0 -3725
  476. data/spec/adapters/spec_helper.rb +0 -43
  477. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  478. data/spec/adapters/sqlite_spec.rb +0 -653
  479. data/spec/bin_spec.rb +0 -254
  480. data/spec/core/connection_pool_spec.rb +0 -1016
  481. data/spec/core/database_spec.rb +0 -2531
  482. data/spec/core/dataset_spec.rb +0 -5098
  483. data/spec/core/deprecated_spec.rb +0 -70
  484. data/spec/core/expression_filters_spec.rb +0 -1243
  485. data/spec/core/mock_adapter_spec.rb +0 -462
  486. data/spec/core/object_graph_spec.rb +0 -303
  487. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  488. data/spec/core/schema_generator_spec.rb +0 -179
  489. data/spec/core/schema_spec.rb +0 -1659
  490. data/spec/core/spec_helper.rb +0 -34
  491. data/spec/core/version_spec.rb +0 -7
  492. data/spec/core_extensions_spec.rb +0 -699
  493. data/spec/extensions/accessed_columns_spec.rb +0 -51
  494. data/spec/extensions/active_model_spec.rb +0 -123
  495. data/spec/extensions/after_initialize_spec.rb +0 -24
  496. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  497. data/spec/extensions/association_dependencies_spec.rb +0 -117
  498. data/spec/extensions/association_pks_spec.rb +0 -365
  499. data/spec/extensions/association_proxies_spec.rb +0 -86
  500. data/spec/extensions/auto_validations_spec.rb +0 -192
  501. data/spec/extensions/blacklist_security_spec.rb +0 -88
  502. data/spec/extensions/blank_spec.rb +0 -69
  503. data/spec/extensions/boolean_readers_spec.rb +0 -93
  504. data/spec/extensions/caching_spec.rb +0 -270
  505. data/spec/extensions/class_table_inheritance_spec.rb +0 -420
  506. data/spec/extensions/column_conflicts_spec.rb +0 -60
  507. data/spec/extensions/column_select_spec.rb +0 -108
  508. data/spec/extensions/columns_introspection_spec.rb +0 -91
  509. data/spec/extensions/composition_spec.rb +0 -242
  510. data/spec/extensions/connection_validator_spec.rb +0 -120
  511. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
  512. data/spec/extensions/constraint_validations_spec.rb +0 -325
  513. data/spec/extensions/core_refinements_spec.rb +0 -519
  514. data/spec/extensions/csv_serializer_spec.rb +0 -173
  515. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  516. data/spec/extensions/dataset_associations_spec.rb +0 -311
  517. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  518. data/spec/extensions/date_arithmetic_spec.rb +0 -150
  519. data/spec/extensions/defaults_setter_spec.rb +0 -101
  520. data/spec/extensions/delay_add_association_spec.rb +0 -52
  521. data/spec/extensions/dirty_spec.rb +0 -180
  522. data/spec/extensions/eager_each_spec.rb +0 -42
  523. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  524. data/spec/extensions/error_splitter_spec.rb +0 -18
  525. data/spec/extensions/error_sql_spec.rb +0 -20
  526. data/spec/extensions/eval_inspect_spec.rb +0 -73
  527. data/spec/extensions/filter_having_spec.rb +0 -40
  528. data/spec/extensions/force_encoding_spec.rb +0 -114
  529. data/spec/extensions/from_block_spec.rb +0 -21
  530. data/spec/extensions/graph_each_spec.rb +0 -109
  531. data/spec/extensions/hash_aliases_spec.rb +0 -24
  532. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  533. data/spec/extensions/inflector_spec.rb +0 -183
  534. data/spec/extensions/input_transformer_spec.rb +0 -54
  535. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  536. data/spec/extensions/instance_filters_spec.rb +0 -79
  537. data/spec/extensions/instance_hooks_spec.rb +0 -276
  538. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  539. data/spec/extensions/json_serializer_spec.rb +0 -291
  540. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  541. data/spec/extensions/list_spec.rb +0 -267
  542. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  543. data/spec/extensions/many_through_many_spec.rb +0 -2172
  544. data/spec/extensions/meta_def_spec.rb +0 -21
  545. data/spec/extensions/migration_spec.rb +0 -712
  546. data/spec/extensions/modification_detection_spec.rb +0 -80
  547. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  548. data/spec/extensions/named_timezones_spec.rb +0 -108
  549. data/spec/extensions/nested_attributes_spec.rb +0 -697
  550. data/spec/extensions/null_dataset_spec.rb +0 -85
  551. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  552. data/spec/extensions/pagination_spec.rb +0 -118
  553. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  554. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  555. data/spec/extensions/pg_array_spec.rb +0 -395
  556. data/spec/extensions/pg_enum_spec.rb +0 -92
  557. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  558. data/spec/extensions/pg_hstore_spec.rb +0 -206
  559. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  560. data/spec/extensions/pg_inet_spec.rb +0 -52
  561. data/spec/extensions/pg_interval_spec.rb +0 -76
  562. data/spec/extensions/pg_json_ops_spec.rb +0 -229
  563. data/spec/extensions/pg_json_spec.rb +0 -218
  564. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  565. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  566. data/spec/extensions/pg_range_spec.rb +0 -404
  567. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  568. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  569. data/spec/extensions/pg_row_spec.rb +0 -360
  570. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  571. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  572. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  573. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  574. data/spec/extensions/prepared_statements_spec.rb +0 -103
  575. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  576. data/spec/extensions/pretty_table_spec.rb +0 -92
  577. data/spec/extensions/query_literals_spec.rb +0 -183
  578. data/spec/extensions/query_spec.rb +0 -102
  579. data/spec/extensions/rcte_tree_spec.rb +0 -392
  580. data/spec/extensions/round_timestamps_spec.rb +0 -43
  581. data/spec/extensions/schema_caching_spec.rb +0 -41
  582. data/spec/extensions/schema_dumper_spec.rb +0 -789
  583. data/spec/extensions/schema_spec.rb +0 -117
  584. data/spec/extensions/scissors_spec.rb +0 -26
  585. data/spec/extensions/select_remove_spec.rb +0 -38
  586. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  587. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  588. data/spec/extensions/serialization_spec.rb +0 -362
  589. data/spec/extensions/server_block_spec.rb +0 -90
  590. data/spec/extensions/set_overrides_spec.rb +0 -61
  591. data/spec/extensions/sharding_spec.rb +0 -198
  592. data/spec/extensions/shared_caching_spec.rb +0 -175
  593. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  594. data/spec/extensions/singular_table_names_spec.rb +0 -22
  595. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  596. data/spec/extensions/spec_helper.rb +0 -71
  597. data/spec/extensions/split_array_nil_spec.rb +0 -24
  598. data/spec/extensions/split_values_spec.rb +0 -22
  599. data/spec/extensions/sql_expr_spec.rb +0 -60
  600. data/spec/extensions/static_cache_spec.rb +0 -361
  601. data/spec/extensions/string_date_time_spec.rb +0 -95
  602. data/spec/extensions/string_stripper_spec.rb +0 -68
  603. data/spec/extensions/subclasses_spec.rb +0 -66
  604. data/spec/extensions/table_select_spec.rb +0 -71
  605. data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
  606. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  607. data/spec/extensions/timestamps_spec.rb +0 -175
  608. data/spec/extensions/to_dot_spec.rb +0 -154
  609. data/spec/extensions/touch_spec.rb +0 -203
  610. data/spec/extensions/tree_spec.rb +0 -274
  611. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  612. data/spec/extensions/unlimited_update_spec.rb +0 -20
  613. data/spec/extensions/update_or_create_spec.rb +0 -87
  614. data/spec/extensions/update_primary_key_spec.rb +0 -100
  615. data/spec/extensions/update_refresh_spec.rb +0 -53
  616. data/spec/extensions/validate_associated_spec.rb +0 -52
  617. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  618. data/spec/extensions/validation_helpers_spec.rb +0 -541
  619. data/spec/extensions/xml_serializer_spec.rb +0 -207
  620. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  621. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  622. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  623. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  624. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  625. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  626. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  627. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  628. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  629. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  630. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  631. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  632. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  633. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  634. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  635. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  636. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  637. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  638. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  639. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  640. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  641. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  642. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  643. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  644. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  645. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  646. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  647. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  648. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  649. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  650. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  651. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  652. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  653. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  654. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  655. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  656. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  657. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  658. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  659. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  660. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  661. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  662. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  663. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  664. data/spec/guards_helper.rb +0 -55
  665. data/spec/integration/associations_test.rb +0 -2454
  666. data/spec/integration/database_test.rb +0 -113
  667. data/spec/integration/dataset_test.rb +0 -1808
  668. data/spec/integration/eager_loader_test.rb +0 -687
  669. data/spec/integration/migrator_test.rb +0 -240
  670. data/spec/integration/model_test.rb +0 -226
  671. data/spec/integration/plugin_test.rb +0 -2240
  672. data/spec/integration/prepared_statement_test.rb +0 -467
  673. data/spec/integration/schema_test.rb +0 -817
  674. data/spec/integration/spec_helper.rb +0 -48
  675. data/spec/integration/timezone_test.rb +0 -86
  676. data/spec/integration/transaction_test.rb +0 -374
  677. data/spec/integration/type_test.rb +0 -133
  678. data/spec/model/association_reflection_spec.rb +0 -525
  679. data/spec/model/associations_spec.rb +0 -4426
  680. data/spec/model/base_spec.rb +0 -759
  681. data/spec/model/class_dataset_methods_spec.rb +0 -146
  682. data/spec/model/dataset_methods_spec.rb +0 -149
  683. data/spec/model/eager_loading_spec.rb +0 -2137
  684. data/spec/model/hooks_spec.rb +0 -604
  685. data/spec/model/inflector_spec.rb +0 -26
  686. data/spec/model/model_spec.rb +0 -982
  687. data/spec/model/plugins_spec.rb +0 -299
  688. data/spec/model/record_spec.rb +0 -2147
  689. data/spec/model/spec_helper.rb +0 -46
  690. data/spec/model/validations_spec.rb +0 -193
  691. data/spec/sequel_coverage.rb +0 -15
  692. data/spec/spec_config.rb +0 -10
@@ -1,57 +1,107 @@
1
+ # frozen-string-literal: true
2
+ #
1
3
  # The pg_json extension adds support for Sequel to handle
2
- # PostgreSQL's json and jsonb types. It is slightly more strict than the
3
- # PostgreSQL json types in that the object returned should be an
4
- # array or object (PostgreSQL's json type considers plain numbers
5
- # strings, true, false, and null as valid). Sequel will work with
6
- # PostgreSQL json values that are not arrays or objects, but support
7
- # is fairly limited and the values do not roundtrip.
4
+ # PostgreSQL's json and jsonb types. By default, it wraps
5
+ # JSON arrays and JSON objects with ruby array-like and
6
+ # hash-like objects. If you would like to wrap JSON primitives
7
+ # (numbers, strings, +null+, +true+, and +false+), you need to
8
+ # use the +wrap_json_primitives+ setter:
9
+ #
10
+ # DB.extension :pg_json
11
+ # DB.wrap_json_primitives = true
12
+ #
13
+ # Note that wrapping JSON primitives changes the behavior for
14
+ # JSON false and null values. Because only +false+ and +nil+
15
+ # in Ruby are considered falsey, wrapping these objects results
16
+ # in unexpected behavior if you use the values directly in
17
+ # conditionals:
8
18
  #
9
- # This extension integrates with Sequel's native postgres adapter, so
10
- # that when json fields are retrieved, they are parsed and returned
11
- # as instances of Sequel::Postgres::JSONArray or
12
- # Sequel::Postgres::JSONHash (or JSONBArray or JSONBHash for jsonb
13
- # columns). JSONArray and JSONHash are
14
- # DelegateClasses of Array and Hash, so they mostly act the same, but
15
- # not completely (json_array.is_a?(Array) is false). If you want
16
- # the actual array for a JSONArray, call JSONArray#to_a. If you want
17
- # the actual hash for a JSONHash, call JSONHash#to_hash.
18
- # This is done so that Sequel does not treat JSONArray and JSONHash
19
- # like Array and Hash by default, which would cause issues.
19
+ # if DB[:table].get(:json_column)
20
+ # # called if the value of json_column is null/false
21
+ # # if you are wrapping primitives
22
+ # end
20
23
  #
21
- # To turn an existing Array or Hash into a JSONArray or JSONHash,
22
- # use Sequel.pg_json:
24
+ # To extract the Ruby primitive object from the wrapper object,
25
+ # you can use +__getobj__+ (this comes from Ruby's delegate library).
23
26
  #
24
- # Sequel.pg_json(array) # or Sequel.pg_jsonb(array) for jsonb type
25
- # Sequel.pg_json(hash) # or Sequel.pg_jsonb(hash) for jsonb type
27
+ # To wrap an existing Ruby array, hash, string, integer, float,
28
+ # +nil+, +true+, or +false+, use +Sequel.pg_json_wrap+ or +Sequel.pg_jsonb_wrap+:
29
+ #
30
+ # Sequel.pg_json_wrap(object) # json type
31
+ # Sequel.pg_jsonb_wrap(object) # jsonb type
32
+ #
33
+ # So if you want to insert an array or hash into an json database column:
34
+ #
35
+ # DB[:table].insert(column: Sequel.pg_json_wrap([1, 2, 3]))
36
+ # DB[:table].insert(column: Sequel.pg_json_wrap({'a'=>1, 'b'=>2}))
37
+ #
38
+ # Note that the +pg_json_wrap+ and +pg_jsonb_wrap+ methods only handle Ruby primitives,
39
+ # they do not handle already wrapped objects.
26
40
  #
27
41
  # If you have loaded the {core_extensions extension}[rdoc-ref:doc/core_extensions.rdoc],
28
42
  # or you have loaded the core_refinements extension
29
- # and have activated refinements for the file, you can also use Array#pg_json and Hash#pg_json:
43
+ # and have activated refinements for the file, you can also use the
44
+ # +pg_json+ and +pg_jsonb+ methods directly on Array or Hash:
30
45
  #
31
- # array.pg_json # or array.pg_jsonb for jsonb type
32
- # hash.pg_json # or hash.pg_jsonb for jsonb type
46
+ # array.pg_json # json type
47
+ # array.pg_jsonb # jsonb type
33
48
  #
34
- # So if you want to insert an array or hash into an json database column:
49
+ # hash.pg_json # json type
50
+ # hash.pg_jsonb # jsonb type
35
51
  #
36
- # DB[:table].insert(:column=>Sequel.pg_json([1, 2, 3]))
37
- # DB[:table].insert(:column=>Sequel.pg_json({'a'=>1, 'b'=>2}))
52
+ # Model classes that use json or jsonb columns will have typecasting automatically
53
+ # setup, so you can assign Ruby primitives to model columns and have the wrapped
54
+ # objects automatically created. However, for backwards compatibility, passing
55
+ # a string object will parse the string as JSON, not create a JSON string object.
56
+ #
57
+ # obj = Model.new
58
+ # obj.json_column = {'a'=>'b'}
59
+ # obj.json_column.class
60
+ # # => Sequel::Postgres::JSONHash
61
+ # obj.json_column['a']
62
+ # # => 'b'
38
63
  #
39
- # If you would like to use PostgreSQL json columns in your model
40
- # objects, you probably want to modify the schema parsing/typecasting
41
- # so that it recognizes and correctly handles the json type, which
42
- # you can do by:
64
+ # obj.json_column = '{"a": "b"}'
65
+ # obj.json_column.class
66
+ # # => Sequel::Postgres::JSONHash
67
+ # obj.json_column['a']
68
+ # # => 'b'
43
69
  #
44
- # DB.extension :pg_json
70
+ # You can change the handling of string typecasting by using +typecast_json_strings+:
71
+ #
72
+ # DB.typecast_json_strings = true
73
+ # obj.json_column = '{"a": "b"}'
74
+ # obj.json_column.class
75
+ # # => Sequel::Postgres::JSONString
76
+ # obj.json_column
77
+ # # => '{"a": "b"}'
78
+ #
79
+ # Note that +nil+ values are never automatically wrapped:
45
80
  #
46
- # If you are not using the native postgres adapter and are using json
47
- # types as model column values you probably should use the
48
- # pg_typecast_on_load plugin if the column values are returned as a string.
81
+ # obj.json_column = nil
82
+ # obj.json_column.class
83
+ # # => NilClass
84
+ # obj.json_column
85
+ # # => nil
86
+ #
87
+ # If you want to set a JSON null value when using a model, you must wrap it
88
+ # explicitly:
89
+ #
90
+ # obj.json_column = Sequel.pg_json_wrap(nil)
91
+ # obj.json_column.class
92
+ # # => Sequel::Postgres::JSONNull
93
+ # obj.json_column
94
+ # # => nil
95
+ #
96
+ # To use this extension, load it into the Database instance:
97
+ #
98
+ # DB.extension :pg_json
49
99
  #
50
100
  # See the {schema modification guide}[rdoc-ref:doc/schema_modification.rdoc]
51
101
  # for details on using json columns in CREATE/ALTER TABLE statements.
52
102
  #
53
103
  # This extension integrates with the pg_array extension. If you plan
54
- # to use the json[] type, load the pg_array extension before the
104
+ # to use the json[] or jsonb[] types, load the pg_array extension before the
55
105
  # pg_json extension:
56
106
  #
57
107
  # DB.extension :pg_array, :pg_json
@@ -59,109 +109,219 @@
59
109
  # Note that when accessing json hashes, you should always use strings for keys.
60
110
  # Attempting to use other values (such as symbols) will not work correctly.
61
111
  #
62
- # This extension requires both the json and delegate libraries.
112
+ # This extension requires both the json and delegate libraries. However, you
113
+ # can override +Sequel.parse_json+, +Sequel.object_to_json+, and
114
+ # +Sequel.json_parser_error_class+ to use an alternative JSON implementation.
115
+ #
116
+ # Related modules: Sequel::Postgres::JSONDatabaseMethods
63
117
 
64
118
  require 'delegate'
65
119
  require 'json'
66
- Sequel.require 'adapters/utils/pg_types'
67
120
 
68
121
  module Sequel
69
122
  module Postgres
70
- CAST_JSON = '::json'.freeze
71
- CAST_JSONB = '::jsonb'.freeze
72
-
73
- # Class representing PostgreSQL JSON/JSONB column array values.
74
- class JSONArrayBase < DelegateClass(Array)
75
- include Sequel::SQL::AliasMethods
76
- include Sequel::SQL::CastMethods
77
-
78
- # Convert the array to a json string and append a
79
- # literalized version of the string to the sql.
80
- def sql_literal_append(ds, sql)
81
- ds.literal_append(sql, Sequel.object_to_json(self))
82
- end
123
+ # A module included in all of the JSON wrapper classes.
124
+ module JSONObject
83
125
  end
84
126
 
85
- class JSONArray < JSONArrayBase
86
- # Cast as json
87
- def sql_literal_append(ds, sql)
88
- super
89
- sql << CAST_JSON
90
- end
127
+ # A module included in all of the JSONB wrapper classes.
128
+ module JSONBObject
91
129
  end
92
130
 
93
- class JSONBArray < JSONArrayBase
94
- # Cast as jsonb
95
- def sql_literal_append(ds, sql)
96
- super
97
- sql << CAST_JSONB
131
+ create_delegate_class = lambda do |name, delegate_class|
132
+ base_class = DelegateClass(delegate_class)
133
+ base_class.class_eval do
134
+ include Sequel::SQL::AliasMethods
135
+ include Sequel::SQL::CastMethods
98
136
  end
99
- end
100
137
 
101
- # Class representing PostgreSQL JSON/JSONB column hash/object values.
102
- class JSONHashBase < DelegateClass(Hash)
103
- include Sequel::SQL::AliasMethods
104
- include Sequel::SQL::CastMethods
138
+ json_class = Class.new(base_class) do
139
+ include JSONObject
105
140
 
106
- # Convert the hash to a json string and append a
107
- # literalized version of the string to the sql.
108
- def sql_literal_append(ds, sql)
109
- ds.literal_append(sql, Sequel.object_to_json(self))
141
+ def sql_literal_append(ds, sql)
142
+ ds.literal_append(sql, Sequel.object_to_json(self))
143
+ sql << '::json'
144
+ end
110
145
  end
111
146
 
112
- # Return the object being delegated to.
113
- alias to_hash __getobj__
114
- end
147
+ jsonb_class = Class.new(base_class) do
148
+ include JSONBObject
115
149
 
116
- class JSONHash < JSONHashBase
117
- # Cast as json
118
- def sql_literal_append(ds, sql)
119
- super
120
- sql << CAST_JSON
150
+ def sql_literal_append(ds, sql)
151
+ ds.literal_append(sql, Sequel.object_to_json(self))
152
+ sql << '::jsonb'
153
+ end
121
154
  end
155
+
156
+ const_set(:"JSON#{name}Base", base_class)
157
+ const_set(:"JSON#{name}", json_class)
158
+ const_set(:"JSONB#{name}", jsonb_class)
122
159
  end
123
160
 
124
- class JSONBHash < JSONHashBase
125
- # Cast as jsonb
126
- def sql_literal_append(ds, sql)
127
- super
128
- sql << CAST_JSONB
129
- end
161
+ create_delegate_class.call(:Array, Array)
162
+ create_delegate_class.call(:Hash, Hash)
163
+ create_delegate_class.call(:String, String)
164
+ create_delegate_class.call(:Integer, Integer)
165
+ create_delegate_class.call(:Float, Float)
166
+ create_delegate_class.call(:Null, NilClass)
167
+ create_delegate_class.call(:True, TrueClass)
168
+ create_delegate_class.call(:False, FalseClass)
169
+
170
+ JSON_WRAPPER_MAPPING = {
171
+ ::Array => JSONArray,
172
+ ::Hash => JSONHash,
173
+ }.freeze
174
+
175
+ JSONB_WRAPPER_MAPPING = {
176
+ ::Array => JSONBArray,
177
+ ::Hash => JSONBHash,
178
+ }.freeze
179
+
180
+ JSON_PRIMITIVE_WRAPPER_MAPPING = {
181
+ ::String => JSONString,
182
+ ::Integer => JSONInteger,
183
+ ::Float => JSONFloat,
184
+ ::NilClass => JSONNull,
185
+ ::TrueClass => JSONTrue,
186
+ ::FalseClass => JSONFalse,
187
+ }
188
+
189
+ JSONB_PRIMITIVE_WRAPPER_MAPPING = {
190
+ ::String => JSONBString,
191
+ ::Integer => JSONBInteger,
192
+ ::Float => JSONBFloat,
193
+ ::NilClass => JSONBNull,
194
+ ::TrueClass => JSONBTrue,
195
+ ::FalseClass => JSONBFalse,
196
+ }
197
+
198
+ if RUBY_VERSION < '2.4'
199
+ # :nocov:
200
+ JSON_PRIMITIVE_WRAPPER_MAPPING[Fixnum] = JSONInteger
201
+ JSON_PRIMITIVE_WRAPPER_MAPPING[Bignum] = JSONInteger
202
+ JSONB_PRIMITIVE_WRAPPER_MAPPING[Fixnum] = JSONBInteger
203
+ JSONB_PRIMITIVE_WRAPPER_MAPPING[Bignum] = JSONBInteger
204
+ # :nocov:
130
205
  end
131
206
 
207
+ JSON_PRIMITIVE_WRAPPER_MAPPING.freeze
208
+ JSONB_PRIMITIVE_WRAPPER_MAPPING.freeze
209
+
210
+ JSON_COMBINED_WRAPPER_MAPPING =JSON_WRAPPER_MAPPING.merge(JSON_PRIMITIVE_WRAPPER_MAPPING).freeze
211
+ JSONB_COMBINED_WRAPPER_MAPPING =JSONB_WRAPPER_MAPPING.merge(JSONB_PRIMITIVE_WRAPPER_MAPPING).freeze
212
+ JSONB_WRAP_CLASSES = JSONB_COMBINED_WRAPPER_MAPPING.keys.freeze
213
+
214
+ Sequel::Deprecation.deprecate_constant(self, :JSON_WRAPPER_MAPPING)
215
+ Sequel::Deprecation.deprecate_constant(self, :JSONB_WRAPPER_MAPPING)
216
+ Sequel::Deprecation.deprecate_constant(self, :JSON_PRIMITIVE_WRAPPER_MAPPING)
217
+ Sequel::Deprecation.deprecate_constant(self, :JSONB_PRIMITIVE_WRAPPER_MAPPING)
218
+ Sequel::Deprecation.deprecate_constant(self, :JSON_COMBINED_WRAPPER_MAPPING)
219
+ Sequel::Deprecation.deprecate_constant(self, :JSONB_COMBINED_WRAPPER_MAPPING)
220
+ Sequel::Deprecation.deprecate_constant(self, :JSONB_WRAP_CLASSES)
221
+
222
+ JSON_WRAP_CLASSES = [Hash, Array, String, Integer, Float, NilClass, TrueClass, FalseClass].freeze
223
+
132
224
  # Methods enabling Database object integration with the json type.
133
225
  module JSONDatabaseMethods
134
226
  def self.extended(db)
135
- db.instance_eval do
136
- copy_conversion_procs([114, 199, 3802, 3807])
137
- @schema_type_classes[:json] = [JSONHash, JSONArray]
138
- @schema_type_classes[:jsonb] = [JSONBHash, JSONBArray]
227
+ db.instance_exec do
228
+ add_conversion_proc(114, method(:_db_parse_json))
229
+ add_conversion_proc(3802, method(:_db_parse_jsonb))
230
+ if respond_to?(:register_array_type)
231
+ register_array_type('json', :oid=>199, :scalar_oid=>114)
232
+ register_array_type('jsonb', :oid=>3807, :scalar_oid=>3802)
233
+ end
234
+ @schema_type_classes[:json] = [JSONObject]
235
+ @schema_type_classes[:jsonb] = [JSONBObject]
139
236
  end
140
237
  end
141
238
 
142
- # Parse JSON data coming from the database. Since PostgreSQL allows
143
- # non JSON data in JSON fields (such as plain numbers and strings),
144
- # we don't want to raise an exception for that.
239
+ # Return the wrapper class for the json type if value is Hash or Array.
240
+ def self.json_wrapper(value)
241
+ case value
242
+ when ::Hash
243
+ JSONHash
244
+ when ::Array
245
+ JSONArray
246
+ end
247
+ end
248
+
249
+ # Return the wrapper class for the jsonb type if value is Hash or Array.
250
+ def self.jsonb_wrapper(value)
251
+ case value
252
+ when ::Hash
253
+ JSONBHash
254
+ when ::Array
255
+ JSONBArray
256
+ end
257
+ end
258
+
259
+ # Return the wrapper class for the json type if value is a supported type.
260
+ def self.json_primitive_wrapper(value)
261
+ case value
262
+ when ::Hash
263
+ JSONHash
264
+ when ::Array
265
+ JSONArray
266
+ when ::String
267
+ JSONString
268
+ when ::Integer
269
+ JSONInteger
270
+ when ::Float
271
+ JSONFloat
272
+ when ::NilClass
273
+ JSONNull
274
+ when ::TrueClass
275
+ JSONTrue
276
+ when ::FalseClass
277
+ JSONFalse
278
+ end
279
+ end
280
+
281
+ # Return the wrapper class for the jsonb type if value is a supported type.
282
+ def self.jsonb_primitive_wrapper(value)
283
+ case value
284
+ when ::Hash
285
+ JSONBHash
286
+ when ::Array
287
+ JSONBArray
288
+ when ::String
289
+ JSONBString
290
+ when ::Integer
291
+ JSONBInteger
292
+ when ::Float
293
+ JSONBFloat
294
+ when ::NilClass
295
+ JSONBNull
296
+ when ::TrueClass
297
+ JSONBTrue
298
+ when ::FalseClass
299
+ JSONBFalse
300
+ end
301
+ end
302
+
303
+ # Deprecated
145
304
  def self.db_parse_json(s)
305
+ # SEQUEL6: Remove
146
306
  parse_json(s)
147
307
  rescue Sequel::InvalidValue
148
308
  raise unless s.is_a?(String)
149
309
  parse_json("[#{s}]").first
150
310
  end
151
311
 
152
- # Same as db_parse_json, but consider the input as jsonb.
312
+ # Deprecated
153
313
  def self.db_parse_jsonb(s)
314
+ # SEQUEL6: Remove
154
315
  parse_json(s, true)
155
316
  rescue Sequel::InvalidValue
156
317
  raise unless s.is_a?(String)
157
318
  parse_json("[#{s}]").first
158
319
  end
159
320
 
160
- # Parse the given string as json, returning either a JSONArray
161
- # or JSONHash instance (or JSONBArray or JSONBHash instance if jsonb
162
- # argument is true), or a String, Numeric, true, false, or nil
163
- # if the json library used supports that.
321
+ # Deprecated
164
322
  def self.parse_json(s, jsonb=false)
323
+ # SEQUEL6: Remove
324
+ Sequel::Deprecation.deprecate("Sequel::Postgres::JSONDatabaseMethods.{parse_json,db_parse_json,db_parse_jsonb} are deprecated and will be removed in Sequel 6.")
165
325
  begin
166
326
  value = Sequel.parse_json(s)
167
327
  rescue Sequel.json_parser_error_class => e
@@ -180,10 +340,22 @@ module Sequel
180
340
  end
181
341
  end
182
342
 
183
- # Handle JSONArray and JSONHash in bound variables
343
+ # Whether to wrap JSON primitives instead of using Ruby objects.
344
+ # Wrapping the primitives allows the primitive values to roundtrip,
345
+ # but it can cause problems, especially as false/null JSON values
346
+ # will be treated as truthy in Ruby due to the wrapping. False by
347
+ # default.
348
+ attr_accessor :wrap_json_primitives
349
+
350
+ # Whether to typecast strings for json/jsonb types as JSON
351
+ # strings, instead of trying to parse the string as JSON.
352
+ # False by default.
353
+ attr_accessor :typecast_json_strings
354
+
355
+ # Handle json and jsonb types in bound variables
184
356
  def bound_variable_arg(arg, conn)
185
357
  case arg
186
- when JSONArrayBase, JSONHashBase
358
+ when JSONObject, JSONBObject
187
359
  Sequel.object_to_json(arg)
188
360
  else
189
361
  super
@@ -192,17 +364,79 @@ module Sequel
192
364
 
193
365
  private
194
366
 
195
- # Handle json[] types in bound variables.
367
+ # Parse JSON data coming from the database. Since PostgreSQL allows
368
+ # non JSON data in JSON fields (such as plain numbers and strings),
369
+ # we don't want to raise an exception for that.
370
+ def _db_parse_json(s)
371
+ _wrap_json(_parse_json(s))
372
+ rescue Sequel::InvalidValue
373
+ raise unless s.is_a?(String)
374
+ _wrap_json(_parse_json("[#{s}]").first)
375
+ end
376
+
377
+ # Same as _db_parse_json, but consider the input as jsonb.
378
+ def _db_parse_jsonb(s)
379
+ _wrap_jsonb(_parse_json(s))
380
+ rescue Sequel::InvalidValue
381
+ raise unless s.is_a?(String)
382
+ _wrap_jsonb(_parse_json("[#{s}]").first)
383
+ end
384
+
385
+ # Parse the given string as json, returning either a JSONArray
386
+ # or JSONHash instance (or JSONBArray or JSONBHash instance if jsonb
387
+ # argument is true), or a String, Numeric, true, false, or nil
388
+ # if the json library used supports that.
389
+ def _parse_json(s)
390
+ begin
391
+ Sequel.parse_json(s)
392
+ rescue Sequel.json_parser_error_class => e
393
+ raise Sequel.convert_exception_class(e, Sequel::InvalidValue)
394
+ end
395
+ end
396
+
397
+ # Wrap the parsed JSON value in the appropriate JSON wrapper class.
398
+ # Only wrap primitive values if wrap_json_primitives is set.
399
+ def _wrap_json(value)
400
+ if klass = JSONDatabaseMethods.json_wrapper(value)
401
+ klass.new(value)
402
+ elsif klass = JSONDatabaseMethods.json_primitive_wrapper(value)
403
+ if wrap_json_primitives
404
+ klass.new(value)
405
+ else
406
+ value
407
+ end
408
+ else
409
+ raise Sequel::InvalidValue, "unhandled json value: #{value.inspect}"
410
+ end
411
+ end
412
+
413
+ # Wrap the parsed JSON value in the appropriate JSONB wrapper class.
414
+ # Only wrap primitive values if wrap_json_primitives is set.
415
+ def _wrap_jsonb(value)
416
+ if klass = JSONDatabaseMethods.jsonb_wrapper(value)
417
+ klass.new(value)
418
+ elsif klass = JSONDatabaseMethods.jsonb_primitive_wrapper(value)
419
+ if wrap_json_primitives
420
+ klass.new(value)
421
+ else
422
+ value
423
+ end
424
+ else
425
+ raise Sequel::InvalidValue, "unhandled jsonb value: #{value.inspect}"
426
+ end
427
+ end
428
+
429
+ # Handle json[] and jsonb[] types in bound variables.
196
430
  def bound_variable_array(a)
197
431
  case a
198
- when JSONHashBase, JSONArrayBase
432
+ when JSONObject, JSONBObject
199
433
  "\"#{Sequel.object_to_json(a).gsub('"', '\\"')}\""
200
434
  else
201
435
  super
202
436
  end
203
437
  end
204
438
 
205
- # Make the column type detection recognize the json type.
439
+ # Make the column type detection recognize the json types.
206
440
  def schema_column_type(db_type)
207
441
  case db_type
208
442
  when 'json'
@@ -214,91 +448,138 @@ module Sequel
214
448
  end
215
449
  end
216
450
 
217
- # Convert the value given to a JSONArray or JSONHash
451
+ # Set the :callable_default value if the default value is recognized as an empty json/jsonb array/hash.
452
+ def schema_post_process(_)
453
+ super.each do |a|
454
+ h = a[1]
455
+ if (h[:type] == :json || h[:type] == :jsonb) && h[:default] =~ /\A'(\{\}|\[\])'::jsonb?\z/
456
+ is_array = $1 == '[]'
457
+
458
+ klass = if h[:type] == :json
459
+ if is_array
460
+ JSONArray
461
+ else
462
+ JSONHash
463
+ end
464
+ elsif is_array
465
+ JSONBArray
466
+ else
467
+ JSONBHash
468
+ end
469
+
470
+ h[:callable_default] = lambda{klass.new(is_array ? [] : {})}
471
+ end
472
+ end
473
+ end
474
+
475
+ # Convert the value given to a JSON wrapper object.
218
476
  def typecast_value_json(value)
219
477
  case value
220
- when JSONArray, JSONHash
478
+ when JSONObject
221
479
  value
222
- when Array
223
- JSONArray.new(value)
224
- when Hash
225
- JSONHash.new(value)
226
- when JSONBArray
227
- JSONArray.new(value.to_a)
228
- when JSONBHash
229
- JSONHash.new(value.to_hash)
230
480
  when String
231
- JSONDatabaseMethods.parse_json(value)
481
+ if typecast_json_strings
482
+ JSONString.new(value)
483
+ else
484
+ _wrap_json(_parse_json(value))
485
+ end
486
+ when *JSON_WRAP_CLASSES
487
+ JSONDatabaseMethods.json_primitive_wrapper(value).new(value)
488
+ when JSONBObject
489
+ value = value.__getobj__
490
+ JSONDatabaseMethods.json_primitive_wrapper(value).new(value)
232
491
  else
233
492
  raise Sequel::InvalidValue, "invalid value for json: #{value.inspect}"
234
493
  end
235
494
  end
236
495
 
237
- # Convert the value given to a JSONBArray or JSONBHash
496
+ # Convert the value given to a JSONB wrapper object.
238
497
  def typecast_value_jsonb(value)
239
498
  case value
240
- when JSONBArray, JSONBHash
499
+ when JSONBObject
241
500
  value
242
- when Array
243
- JSONBArray.new(value)
244
- when Hash
245
- JSONBHash.new(value)
246
- when JSONArray
247
- JSONBArray.new(value.to_a)
248
- when JSONHash
249
- JSONBHash.new(value.to_hash)
250
501
  when String
251
- JSONDatabaseMethods.parse_json(value, true)
502
+ if typecast_json_strings
503
+ JSONBString.new(value)
504
+ else
505
+ _wrap_jsonb(_parse_json(value))
506
+ end
507
+ when *JSON_WRAP_CLASSES
508
+ JSONDatabaseMethods.jsonb_primitive_wrapper(value).new(value)
509
+ when JSONObject
510
+ value = value.__getobj__
511
+ JSONDatabaseMethods.jsonb_primitive_wrapper(value).new(value)
252
512
  else
253
513
  raise Sequel::InvalidValue, "invalid value for jsonb: #{value.inspect}"
254
514
  end
255
515
  end
256
516
  end
257
-
258
- PG_TYPES[114] = JSONDatabaseMethods.method(:db_parse_json)
259
- PG_TYPES[3802] = JSONDatabaseMethods.method(:db_parse_jsonb)
260
- if defined?(PGArray) && PGArray.respond_to?(:register)
261
- PGArray.register('json', :oid=>199, :scalar_oid=>114)
262
- PGArray.register('jsonb', :oid=>3807, :scalar_oid=>3802)
263
- end
264
517
  end
265
518
 
266
519
  module SQL::Builders
267
520
  # Wrap the array or hash in a Postgres::JSONArray or Postgres::JSONHash.
521
+ # Also handles Postgres::JSONObject and JSONBObjects.
522
+ # For other objects, calls +Sequel.pg_json_op+ (which is defined
523
+ # by the pg_json_ops extension).
268
524
  def pg_json(v)
269
525
  case v
270
- when Postgres::JSONArray, Postgres::JSONHash
526
+ when Postgres::JSONObject
271
527
  v
272
528
  when Array
273
529
  Postgres::JSONArray.new(v)
274
530
  when Hash
275
531
  Postgres::JSONHash.new(v)
276
- when Postgres::JSONBArray
277
- Postgres::JSONArray.new(v.to_a)
278
- when Postgres::JSONBHash
279
- Postgres::JSONHash.new(v.to_hash)
532
+ when Postgres::JSONBObject
533
+ v = v.__getobj__
534
+ Postgres::JSONDatabaseMethods.json_primitive_wrapper(v).new(v)
280
535
  else
281
536
  Sequel.pg_json_op(v)
282
537
  end
283
538
  end
284
539
 
540
+ # Wraps Ruby array, hash, string, integer, float, true, false, and nil
541
+ # values with the appropriate JSON wrapper. Raises an exception for
542
+ # other types.
543
+ def pg_json_wrap(v)
544
+ case v
545
+ when *Postgres::JSON_WRAP_CLASSES
546
+ Postgres::JSONDatabaseMethods.json_primitive_wrapper(v).new(v)
547
+ else
548
+ raise Error, "invalid value passed to Sequel.pg_json_wrap: #{v.inspect}"
549
+ end
550
+ end
551
+
285
552
  # Wrap the array or hash in a Postgres::JSONBArray or Postgres::JSONBHash.
553
+ # Also handles Postgres::JSONObject and JSONBObjects.
554
+ # For other objects, calls +Sequel.pg_json_op+ (which is defined
555
+ # by the pg_json_ops extension).
286
556
  def pg_jsonb(v)
287
557
  case v
288
- when Postgres::JSONBArray, Postgres::JSONBHash
558
+ when Postgres::JSONBObject
289
559
  v
290
560
  when Array
291
561
  Postgres::JSONBArray.new(v)
292
562
  when Hash
293
563
  Postgres::JSONBHash.new(v)
294
- when Postgres::JSONArray
295
- Postgres::JSONBArray.new(v.to_a)
296
- when Postgres::JSONHash
297
- Postgres::JSONBHash.new(v.to_hash)
564
+ when Postgres::JSONObject
565
+ v = v.__getobj__
566
+ Postgres::JSONDatabaseMethods.jsonb_primitive_wrapper(v).new(v)
298
567
  else
299
568
  Sequel.pg_jsonb_op(v)
300
569
  end
301
570
  end
571
+
572
+ # Wraps Ruby array, hash, string, integer, float, true, false, and nil
573
+ # values with the appropriate JSONB wrapper. Raises an exception for
574
+ # other types.
575
+ def pg_jsonb_wrap(v)
576
+ case v
577
+ when *Postgres::JSON_WRAP_CLASSES
578
+ Postgres::JSONDatabaseMethods.jsonb_primitive_wrapper(v).new(v)
579
+ else
580
+ raise Error, "invalid value passed to Sequel.pg_jsonb_wrap: #{v.inspect}"
581
+ end
582
+ end
302
583
  end
303
584
 
304
585
  Database.register_extension(:pg_json, Postgres::JSONDatabaseMethods)