serrano-vk 0.1.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 (588) hide show
  1. checksums.yaml +7 -0
  2. data/EXAMPLES.md +271 -0
  3. data/README.md +170 -0
  4. data/bin/serrano +6 -0
  5. data/examples/demo_crud/Gemfile +9 -0
  6. data/examples/demo_crud/Gemfile.lock +31 -0
  7. data/examples/demo_crud/app/controllers/articles_controller.rb +92 -0
  8. data/examples/demo_crud/app/controllers/categories_controller.rb +92 -0
  9. data/examples/demo_crud/app/entities/article.rb +17 -0
  10. data/examples/demo_crud/app/entities/category.rb +17 -0
  11. data/examples/demo_crud/app/entities/concerns/validatable.rb +136 -0
  12. data/examples/demo_crud/app/repositories/article_repository.rb +42 -0
  13. data/examples/demo_crud/app/repositories/category_repository.rb +42 -0
  14. data/examples/demo_crud/app/services/articles/create.rb +29 -0
  15. data/examples/demo_crud/app/services/articles/destroy.rb +20 -0
  16. data/examples/demo_crud/app/services/articles/index.rb +17 -0
  17. data/examples/demo_crud/app/services/articles/show.rb +20 -0
  18. data/examples/demo_crud/app/services/articles/update.rb +26 -0
  19. data/examples/demo_crud/app/services/categories/create.rb +27 -0
  20. data/examples/demo_crud/app/services/categories/destroy.rb +20 -0
  21. data/examples/demo_crud/app/services/categories/index.rb +17 -0
  22. data/examples/demo_crud/app/services/categories/show.rb +20 -0
  23. data/examples/demo_crud/app/services/categories/update.rb +26 -0
  24. data/examples/demo_crud/config/db.rb +3 -0
  25. data/examples/demo_crud/config.ru +19 -0
  26. data/examples/demo_crud/db/development.sqlite3 +0 -0
  27. data/examples/demo_crud/db/migrations/20260307212844_create_articles.rb +14 -0
  28. data/examples/demo_crud/db/migrations/20260307212845_create_categories.rb +12 -0
  29. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/bin/rackup +29 -0
  30. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/bin/rackup.bat +2 -0
  31. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/bin/sequel +29 -0
  32. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/bin/sequel.bat +2 -0
  33. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/bin/serrano +29 -0
  34. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/bin/serrano.bat +2 -0
  35. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/cache/bigdecimal-4.0.1.gem +0 -0
  36. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/cache/rack-3.2.5.gem +0 -0
  37. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/cache/rackup-2.3.1.gem +0 -0
  38. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/cache/sequel-5.102.0.gem +0 -0
  39. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/cache/sqlite3-2.9.1-x64-mingw-ucrt.gem +0 -0
  40. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/cache/webrick-1.9.2.gem +0 -0
  41. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/extensions/x64-mingw-ucrt/3.4.0/bigdecimal-4.0.1/bigdecimal.so +0 -0
  42. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/extensions/x64-mingw-ucrt/3.4.0/bigdecimal-4.0.1/gem.build_complete +0 -0
  43. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/extensions/x64-mingw-ucrt/3.4.0/bigdecimal-4.0.1/gem_make.out +43 -0
  44. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/extensions/x64-mingw-ucrt/3.4.0/bigdecimal-4.0.1/mkmf.log +669 -0
  45. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/LICENSE +56 -0
  46. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/bigdecimal.gemspec +57 -0
  47. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/Makefile +278 -0
  48. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/bigdecimal.c +6206 -0
  49. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/bigdecimal.h +292 -0
  50. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/bits.h +144 -0
  51. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/extconf.rb +60 -0
  52. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/feature.h +68 -0
  53. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/missing/dtoa.c +3462 -0
  54. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/missing.c +28 -0
  55. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/missing.h +104 -0
  56. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/ext/bigdecimal/static_assert.h +54 -0
  57. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/lib/bigdecimal/jacobian.rb +92 -0
  58. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/lib/bigdecimal/ludcmp.rb +91 -0
  59. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/lib/bigdecimal/math.rb +948 -0
  60. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/lib/bigdecimal/newton.rb +82 -0
  61. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/lib/bigdecimal/util.rb +186 -0
  62. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/lib/bigdecimal.rb +360 -0
  63. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/lib/bigdecimal.so +0 -0
  64. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/sample/linear.rb +74 -0
  65. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/sample/nlsolve.rb +40 -0
  66. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.0.1/sample/pi.rb +21 -0
  67. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/CHANGELOG.md +1314 -0
  68. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/CONTRIBUTING.md +144 -0
  69. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/MIT-LICENSE +20 -0
  70. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/README.md +384 -0
  71. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/SPEC.rdoc +258 -0
  72. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/auth/abstract/handler.rb +41 -0
  73. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/auth/abstract/request.rb +51 -0
  74. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/auth/basic.rb +58 -0
  75. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/bad_request.rb +8 -0
  76. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/body_proxy.rb +63 -0
  77. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/builder.rb +296 -0
  78. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/cascade.rb +67 -0
  79. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/common_logger.rb +89 -0
  80. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/conditional_get.rb +87 -0
  81. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/config.rb +22 -0
  82. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/constants.rb +68 -0
  83. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/content_length.rb +34 -0
  84. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/content_type.rb +33 -0
  85. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/deflater.rb +158 -0
  86. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/directory.rb +208 -0
  87. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/etag.rb +71 -0
  88. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/events.rb +172 -0
  89. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/files.rb +216 -0
  90. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/head.rb +25 -0
  91. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/headers.rb +238 -0
  92. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/lint.rb +964 -0
  93. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/lock.rb +29 -0
  94. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/media_type.rb +52 -0
  95. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/method_override.rb +56 -0
  96. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/mime.rb +694 -0
  97. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/mock.rb +3 -0
  98. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/mock_request.rb +161 -0
  99. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/mock_response.rb +156 -0
  100. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/multipart/generator.rb +99 -0
  101. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/multipart/parser.rb +580 -0
  102. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/multipart/uploaded_file.rb +82 -0
  103. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/multipart.rb +77 -0
  104. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/null_logger.rb +48 -0
  105. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/query_parser.rb +261 -0
  106. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/recursive.rb +66 -0
  107. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/reloader.rb +112 -0
  108. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/request.rb +790 -0
  109. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/response.rb +403 -0
  110. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/rewindable_input.rb +116 -0
  111. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/runtime.rb +35 -0
  112. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/sendfile.rb +197 -0
  113. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/show_exceptions.rb +409 -0
  114. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/show_status.rb +121 -0
  115. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/static.rb +188 -0
  116. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/tempfile_reaper.rb +33 -0
  117. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/urlmap.rb +99 -0
  118. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/utils.rb +622 -0
  119. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack/version.rb +17 -0
  120. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rack-3.2.5/lib/rack.rb +64 -0
  121. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/bin/rackup +5 -0
  122. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/handler/cgi.rb +61 -0
  123. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/handler/webrick.rb +196 -0
  124. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/handler.rb +113 -0
  125. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/lobster.rb +81 -0
  126. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/server.rb +462 -0
  127. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/stream.rb +199 -0
  128. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup/version.rb +8 -0
  129. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/lib/rackup.rb +21 -0
  130. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/license.md +80 -0
  131. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/readme.md +82 -0
  132. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/releases.md +28 -0
  133. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/rackup-2.3.1/security.md +3 -0
  134. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/MIT-LICENSE +19 -0
  135. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/bin/sequel +280 -0
  136. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/ado/access.rb +335 -0
  137. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/ado/mssql.rb +62 -0
  138. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/ado.rb +283 -0
  139. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/amalgalite.rb +184 -0
  140. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/ibmdb.rb +423 -0
  141. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/db2.rb +83 -0
  142. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/derby.rb +318 -0
  143. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/h2.rb +290 -0
  144. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/hsqldb.rb +228 -0
  145. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/jtds.rb +39 -0
  146. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/mssql.rb +30 -0
  147. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/mysql.rb +89 -0
  148. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/oracle.rb +146 -0
  149. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/postgresql.rb +239 -0
  150. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/sqlanywhere.rb +87 -0
  151. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/sqlite.rb +133 -0
  152. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/sqlserver.rb +92 -0
  153. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc/transactions.rb +95 -0
  154. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/jdbc.rb +850 -0
  155. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/mock.rb +381 -0
  156. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/mysql.rb +380 -0
  157. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/mysql2.rb +307 -0
  158. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/odbc/db2.rb +11 -0
  159. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/odbc/mssql.rb +57 -0
  160. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/odbc/oracle.rb +11 -0
  161. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/odbc.rb +150 -0
  162. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/oracle.rb +427 -0
  163. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/postgres.rb +863 -0
  164. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/postgresql.rb +3 -0
  165. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/access.rb +301 -0
  166. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/db2.rb +509 -0
  167. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/mssql.rb +1238 -0
  168. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/mysql.rb +1175 -0
  169. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/oracle.rb +732 -0
  170. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/postgres.rb +3022 -0
  171. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/sqlanywhere.rb +470 -0
  172. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/shared/sqlite.rb +1073 -0
  173. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/sqlanywhere.rb +192 -0
  174. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/sqlite.rb +475 -0
  175. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/tinytds.rb +259 -0
  176. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/trilogy.rb +116 -0
  177. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
  178. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +74 -0
  179. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +93 -0
  180. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  181. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  182. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/replace.rb +35 -0
  183. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/split_alter_table.rb +46 -0
  184. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/stored_procedures.rb +61 -0
  185. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  186. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/ast_transformer.rb +132 -0
  187. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/connection_pool/sharded_single.rb +113 -0
  188. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/connection_pool/sharded_threaded.rb +392 -0
  189. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/connection_pool/sharded_timed_queue.rb +399 -0
  190. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/connection_pool/single.rb +57 -0
  191. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/connection_pool/threaded.rb +307 -0
  192. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/connection_pool/timed_queue.rb +288 -0
  193. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/connection_pool.rb +175 -0
  194. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/core.rb +476 -0
  195. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/connecting.rb +349 -0
  196. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/dataset.rb +89 -0
  197. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/dataset_defaults.rb +93 -0
  198. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/features.rb +150 -0
  199. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/logging.rb +91 -0
  200. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/misc.rb +663 -0
  201. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/query.rb +436 -0
  202. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/schema_generator.rb +720 -0
  203. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/schema_methods.rb +1157 -0
  204. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database/transactions.rb +552 -0
  205. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/database.rb +37 -0
  206. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/actions.rb +1412 -0
  207. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/dataset_module.rb +46 -0
  208. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/deprecated_singleton_class_methods.rb +42 -0
  209. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/features.rb +284 -0
  210. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/graph.rb +297 -0
  211. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/misc.rb +381 -0
  212. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/placeholder_literalizer.rb +230 -0
  213. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/prepared_statements.rb +474 -0
  214. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/query.rb +1571 -0
  215. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset/sql.rb +1863 -0
  216. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/dataset.rb +60 -0
  217. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/deprecated.rb +70 -0
  218. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/exceptions.rb +130 -0
  219. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  220. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/_model_pg_row.rb +31 -0
  221. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/_pretty_table.rb +85 -0
  222. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/any_not_empty.rb +45 -0
  223. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/arbitrary_servers.rb +114 -0
  224. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/async_thread_pool.rb +446 -0
  225. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/auto_cast_date_and_time.rb +94 -0
  226. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  227. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/blank.rb +57 -0
  228. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/caller_logging.rb +80 -0
  229. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/columns_introspection.rb +88 -0
  230. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/connection_checkout_event_callback.rb +151 -0
  231. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/connection_expiration.rb +105 -0
  232. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/connection_validator.rb +133 -0
  233. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/constant_sql_override.rb +65 -0
  234. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/constraint_validations.rb +510 -0
  235. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/core_extensions.rb +222 -0
  236. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/core_refinements.rb +244 -0
  237. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/current_datetime_timestamp.rb +59 -0
  238. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/dataset_run.rb +41 -0
  239. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/dataset_source_alias.rb +95 -0
  240. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/date_arithmetic.rb +254 -0
  241. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
  242. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
  243. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/duplicate_columns_handler.rb +95 -0
  244. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/empty_array_consider_nulls.rb +46 -0
  245. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/error_sql.rb +76 -0
  246. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/escaped_like.rb +100 -0
  247. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/eval_inspect.rb +185 -0
  248. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/exclude_or_null.rb +68 -0
  249. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  250. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/freeze_datasets.rb +3 -0
  251. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/from_block.rb +3 -0
  252. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/graph_each.rb +88 -0
  253. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/identifier_mangling.rb +180 -0
  254. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/implicit_subquery.rb +48 -0
  255. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/index_caching.rb +113 -0
  256. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/inflector.rb +258 -0
  257. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/integer64.rb +32 -0
  258. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/is_distinct_from.rb +141 -0
  259. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/looser_typecasting.rb +50 -0
  260. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/migration.rb +867 -0
  261. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +84 -0
  262. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/named_timezones.rb +184 -0
  263. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
  264. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/null_dataset.rb +109 -0
  265. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pagination.rb +140 -0
  266. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_array.rb +556 -0
  267. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_array_ops.rb +377 -0
  268. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_auto_parameterize.rb +516 -0
  269. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_auto_parameterize_duplicate_query_detection.rb +191 -0
  270. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_auto_parameterize_in_array.rb +194 -0
  271. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_enum.rb +199 -0
  272. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_extended_date_support.rb +261 -0
  273. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_extended_integer_support.rb +116 -0
  274. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_hstore.rb +353 -0
  275. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_hstore_ops.rb +418 -0
  276. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_inet.rb +136 -0
  277. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_inet_ops.rb +204 -0
  278. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_interval.rb +224 -0
  279. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_json.rb +644 -0
  280. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_json_ops.rb +1460 -0
  281. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_loose_count.rb +39 -0
  282. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_multirange.rb +367 -0
  283. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_range.rb +572 -0
  284. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_range_ops.rb +195 -0
  285. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_row.rb +585 -0
  286. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_row_ops.rb +217 -0
  287. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_schema_caching.rb +90 -0
  288. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_static_cache_updater.rb +144 -0
  289. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pg_timestamptz.rb +52 -0
  290. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/pretty_table.rb +40 -0
  291. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/provenance.rb +108 -0
  292. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/query.rb +85 -0
  293. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/query_blocker.rb +172 -0
  294. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/round_timestamps.rb +49 -0
  295. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  296. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/s.rb +60 -0
  297. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/schema_caching.rb +103 -0
  298. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/schema_dumper.rb +550 -0
  299. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/select_remove.rb +52 -0
  300. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  301. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/server_block.rb +179 -0
  302. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/server_logging.rb +61 -0
  303. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/set_literalizer.rb +39 -0
  304. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/split_array_nil.rb +80 -0
  305. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/sql_comments.rb +203 -0
  306. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/sql_expr.rb +23 -0
  307. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
  308. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/sqlite_json_ops.rb +313 -0
  309. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/stdio_logger.rb +48 -0
  310. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/string_agg.rb +194 -0
  311. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/string_date_time.rb +48 -0
  312. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/symbol_aref.rb +55 -0
  313. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  314. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/symbol_as.rb +23 -0
  315. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  316. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/synchronize_sql.rb +45 -0
  317. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/temporarily_release_connection.rb +178 -0
  318. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/thread_local_timezones.rb +59 -0
  319. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/to_dot.rb +169 -0
  320. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/transaction_connection_validator.rb +78 -0
  321. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/extensions/virtual_row_method_block.rb +45 -0
  322. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/associations.rb +4066 -0
  323. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/base.rb +2360 -0
  324. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/dataset_module.rb +36 -0
  325. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/default_inflections.rb +47 -0
  326. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/errors.rb +67 -0
  327. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/exceptions.rb +67 -0
  328. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/inflections.rb +151 -0
  329. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model/plugins.rb +165 -0
  330. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/model.rb +85 -0
  331. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/accessed_columns.rb +63 -0
  332. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/active_model.rb +124 -0
  333. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/after_initialize.rb +39 -0
  334. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/association_dependencies.rb +106 -0
  335. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  336. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  337. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/association_pks.rb +316 -0
  338. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/association_proxies.rb +131 -0
  339. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/async_thread_pool.rb +39 -0
  340. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
  341. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/auto_validations.rb +302 -0
  342. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  343. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/before_after_save.rb +8 -0
  344. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/blacklist_security.rb +104 -0
  345. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/boolean_readers.rb +59 -0
  346. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/boolean_subsets.rb +64 -0
  347. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/caching.rb +164 -0
  348. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/class_table_inheritance.rb +439 -0
  349. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/class_table_inheritance_constraint_validations.rb +82 -0
  350. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/column_conflicts.rb +108 -0
  351. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/column_encryption.rb +749 -0
  352. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/column_select.rb +61 -0
  353. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/columns_updated.rb +42 -0
  354. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/composition.rb +205 -0
  355. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  356. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/constraint_validations.rb +259 -0
  357. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/csv_serializer.rb +196 -0
  358. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/dataset_associations.rb +152 -0
  359. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/def_dataset_method.rb +90 -0
  360. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/defaults_setter.rb +158 -0
  361. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/delay_add_association.rb +53 -0
  362. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/deprecated_associations.rb +151 -0
  363. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/detect_unnecessary_association_options.rb +164 -0
  364. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/dirty.rb +276 -0
  365. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/eager_each.rb +88 -0
  366. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  367. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  368. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/enum.rb +124 -0
  369. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/error_splitter.rb +61 -0
  370. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/finder.rb +248 -0
  371. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/forbid_lazy_load.rb +229 -0
  372. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/force_encoding.rb +78 -0
  373. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/hook_class_methods.rb +110 -0
  374. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/input_transformer.rb +89 -0
  375. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/insert_conflict.rb +76 -0
  376. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/insert_returning_select.rb +81 -0
  377. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/inspect_pk.rb +44 -0
  378. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/instance_filters.rb +138 -0
  379. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/instance_hooks.rb +115 -0
  380. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/instance_specific_default.rb +113 -0
  381. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/inverted_subsets.rb +60 -0
  382. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/json_serializer.rb +445 -0
  383. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/lazy_attributes.rb +126 -0
  384. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/list.rb +208 -0
  385. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/many_through_many.rb +437 -0
  386. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/modification_detection.rb +102 -0
  387. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/mssql_optimistic_locking.rb +65 -0
  388. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/nested_attributes.rb +340 -0
  389. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/optimistic_locking.rb +54 -0
  390. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/optimistic_locking_base.rb +55 -0
  391. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/paged_operations.rb +184 -0
  392. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/pg_array_associations.rb +580 -0
  393. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/pg_auto_constraint_validations.rb +361 -0
  394. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/pg_auto_validate_enums.rb +88 -0
  395. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/pg_eager_any_typed_array.rb +95 -0
  396. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/pg_row.rb +79 -0
  397. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/pg_xmin_optimistic_locking.rb +109 -0
  398. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/prepared_statements.rb +196 -0
  399. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  400. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/primary_key_lookup_check_values.rb +154 -0
  401. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/rcte_tree.rb +343 -0
  402. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/require_valid_schema.rb +67 -0
  403. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/serialization.rb +242 -0
  404. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/serialization_modification_detection.rb +87 -0
  405. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/sharding.rb +126 -0
  406. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/single_statement_dataset_destroy.rb +49 -0
  407. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/single_table_inheritance.rb +271 -0
  408. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/singular_table_names.rb +33 -0
  409. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/skip_create_refresh.rb +37 -0
  410. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  411. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/split_values.rb +81 -0
  412. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/sql_comments.rb +194 -0
  413. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/static_cache.rb +315 -0
  414. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/static_cache_cache.rb +94 -0
  415. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/string_stripper.rb +59 -0
  416. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/subclasses.rb +96 -0
  417. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/subset_conditions.rb +128 -0
  418. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/subset_static_cache.rb +278 -0
  419. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/table_select.rb +50 -0
  420. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/tactical_eager_loading.rb +216 -0
  421. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/throw_failures.rb +110 -0
  422. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/timestamps.rb +109 -0
  423. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/touch.rb +153 -0
  424. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/tree.rb +188 -0
  425. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/typecast_on_load.rb +90 -0
  426. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/unlimited_update.rb +27 -0
  427. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/unused_associations.rb +529 -0
  428. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/update_or_create.rb +64 -0
  429. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/update_primary_key.rb +72 -0
  430. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/update_refresh.rb +88 -0
  431. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/uuid.rb +70 -0
  432. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/validate_associated.rb +85 -0
  433. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/validation_class_methods.rb +460 -0
  434. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/validation_contexts.rb +49 -0
  435. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/validation_helpers.rb +351 -0
  436. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/validation_helpers_generic_type_messages.rb +73 -0
  437. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/whitelist_security.rb +122 -0
  438. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/plugins/xml_serializer.rb +411 -0
  439. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/sql.rb +2061 -0
  440. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/timezones.rb +254 -0
  441. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel/version.rb +25 -0
  442. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sequel-5.102.0/lib/sequel.rb +3 -0
  443. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/CHANGELOG.md +1014 -0
  444. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/CONTRIBUTING.md +60 -0
  445. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/FAQ.md +399 -0
  446. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/INSTALLATION.md +267 -0
  447. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/LICENSE +23 -0
  448. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/README.md +198 -0
  449. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/dependencies.yml +13 -0
  450. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/aggregator.c +270 -0
  451. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/aggregator.h +10 -0
  452. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/backup.c +190 -0
  453. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/backup.h +15 -0
  454. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/database.c +1006 -0
  455. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/database.h +28 -0
  456. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/exception.c +122 -0
  457. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/exception.h +12 -0
  458. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/extconf.rb +297 -0
  459. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/sqlite3.c +225 -0
  460. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/sqlite3_ruby.h +48 -0
  461. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/statement.c +739 -0
  462. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/statement.h +17 -0
  463. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/ext/sqlite3/timespec.h +20 -0
  464. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/3.2/sqlite3_native.so +0 -0
  465. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/3.3/sqlite3_native.so +0 -0
  466. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/3.4/sqlite3_native.so +0 -0
  467. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/4.0/sqlite3_native.so +0 -0
  468. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/constants.rb +198 -0
  469. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/database.rb +798 -0
  470. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/errors.rb +88 -0
  471. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/fork_safety.rb +66 -0
  472. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/pragmas.rb +648 -0
  473. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/resultset.rb +96 -0
  474. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/statement.rb +190 -0
  475. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/value.rb +54 -0
  476. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/version.rb +4 -0
  477. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3/version_info.rb +17 -0
  478. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/sqlite3-2.9.1-x64-mingw-ucrt/lib/sqlite3.rb +19 -0
  479. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/Gemfile +10 -0
  480. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/LICENSE.txt +22 -0
  481. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/README.md +63 -0
  482. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/Rakefile +10 -0
  483. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/accesslog.rb +157 -0
  484. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/cgi.rb +313 -0
  485. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/compat.rb +36 -0
  486. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/config.rb +158 -0
  487. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/cookie.rb +172 -0
  488. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/htmlutils.rb +30 -0
  489. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth/authenticator.rb +117 -0
  490. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth/basicauth.rb +116 -0
  491. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth/digestauth.rb +395 -0
  492. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth/htdigest.rb +132 -0
  493. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth/htgroup.rb +97 -0
  494. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth/htpasswd.rb +158 -0
  495. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth/userdb.rb +53 -0
  496. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpauth.rb +96 -0
  497. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpproxy.rb +354 -0
  498. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httprequest.rb +668 -0
  499. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpresponse.rb +588 -0
  500. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/https.rb +152 -0
  501. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpserver.rb +294 -0
  502. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpservlet/abstract.rb +152 -0
  503. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  504. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpservlet/cgihandler.rb +126 -0
  505. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpservlet/erbhandler.rb +88 -0
  506. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpservlet/filehandler.rb +552 -0
  507. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpservlet/prochandler.rb +48 -0
  508. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpservlet.rb +23 -0
  509. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpstatus.rb +194 -0
  510. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httputils.rb +543 -0
  511. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/httpversion.rb +76 -0
  512. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/log.rb +156 -0
  513. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/server.rb +380 -0
  514. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/ssl.rb +219 -0
  515. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/utils.rb +265 -0
  516. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick/version.rb +18 -0
  517. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/lib/webrick.rb +232 -0
  518. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/accesslog.rbs +24 -0
  519. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/cgi.rbs +92 -0
  520. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/compat.rbs +18 -0
  521. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/config.rbs +17 -0
  522. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/cookie.rbs +37 -0
  523. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/htmlutils.rbs +5 -0
  524. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth/authenticator.rbs +55 -0
  525. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth/basicauth.rbs +29 -0
  526. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth/digestauth.rbs +85 -0
  527. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth/htdigest.rbs +31 -0
  528. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth/htgroup.rbs +21 -0
  529. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth/htpasswd.rbs +31 -0
  530. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth/userdb.rbs +13 -0
  531. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpauth.rbs +13 -0
  532. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpproxy.rbs +61 -0
  533. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httprequest.rbs +167 -0
  534. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpresponse.rbs +117 -0
  535. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/https.rbs +49 -0
  536. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpserver.rbs +71 -0
  537. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpservlet/abstract.rbs +36 -0
  538. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpservlet/cgi_runner.rbs +3 -0
  539. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpservlet/cgihandler.rbs +23 -0
  540. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpservlet/erbhandler.rbs +17 -0
  541. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpservlet/filehandler.rbs +76 -0
  542. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpservlet/prochandler.rbs +21 -0
  543. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpservlet.rbs +4 -0
  544. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpstatus.rbs +255 -0
  545. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httputils.rbs +116 -0
  546. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/httpversion.rbs +17 -0
  547. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/log.rbs +93 -0
  548. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/manifest.yaml +8 -0
  549. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/server.rbs +57 -0
  550. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/ssl.rbs +19 -0
  551. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/utils.rbs +122 -0
  552. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/sig/version.rbs +3 -0
  553. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/gems/webrick-1.9.2/webrick.gemspec +105 -0
  554. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/specifications/bigdecimal-4.0.1.gemspec +25 -0
  555. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/specifications/rack-3.2.5.gemspec +31 -0
  556. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/specifications/rackup-2.3.1.gemspec +26 -0
  557. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/specifications/sequel-5.102.0.gemspec +36 -0
  558. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/specifications/sqlite3-2.9.1-x64-mingw-ucrt.gemspec +25 -0
  559. data/examples/demo_crud/vendor/bundle/ruby/3.4.0/specifications/webrick-1.9.2.gemspec +22 -0
  560. data/lib/serrano/application.rb +36 -0
  561. data/lib/serrano/cli/base.rb +92 -0
  562. data/lib/serrano/cli/generate.rb +285 -0
  563. data/lib/serrano/cli/templates/controller.rb.tt +92 -0
  564. data/lib/serrano/cli/templates/entity.rb.tt +43 -0
  565. data/lib/serrano/cli/templates/entity_validatable.rb.tt +136 -0
  566. data/lib/serrano/cli/templates/migration.rb.tt +19 -0
  567. data/lib/serrano/cli/templates/new_default_config.ru.tt +6 -0
  568. data/lib/serrano/cli/templates/new_default_db.rb.tt +3 -0
  569. data/lib/serrano/cli/templates/new_default_gemfile.tt +6 -0
  570. data/lib/serrano/cli/templates/new_minimal_config.ru.tt +5 -0
  571. data/lib/serrano/cli/templates/new_minimal_gemfile.tt +4 -0
  572. data/lib/serrano/cli/templates/new_project_config.ru.tt +8 -0
  573. data/lib/serrano/cli/templates/new_project_db.rb.tt +3 -0
  574. data/lib/serrano/cli/templates/new_project_gemfile.tt +8 -0
  575. data/lib/serrano/cli/templates/repository.rb.tt +42 -0
  576. data/lib/serrano/cli/templates/service_create.rb.tt +40 -0
  577. data/lib/serrano/cli/templates/service_destroy.rb.tt +20 -0
  578. data/lib/serrano/cli/templates/service_generic.rb.tt +15 -0
  579. data/lib/serrano/cli/templates/service_index.rb.tt +17 -0
  580. data/lib/serrano/cli/templates/service_show.rb.tt +20 -0
  581. data/lib/serrano/cli/templates/service_update.rb.tt +41 -0
  582. data/lib/serrano/dispatcher.rb +53 -0
  583. data/lib/serrano/request.rb +78 -0
  584. data/lib/serrano/response.rb +33 -0
  585. data/lib/serrano/router.rb +80 -0
  586. data/lib/serrano/version.rb +5 -0
  587. data/lib/serrano.rb +11 -0
  588. metadata +768 -0
@@ -0,0 +1,1460 @@
1
+ # frozen-string-literal: true
2
+ #
3
+ # The pg_json_ops extension adds support to Sequel's DSL to make
4
+ # it easier to call PostgreSQL JSON functions and operators (added
5
+ # first in PostgreSQL 9.3). It also supports the JSONB functions
6
+ # and operators added in PostgreSQL 9.4, as well as additional
7
+ # functions and operators added in later versions.
8
+ #
9
+ # To load the extension:
10
+ #
11
+ # Sequel.extension :pg_json_ops
12
+ #
13
+ # The most common usage is passing an expression to Sequel.pg_json_op
14
+ # or Sequel.pg_jsonb_op:
15
+ #
16
+ # j = Sequel.pg_json_op(:json_column)
17
+ # jb = Sequel.pg_jsonb_op(:jsonb_column)
18
+ #
19
+ # If you have also loaded the pg_json extension, you can use
20
+ # Sequel.pg_json or Sequel.pg_jsonb as well:
21
+ #
22
+ # j = Sequel.pg_json(:json_column)
23
+ # jb = Sequel.pg_jsonb(:jsonb_column)
24
+ #
25
+ # Also, on most Sequel expression objects, you can call the pg_json
26
+ # or pg_jsonb method:
27
+ #
28
+ # j = Sequel[:json_column].pg_json
29
+ # jb = Sequel[:jsonb_column].pg_jsonb
30
+ #
31
+ # If you have loaded the {core_extensions extension}[rdoc-ref:doc/core_extensions.rdoc],
32
+ # or you have loaded the core_refinements extension
33
+ # and have activated refinements for the file, you can also use Symbol#pg_json or
34
+ # Symbol#pg_jsonb:
35
+ #
36
+ # j = :json_column.pg_json
37
+ # jb = :jsonb_column.pg_jsonb
38
+ #
39
+ # This creates a Sequel::Postgres::JSONOp or Sequel::Postgres::JSONBOp object that can be used
40
+ # for easier querying. The following methods are available for both JSONOp and JSONBOp instances:
41
+ #
42
+ # j[1] # (json_column -> 1)
43
+ # j[%w'a b'] # (json_column #> ARRAY['a','b'])
44
+ # j.get_text(1) # (json_column ->> 1)
45
+ # j.get_text(%w'a b') # (json_column #>> ARRAY['a','b'])
46
+ # j.extract('a', 'b') # json_extract_path(json_column, 'a', 'b')
47
+ # j.extract_text('a', 'b') # json_extract_path_text(json_column, 'a', 'b')
48
+ #
49
+ # j.array_length # json_array_length(json_column)
50
+ # j.array_elements # json_array_elements(json_column)
51
+ # j.array_elements_text # json_array_elements_text(json_column)
52
+ # j.each # json_each(json_column)
53
+ # j.each_text # json_each_text(json_column)
54
+ # j.keys # json_object_keys(json_column)
55
+ # j.typeof # json_typeof(json_column)
56
+ # j.strip_nulls # json_strip_nulls(json_column)
57
+ #
58
+ # j.populate(:a) # json_populate_record(:a, json_column)
59
+ # j.populate_set(:a) # json_populate_recordset(:a, json_column)
60
+ # j.to_record # json_to_record(json_column)
61
+ # j.to_recordset # json_to_recordset(json_column)
62
+ #
63
+ # There are additional methods are are only supported on JSONBOp instances:
64
+ #
65
+ # j - 1 # (jsonb_column - 1)
66
+ # j.concat(:h) # (jsonb_column || h)
67
+ # j.contain_all(:a) # (jsonb_column ?& a)
68
+ # j.contain_any(:a) # (jsonb_column ?| a)
69
+ # j.contains(:h) # (jsonb_column @> h)
70
+ # j.contained_by(:h) # (jsonb_column <@ h)
71
+ # j.delete_path(%w'0 a') # (jsonb_column #- ARRAY['0','a'])
72
+ # j.has_key?('a') # (jsonb_column ? 'a')
73
+ # j.insert(%w'0 a', 'a'=>1) # jsonb_insert(jsonb_column, ARRAY[0, 'a'], '{"a":1}'::jsonb, false)
74
+ # j.pretty # jsonb_pretty(jsonb_column)
75
+ # j.set(%w'0 a', :h) # jsonb_set(jsonb_column, ARRAY['0','a'], h, true)
76
+ #
77
+ # j.set_lax(%w'0 a', :h, false, 'raise_exception')
78
+ # # jsonb_set_lax(jsonb_column, ARRAY['0','a'], h, false, 'raise_exception')
79
+ #
80
+ # On PostgreSQL 12+ SQL/JSON path functions and operators are supported:
81
+ #
82
+ # j.path_exists('$.foo') # (jsonb_column @? '$.foo')
83
+ # j.path_match('$.foo') # (jsonb_column @@ '$.foo')
84
+ #
85
+ # j.path_exists!('$.foo') # jsonb_path_exists(jsonb_column, '$.foo')
86
+ # j.path_match!('$.foo') # jsonb_path_match(jsonb_column, '$.foo')
87
+ # j.path_query('$.foo') # jsonb_path_query(jsonb_column, '$.foo')
88
+ # j.path_query_array('$.foo') # jsonb_path_query_array(jsonb_column, '$.foo')
89
+ # j.path_query_first('$.foo') # jsonb_path_query_first(jsonb_column, '$.foo')
90
+ #
91
+ # For the PostgreSQL 12+ SQL/JSON path functions, one argument is required (+path+) and
92
+ # two more arguments are optional (+vars+ and +silent+). +path+ specifies the JSON path.
93
+ # +vars+ specifies a hash or a string in JSON format of named variables to be
94
+ # substituted in +path+. +silent+ specifies whether errors are suppressed. By default,
95
+ # errors are not suppressed.
96
+ #
97
+ # On PostgreSQL 13+ timezone-aware SQL/JSON path functions and operators are supported:
98
+ #
99
+ # j.path_exists_tz!('$.foo') # jsonb_path_exists_tz(jsonb_column, '$.foo')
100
+ # j.path_match_tz!('$.foo') # jsonb_path_match_tz(jsonb_column, '$.foo')
101
+ # j.path_query_tz('$.foo') # jsonb_path_query_tz(jsonb_column, '$.foo')
102
+ # j.path_query_array_tz('$.foo') # jsonb_path_query_array_tz(jsonb_column, '$.foo')
103
+ # j.path_query_first_tz('$.foo') # jsonb_path_query_first_tz(jsonb_column, '$.foo')
104
+ #
105
+ # On PostgreSQL 14+, The JSONB <tt>[]</tt> method will use subscripts instead of being
106
+ # the same as +get+, if the value being wrapped is an identifer:
107
+ #
108
+ # Sequel.pg_jsonb_op(:jsonb_column)[1] # jsonb_column[1]
109
+ # Sequel.pg_jsonb_op(:jsonb_column)[1][2] # jsonb_column[1][2]
110
+ # Sequel.pg_jsonb_op(Sequel[:j][:b])[1] # j.b[1]
111
+ #
112
+ # This support allows you to use JSONB subscripts in UPDATE statements to update only
113
+ # part of a column:
114
+ #
115
+ # c = Sequel.pg_jsonb_op(:c)
116
+ # DB[:t].update(c['key1'] => '1', c['key2'] => '"a"')
117
+ # # UPDATE "t" SET "c"['key1'] = '1', "c"['key2'] = '"a"'
118
+ #
119
+ # Note that you have to provide the value of a JSONB subscript as a JSONB value, so this
120
+ # will update +key1+ to use the number <tt>1</tt>, and +key2+ to use the string <tt>a</tt>.
121
+ # For this reason it may be simpler to use +to_json+:
122
+ #
123
+ # c = Sequel.pg_jsonb_op(:c)
124
+ # DB[:t].update(c['key1'] => 1.to_json, c['key2'] => "a".to_json)
125
+ #
126
+ # On PostgreSQL 16+, the <tt>IS [NOT] JSON</tt> operator is supported:
127
+ #
128
+ # j.is_json # j IS JSON
129
+ # j.is_json(type: :object) # j IS JSON OBJECT
130
+ # j.is_json(type: :object, unique: true) # j IS JSON OBJECT WITH UNIQUE
131
+ # j.is_not_json # j IS NOT JSON
132
+ # j.is_not_json(type: :array) # j IS NOT JSON ARRAY
133
+ # j.is_not_json(unique: true) # j IS NOT JSON WITH UNIQUE
134
+ #
135
+ # On PostgreSQL 17+, the additional JSON functions are supported (see method documentation
136
+ # for additional options):
137
+ #
138
+ # j.exists('$.foo') # json_exists(jsonb_column, '$.foo')
139
+ # j.value('$.foo') # json_value(jsonb_column, '$.foo')
140
+ # j.query('$.foo') # json_query(jsonb_column, '$.foo')
141
+ #
142
+ # j.exists('$.foo', passing: {a: 1}) # json_exists(jsonb_column, '$.foo' PASSING 1 AS a)
143
+ # j.value('$.foo', returning: Time) # json_value(jsonb_column, '$.foo' RETURNING timestamp)
144
+ # j.query('$.foo', wrapper: true) # json_query(jsonb_column, '$.foo' WITH WRAPPER)
145
+ #
146
+ # j.table('$.foo') do
147
+ # String :bar
148
+ # Integer :baz
149
+ # end
150
+ # # json_table("jsonb_column", '$.foo' COLUMNS("bar" text, "baz" integer))
151
+ #
152
+ # j.table('$.foo', passing: {a: 1}) do
153
+ # ordinality :id
154
+ # String :bar, format: :json, on_error: :empty_object
155
+ # nested '$.baz' do
156
+ # Integer :q, path: '$.quux', on_empty: :error
157
+ # end
158
+ # exists :x, Date, on_error: false
159
+ # end
160
+ # # json_table(jsonb_column, '$.foo' PASSING 1 AS a COLUMNS(
161
+ # # "id" FOR ORDINALITY,
162
+ # # "bar" text FORMAT JSON EMPTY OBJECT ON ERROR,
163
+ # # NESTED '$.baz' COLUMNS(
164
+ # # "q" integer PATH '$.quux' ERROR ON EMPTY
165
+ # # ),
166
+ # # "d" date EXISTS FALSE ON ERROR
167
+ # # ))
168
+ #
169
+ # On PostgreSQL 18+, strip_nulls can take an argument for whether to strip in arrays
170
+ #
171
+ # j.strip_nulls(in_arrays: true) # json_strip_nulls(json_column, true)
172
+ # j.strip_nulls(in_arrays: false) # json_strip_nulls(json_column, false)
173
+ #
174
+ # If you are also using the pg_json extension, you should load it before
175
+ # loading this extension. Doing so will allow you to use the #op method on
176
+ # JSONHash, JSONHarray, JSONBHash, and JSONBArray, allowing you to perform json/jsonb operations
177
+ # on json/jsonb literals.
178
+ #
179
+ # In order to get the automatic conversion from a ruby array to a PostgreSQL array
180
+ # (as shown in the #[] and #get_text examples above), you need to load the pg_array
181
+ # extension.
182
+ #
183
+ # Related modules: Sequel::Postgres::JSONBaseOp, Sequel::Postgres::JSONOp,
184
+ # Sequel::Postgres::JSONBOp
185
+
186
+ #
187
+ module Sequel
188
+ module Postgres
189
+ # The JSONBaseOp class is a simple container for a single object that
190
+ # defines methods that yield Sequel expression objects representing
191
+ # PostgreSQL json operators and functions.
192
+ #
193
+ # In the method documentation examples, assume that:
194
+ #
195
+ # json_op = Sequel.pg_json(:json)
196
+ class JSONBaseOp < Sequel::SQL::Wrapper
197
+ GET = ["(".freeze, " -> ".freeze, ")".freeze].freeze
198
+ GET_TEXT = ["(".freeze, " ->> ".freeze, ")".freeze].freeze
199
+ GET_PATH = ["(".freeze, " #> ".freeze, ")".freeze].freeze
200
+ GET_PATH_TEXT = ["(".freeze, " #>> ".freeze, ")".freeze].freeze
201
+
202
+ IS_JSON = ["(".freeze, " IS JSON".freeze, "".freeze, ")".freeze].freeze
203
+ IS_NOT_JSON = ["(".freeze, " IS NOT JSON".freeze, "".freeze, ")".freeze].freeze
204
+ EMPTY_STRING = Sequel::LiteralString.new('').freeze
205
+ WITH_UNIQUE = Sequel::LiteralString.new(' WITH UNIQUE').freeze
206
+ IS_JSON_MAP = {
207
+ nil => EMPTY_STRING,
208
+ :value => Sequel::LiteralString.new(' VALUE').freeze,
209
+ :scalar => Sequel::LiteralString.new(' SCALAR').freeze,
210
+ :object => Sequel::LiteralString.new(' OBJECT').freeze,
211
+ :array => Sequel::LiteralString.new(' ARRAY').freeze
212
+ }.freeze
213
+
214
+ # Get JSON array element or object field as json. If an array is given,
215
+ # gets the object at the specified path.
216
+ #
217
+ # json_op[1] # (json -> 1)
218
+ # json_op['a'] # (json -> 'a')
219
+ # json_op[%w'a b'] # (json #> ARRAY['a', 'b'])
220
+ def [](key)
221
+ if is_array?(key)
222
+ json_op(GET_PATH, wrap_array(key))
223
+ else
224
+ json_op(GET, key)
225
+ end
226
+ end
227
+ alias get []
228
+
229
+ # Returns a set of json values for the elements in the json array.
230
+ #
231
+ # json_op.array_elements # json_array_elements(json)
232
+ def array_elements
233
+ function(:array_elements)
234
+ end
235
+
236
+ # Returns a set of text values for the elements in the json array.
237
+ #
238
+ # json_op.array_elements_text # json_array_elements_text(json)
239
+ def array_elements_text
240
+ function(:array_elements_text)
241
+ end
242
+
243
+ # Get the length of the outermost json array.
244
+ #
245
+ # json_op.array_length # json_array_length(json)
246
+ def array_length
247
+ Sequel::SQL::NumericExpression.new(:NOOP, function(:array_length))
248
+ end
249
+
250
+ # Returns a set of key and value pairs, where the keys
251
+ # are text and the values are JSON.
252
+ #
253
+ # json_op.each # json_each(json)
254
+ def each
255
+ function(:each)
256
+ end
257
+
258
+ # Returns a set of key and value pairs, where the keys
259
+ # and values are both text.
260
+ #
261
+ # json_op.each_text # json_each_text(json)
262
+ def each_text
263
+ function(:each_text)
264
+ end
265
+
266
+ # Return whether the given JSON path yields any items in the receiver.
267
+ # Options:
268
+ #
269
+ # :on_error :: How to handle errors when evaluating the JSON path expression.
270
+ # true :: Return true
271
+ # false :: Return false (default behavior)
272
+ # :null :: Return nil
273
+ # :error :: raise a DatabaseError
274
+ # :passing :: Variables to pass to the JSON path expression. Keys are variable
275
+ # names, values are the values of the variable.
276
+ #
277
+ # json_op.exists("$.a") # json_exists(json, '$.a')
278
+ # json_op.exists("$.a", passing: {a: 1}) # json_exists(json, '$.a' PASSING 1 AS a)
279
+ # json_op.exists("$.a", on_error: :error) # json_exists(json, '$.a' ERROR ON ERROR)
280
+ def exists(path, opts=OPTS)
281
+ Sequel::SQL::BooleanExpression.new(:NOOP, JSONExistsOp.new(self, path, opts))
282
+ end
283
+
284
+ # Returns a JSON value for the object at the given path.
285
+ #
286
+ # json_op.extract('a') # json_extract_path(json, 'a')
287
+ # json_op.extract('a', 'b') # json_extract_path(json, 'a', 'b')
288
+ def extract(*a)
289
+ self.class.new(function(:extract_path, *a))
290
+ end
291
+
292
+ # Returns a text value for the object at the given path.
293
+ #
294
+ # json_op.extract_text('a') # json_extract_path_text(json, 'a')
295
+ # json_op.extract_text('a', 'b') # json_extract_path_text(json, 'a', 'b')
296
+ def extract_text(*a)
297
+ Sequel::SQL::StringExpression.new(:NOOP, function(:extract_path_text, *a))
298
+ end
299
+
300
+ # Get JSON array element or object field as text. If an array is given,
301
+ # gets the object at the specified path.
302
+ #
303
+ # json_op.get_text(1) # (json ->> 1)
304
+ # json_op.get_text('a') # (json ->> 'a')
305
+ # json_op.get_text(%w'a b') # (json #>> ARRAY['a', 'b'])
306
+ def get_text(key)
307
+ if is_array?(key)
308
+ json_op(GET_PATH_TEXT, wrap_array(key))
309
+ else
310
+ json_op(GET_TEXT, key)
311
+ end
312
+ end
313
+
314
+ # Return whether the json object can be parsed as JSON.
315
+ #
316
+ # Options:
317
+ # :type :: Check whether the json object can be parsed as a specific type
318
+ # of JSON (:value, :scalar, :object, :array).
319
+ # :unique :: Check JSON objects for unique keys.
320
+ #
321
+ # json_op.is_json # json IS JSON
322
+ # json_op.is_json(type: :object) # json IS JSON OBJECT
323
+ # json_op.is_json(unique: true) # json IS JSON WITH UNIQUE
324
+ def is_json(opts=OPTS)
325
+ _is_json(IS_JSON, opts)
326
+ end
327
+
328
+ # Return whether the json object cannot be parsed as JSON. The opposite
329
+ # of #is_json. See #is_json for options.
330
+ #
331
+ # json_op.is_not_json # json IS NOT JSON
332
+ # json_op.is_not_json(type: :object) # json IS NOT JSON OBJECT
333
+ # json_op.is_not_json(unique: true) # json IS NOT JSON WITH UNIQUE
334
+ def is_not_json(opts=OPTS)
335
+ _is_json(IS_NOT_JSON, opts)
336
+ end
337
+
338
+ # Returns a set of keys AS text in the json object.
339
+ #
340
+ # json_op.keys # json_object_keys(json)
341
+ def keys
342
+ function(:object_keys)
343
+ end
344
+
345
+ # Expands the given argument using the columns in the json.
346
+ #
347
+ # json_op.populate(arg) # json_populate_record(arg, json)
348
+ def populate(arg)
349
+ SQL::Function.new(function_name(:populate_record), arg, self)
350
+ end
351
+
352
+ # Expands the given argument using the columns in the json.
353
+ #
354
+ # json_op.populate_set(arg) # json_populate_recordset(arg, json)
355
+ def populate_set(arg)
356
+ SQL::Function.new(function_name(:populate_recordset), arg, self)
357
+ end
358
+
359
+ # Return the result of applying the JSON path expression to the receiver, by default
360
+ # returning results as jsonb. Options:
361
+ #
362
+ # :on_empty :: How to handle case where path expression yields an empty set.
363
+ # Uses same values as :on_error option.
364
+ # :on_error :: How to handle errors when evaluating the JSON path expression:
365
+ # :null :: Return nil (default)
366
+ # :empty_array :: Return an empty array
367
+ # :empty_object :: Return an empty object
368
+ # :error :: raise a DatabaseError
369
+ # any other value :: used as default value
370
+ # :passing :: Variables to pass to the JSON path expression. Keys are variable
371
+ # names, values are the values of the variable.
372
+ # :returning :: The data type to return (jsonb by default)
373
+ # :wrapper :: How to wrap returned values:
374
+ # true, :unconditional :: Always wrap returning values in an array
375
+ # :conditional :: Only wrap multiple return values in an array
376
+ # :omit_quotes :: Do not wrap scalar strings in quotes
377
+ #
378
+ # json_op.query("$.a") # json_query(json, '$.a')
379
+ # json_op.query("$.a", passing: {a: 1}) # json_query(json, '$.a' PASSING 1 AS a)
380
+ # json_op.query("$.a", on_error: :empty_array) # json_query(json, '$.a' EMPTY ARRAY ON ERROR)
381
+ # json_op.query("$.a", returning: Time) # json_query(json, '$.a' RETURNING timestamp)
382
+ # json_op.query("$.a", on_empty: 2) # json_query(json, '$.a' DEFAULT 2 ON EMPTY)
383
+ # json_op.query("$.a", wrapper: true) # json_query(json, '$.a' WITH WRAPPER)
384
+ def query(path, opts=OPTS)
385
+ self.class.new(JSONQueryOp.new(self, path, opts))
386
+ end
387
+
388
+ # Returns a json value stripped of all internal null values. Options:
389
+ #
390
+ # :in_arrays :: Whether to strip null values in JSON arrays
391
+ #
392
+ # json_op.strip_nulls # json_strip_nulls(json)
393
+ # json_op.strip_nulls(in_arrays: true) # json_strip_nulls(json, true)
394
+ # json_op.strip_nulls(in_arrays: false) # json_strip_nulls(json, false)
395
+ def strip_nulls(opts=OPTS)
396
+ in_arrays = opts[:in_arrays]
397
+ f = if in_arrays.nil?
398
+ function(:strip_nulls)
399
+ else
400
+ function(:strip_nulls, in_arrays)
401
+ end
402
+
403
+ self.class.new(f)
404
+ end
405
+
406
+ # Returns json_table SQL function expression, querying JSON data and returning
407
+ # the results as a relational view, which can be accessed similarly to a regular
408
+ # SQL table. This accepts a block that is handled in a similar manner to
409
+ # Database#create_table, though it operates differently.
410
+ #
411
+ # Table level options:
412
+ #
413
+ # :on_error :: How to handle errors when evaluating the JSON path expression.
414
+ # :empty_array :: Return an empty array/result set
415
+ # :error :: raise a DatabaseError
416
+ # :passing :: Variables to pass to the JSON path expression. Keys are variable
417
+ # names, values are the values of the variable.
418
+ #
419
+ # Inside the block, the following methods can be used:
420
+ #
421
+ # ordinality(name) :: Include a FOR ORDINALITY column, which operates similar to an
422
+ # autoincrementing primary key.
423
+ # column(name, type, opts={}) :: Return a normal column that uses the given type.
424
+ # exists(name, type, opts={}) :: Return a boolean column for whether the JSON path yields any values.
425
+ # nested(path, &block) :: Extract nested data from the result set at the given path.
426
+ # This block is treated the same as a json_table block, and
427
+ # arbitrary levels of nesting are supported.
428
+ #
429
+ # The +column+ method supports the following options:
430
+ #
431
+ # :path :: JSON path to the object (the default is <tt>$.NAME</tt>, where +NAME+ is the
432
+ # name of the column).
433
+ # :format :: Set to +:json+ to use FORMAT JSON, when you expect the value to be a
434
+ # valid JSON object.
435
+ # :on_empty, :on_error :: How to handle case where JSON path evaluation is empty or
436
+ # results in an error. Values supported are:
437
+ # :empty_array :: Return empty array (requires <tt>format: :json</tt>)
438
+ # :empty_object :: Return empty object (requires <tt>format: :json</tt>)
439
+ # :error :: Raise a DatabaseError
440
+ # :null :: Return nil (NULL)
441
+ # :wrapper :: How to wrap returned values:
442
+ # true, :unconditional :: Always wrap returning values in an array
443
+ # :conditional :: Only wrap multiple return values in an array
444
+ # :keep_quotes :: Wrap scalar strings in quotes
445
+ # :omit_quotes :: Do not wrap scalar strings in quotes
446
+ #
447
+ # The +exists+ method supports the following options:
448
+ #
449
+ # :path :: JSON path to the object (same as +column+ option)
450
+ # :on_error :: How to handle case where JSON path evaluation results in an error.
451
+ # Values supported are:
452
+ # :error :: Raise a DatabaseError
453
+ # true :: Return true
454
+ # false :: Return false
455
+ # :null :: Return nil (NULL)
456
+ #
457
+ # Inside the block, methods for Ruby class names are also supported, allowing you
458
+ # to use syntax such as:
459
+ #
460
+ # json_op.table('$.a') do
461
+ # String :b
462
+ # Integer :c, path: '$.d'
463
+ # end
464
+ #
465
+ # One difference between this method and Database#create_table is that method_missing
466
+ # is not supported inside the block. Use the +column+ method for PostgreSQL types
467
+ # that are not mapped to Ruby classes.
468
+ def table(path, opts=OPTS, &block)
469
+ JSONTableOp.new(self, path, opts, &block)
470
+ end
471
+
472
+ # Builds arbitrary record from json object. You need to define the
473
+ # structure of the record using #as on the resulting object:
474
+ #
475
+ # json_op.to_record.as(:x, [Sequel.lit('a integer'), Sequel.lit('b text')]) # json_to_record(json) AS x(a integer, b text)
476
+ def to_record
477
+ function(:to_record)
478
+ end
479
+
480
+ # Builds arbitrary set of records from json array of objects. You need to define the
481
+ # structure of the records using #as on the resulting object:
482
+ #
483
+ # json_op.to_recordset.as(:x, [Sequel.lit('a integer'), Sequel.lit('b text')]) # json_to_recordset(json) AS x(a integer, b text)
484
+ def to_recordset
485
+ function(:to_recordset)
486
+ end
487
+
488
+ # Returns the type of the outermost json value as text.
489
+ #
490
+ # json_op.typeof # json_typeof(json)
491
+ def typeof
492
+ function(:typeof)
493
+ end
494
+
495
+ # If called without arguments, operates as SQL::Wrapper#value. Otherwise,
496
+ # return the result of applying the JSON path expression to the receiver, by default
497
+ # returning results as text. Options:
498
+ #
499
+ # :on_empty :: How to handle case where path expression yields an empty set.
500
+ # Uses same values as :on_error option.
501
+ # :on_error :: How to handle errors when evaluating the JSON path expression.
502
+ # :null :: Return nil (default)
503
+ # :error :: raise a DatabaseError
504
+ # any other value :: used as default value
505
+ # :passing :: Variables to pass to the JSON path expression. Keys are variable
506
+ # names, values are the values of the variable.
507
+ # :returning :: The data type to return (text by default)
508
+ #
509
+ # json_op.value("$.a") # json_value(json, '$.a')
510
+ # json_op.value("$.a", passing: {a: 1}) # json_value(json, '$.a' PASSING 1 AS a)
511
+ # json_op.value("$.a", on_error: :error) # json_value(json, '$.a' ERROR ON ERROR)
512
+ # json_op.value("$.a", returning: Time) # json_value(json, '$.a' RETURNING timestamp)
513
+ # json_op.value("$.a", on_empty: 2) # json_value(json, '$.a' DEFAULT 2 ON EMPTY)
514
+ def value(path=(no_args_given = true), opts=OPTS)
515
+ if no_args_given
516
+ # Act as SQL::Wrapper#value
517
+ super()
518
+ else
519
+ Sequel::SQL::StringExpression.new(:NOOP, JSONValueOp.new(self, path, opts))
520
+ end
521
+ end
522
+
523
+ private
524
+
525
+ # Internals of IS [NOT] JSON support
526
+ def _is_json(lit_array, opts)
527
+ raise Error, "invalid is_json :type option: #{opts[:type].inspect}" unless type = IS_JSON_MAP[opts[:type]]
528
+ unique = opts[:unique] ? WITH_UNIQUE : EMPTY_STRING
529
+ Sequel::SQL::BooleanExpression.new(:NOOP, Sequel::SQL::PlaceholderLiteralString.new(lit_array, [self, type, unique]))
530
+ end
531
+
532
+ # Return a placeholder literal with the given str and args, wrapped
533
+ # in an JSONOp or JSONBOp, used by operators that return json or jsonb.
534
+ def json_op(str, args)
535
+ self.class.new(Sequel::SQL::PlaceholderLiteralString.new(str, [self, args]))
536
+ end
537
+
538
+ # Return a function with the given name, and the receiver as the first
539
+ # argument, with any additional arguments given.
540
+ def function(name, *args)
541
+ SQL::Function.new(function_name(name), self, *args)
542
+ end
543
+
544
+ # Whether the given object represents an array in PostgreSQL.
545
+ def is_array?(a)
546
+ a.is_a?(Array) || (defined?(PGArray) && a.is_a?(PGArray)) || (defined?(ArrayOp) && a.is_a?(ArrayOp))
547
+ end
548
+
549
+ # Automatically wrap argument in a PGArray if it is a plain Array.
550
+ # Requires that the pg_array extension has been loaded to work.
551
+ def wrap_array(arg)
552
+ if arg.instance_of?(Array) && Sequel.respond_to?(:pg_array)
553
+ Sequel.pg_array(arg)
554
+ else
555
+ arg
556
+ end
557
+ end
558
+ end
559
+
560
+ # JSONBaseOp subclass for the json type
561
+ class JSONOp < JSONBaseOp
562
+ # Return the receiver, since it is already a JSONOp.
563
+ def pg_json
564
+ self
565
+ end
566
+
567
+ private
568
+
569
+ # The json type functions are prefixed with json_
570
+ def function_name(name)
571
+ "json_#{name}"
572
+ end
573
+ end
574
+
575
+ # JSONBaseOp subclass for the jsonb type.
576
+ #
577
+ # In the method documentation examples, assume that:
578
+ #
579
+ # jsonb_op = Sequel.pg_jsonb(:jsonb)
580
+ class JSONBOp < JSONBaseOp
581
+ CONCAT = ["(".freeze, " || ".freeze, ")".freeze].freeze
582
+ CONTAIN_ALL = ["(".freeze, " ?& ".freeze, ")".freeze].freeze
583
+ CONTAIN_ANY = ["(".freeze, " ?| ".freeze, ")".freeze].freeze
584
+ CONTAINS = ["(".freeze, " @> ".freeze, ")".freeze].freeze
585
+ CONTAINED_BY = ["(".freeze, " <@ ".freeze, ")".freeze].freeze
586
+ DELETE_PATH = ["(".freeze, " #- ".freeze, ")".freeze].freeze
587
+ HAS_KEY = ["(".freeze, " ? ".freeze, ")".freeze].freeze
588
+ PATH_EXISTS = ["(".freeze, " @? ".freeze, ")".freeze].freeze
589
+ PATH_MATCH = ["(".freeze, " @@ ".freeze, ")".freeze].freeze
590
+
591
+ # Support subscript syntax for JSONB.
592
+ def [](key)
593
+ if is_array?(key)
594
+ super
595
+ else
596
+ case @value
597
+ when Symbol, SQL::Identifier, SQL::QualifiedIdentifier, JSONBSubscriptOp
598
+ # Only use subscripts for identifiers. In other cases, switching from
599
+ # the -> operator to [] for subscripts causes SQL syntax issues. You
600
+ # only need the [] for subscripting when doing assignment, and
601
+ # assignment is generally done on identifiers.
602
+ self.class.new(JSONBSubscriptOp.new(self, key))
603
+ else
604
+ super
605
+ end
606
+ end
607
+ end
608
+
609
+ # jsonb expression for deletion of the given argument from the
610
+ # current jsonb.
611
+ #
612
+ # jsonb_op - "a" # (jsonb - 'a')
613
+ def -(other)
614
+ self.class.new(super)
615
+ end
616
+
617
+ # jsonb expression for concatenation of the given jsonb into
618
+ # the current jsonb.
619
+ #
620
+ # jsonb_op.concat(:h) # (jsonb || h)
621
+ def concat(other)
622
+ json_op(CONCAT, wrap_input_jsonb(other))
623
+ end
624
+
625
+ # Check if the receiver contains all of the keys in the given array:
626
+ #
627
+ # jsonb_op.contain_all(:a) # (jsonb ?& a)
628
+ def contain_all(other)
629
+ bool_op(CONTAIN_ALL, wrap_input_array(other))
630
+ end
631
+
632
+ # Check if the receiver contains any of the keys in the given array:
633
+ #
634
+ # jsonb_op.contain_any(:a) # (jsonb ?| a)
635
+ def contain_any(other)
636
+ bool_op(CONTAIN_ANY, wrap_input_array(other))
637
+ end
638
+
639
+ # Check if the receiver contains all entries in the other jsonb:
640
+ #
641
+ # jsonb_op.contains(:h) # (jsonb @> h)
642
+ def contains(other)
643
+ bool_op(CONTAINS, wrap_input_jsonb(other))
644
+ end
645
+
646
+ # Check if the other jsonb contains all entries in the receiver:
647
+ #
648
+ # jsonb_op.contained_by(:h) # (jsonb <@ h)
649
+ def contained_by(other)
650
+ bool_op(CONTAINED_BY, wrap_input_jsonb(other))
651
+ end
652
+
653
+ # Removes the given path from the receiver.
654
+ #
655
+ # jsonb_op.delete_path(:h) # (jsonb #- h)
656
+ def delete_path(other)
657
+ json_op(DELETE_PATH, wrap_input_array(other))
658
+ end
659
+
660
+ # Check if the receiver contains the given key:
661
+ #
662
+ # jsonb_op.has_key?('a') # (jsonb ? 'a')
663
+ def has_key?(key)
664
+ bool_op(HAS_KEY, key)
665
+ end
666
+ alias include? has_key?
667
+
668
+ # Inserts the given jsonb value at the given path in the receiver.
669
+ # The default is to insert the value before the given path, but
670
+ # insert_after can be set to true to insert it after the given path.
671
+ #
672
+ # jsonb_op.insert(['a', 'b'], h) # jsonb_insert(jsonb, ARRAY['a', 'b'], h, false)
673
+ # jsonb_op.insert(['a', 'b'], h, true) # jsonb_insert(jsonb, ARRAY['a', 'b'], h, true)
674
+ def insert(path, other, insert_after=false)
675
+ self.class.new(function(:insert, wrap_input_array(path), wrap_input_jsonb(other), insert_after))
676
+ end
677
+
678
+ # Returns whether the JSON path returns any item for the json object.
679
+ #
680
+ # json_op.path_exists("$.foo") # (json @? '$.foo')
681
+ def path_exists(path)
682
+ bool_op(PATH_EXISTS, path)
683
+ end
684
+
685
+ # Returns whether the JSON path returns any item for the json object.
686
+ #
687
+ # json_op.path_exists!("$.foo")
688
+ # # jsonb_path_exists(json, '$.foo')
689
+ #
690
+ # json_op.path_exists!("$.foo ? ($ > $x)", x: 2)
691
+ # # jsonb_path_exists(json, '$.foo ? ($ > $x)', '{"x":2}')
692
+ #
693
+ # json_op.path_exists!("$.foo ? ($ > $x)", {x: 2}, true)
694
+ # # jsonb_path_exists(json, '$.foo ? ($ > $x)', '{"x":2}', true)
695
+ def path_exists!(path, vars=nil, silent=nil)
696
+ Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_exists, path, vars, silent))
697
+ end
698
+
699
+ # The same as #path_exists!, except that timezone-aware conversions are used for date/time values.
700
+ def path_exists_tz!(path, vars=nil, silent=nil)
701
+ Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_exists_tz, path, vars, silent))
702
+ end
703
+
704
+ # Returns the first item of the result of JSON path predicate check for the json object.
705
+ # Returns nil if the first item is not true or false.
706
+ #
707
+ # json_op.path_match("$.foo") # (json @@ '$.foo')
708
+ def path_match(path)
709
+ bool_op(PATH_MATCH, path)
710
+ end
711
+
712
+ # Returns the first item of the result of JSON path predicate check for the json object.
713
+ # Returns nil if the first item is not true or false and silent is true.
714
+ #
715
+ # json_op.path_match!("$.foo")
716
+ # # jsonb_path_match(json, '$.foo')
717
+ #
718
+ # json_op.path_match!("$.foo ? ($ > $x)", x: 2)
719
+ # # jsonb_path_match(json, '$.foo ? ($ > $x)', '{"x":2}')
720
+ #
721
+ # json_op.path_match!("$.foo ? ($ > $x)", {x: 2}, true)
722
+ # # jsonb_path_match(json, '$.foo ? ($ > $x)', '{"x":2}', true)
723
+ def path_match!(path, vars=nil, silent=nil)
724
+ Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_match, path, vars, silent))
725
+ end
726
+
727
+ # The same as #path_match!, except that timezone-aware conversions are used for date/time values.
728
+ def path_match_tz!(path, vars=nil, silent=nil)
729
+ Sequel::SQL::BooleanExpression.new(:NOOP, _path_function(:jsonb_path_match_tz, path, vars, silent))
730
+ end
731
+
732
+ # Returns a set of all jsonb values specified by the JSON path
733
+ # for the json object.
734
+ #
735
+ # json_op.path_query("$.foo")
736
+ # # jsonb_path_query(json, '$.foo')
737
+ #
738
+ # json_op.path_query("$.foo ? ($ > $x)", x: 2)
739
+ # # jsonb_path_query(json, '$.foo ? ($ > $x)', '{"x":2}')
740
+ #
741
+ # json_op.path_query("$.foo ? ($ > $x)", {x: 2}, true)
742
+ # # jsonb_path_query(json, '$.foo ? ($ > $x)', '{"x":2}', true)
743
+ def path_query(path, vars=nil, silent=nil)
744
+ _path_function(:jsonb_path_query, path, vars, silent)
745
+ end
746
+
747
+ # The same as #path_query, except that timezone-aware conversions are used for date/time values.
748
+ def path_query_tz(path, vars=nil, silent=nil)
749
+ _path_function(:jsonb_path_query_tz, path, vars, silent)
750
+ end
751
+
752
+ # Returns a jsonb array of all values specified by the JSON path
753
+ # for the json object.
754
+ #
755
+ # json_op.path_query_array("$.foo")
756
+ # # jsonb_path_query_array(json, '$.foo')
757
+ #
758
+ # json_op.path_query_array("$.foo ? ($ > $x)", x: 2)
759
+ # # jsonb_path_query_array(json, '$.foo ? ($ > $x)', '{"x":2}')
760
+ #
761
+ # json_op.path_query_array("$.foo ? ($ > $x)", {x: 2}, true)
762
+ # # jsonb_path_query_array(json, '$.foo ? ($ > $x)', '{"x":2}', true)
763
+ def path_query_array(path, vars=nil, silent=nil)
764
+ JSONBOp.new(_path_function(:jsonb_path_query_array, path, vars, silent))
765
+ end
766
+
767
+ # The same as #path_query_array, except that timezone-aware conversions are used for date/time values.
768
+ def path_query_array_tz(path, vars=nil, silent=nil)
769
+ JSONBOp.new(_path_function(:jsonb_path_query_array_tz, path, vars, silent))
770
+ end
771
+
772
+ # Returns the first item of the result specified by the JSON path
773
+ # for the json object.
774
+ #
775
+ # json_op.path_query_first("$.foo")
776
+ # # jsonb_path_query_first(json, '$.foo')
777
+ #
778
+ # json_op.path_query_first("$.foo ? ($ > $x)", x: 2)
779
+ # # jsonb_path_query_first(json, '$.foo ? ($ > $x)', '{"x":2}')
780
+ #
781
+ # json_op.path_query_first("$.foo ? ($ > $x)", {x: 2}, true)
782
+ # # jsonb_path_query_first(json, '$.foo ? ($ > $x)', '{"x":2}', true)
783
+ def path_query_first(path, vars=nil, silent=nil)
784
+ JSONBOp.new(_path_function(:jsonb_path_query_first, path, vars, silent))
785
+ end
786
+
787
+ # The same as #path_query_first, except that timezone-aware conversions are used for date/time values.
788
+ def path_query_first_tz(path, vars=nil, silent=nil)
789
+ JSONBOp.new(_path_function(:jsonb_path_query_first_tz, path, vars, silent))
790
+ end
791
+
792
+ # Return the receiver, since it is already a JSONBOp.
793
+ def pg_jsonb
794
+ self
795
+ end
796
+
797
+ # Return a pretty printed version of the receiver as a string expression.
798
+ #
799
+ # jsonb_op.pretty # jsonb_pretty(jsonb)
800
+ def pretty
801
+ Sequel::SQL::StringExpression.new(:NOOP, function(:pretty))
802
+ end
803
+
804
+ # Set the given jsonb value at the given path in the receiver.
805
+ # By default, this will create the value if it does not exist, but
806
+ # create_missing can be set to false to not create a new value.
807
+ #
808
+ # jsonb_op.set(['a', 'b'], h) # jsonb_set(jsonb, ARRAY['a', 'b'], h, true)
809
+ # jsonb_op.set(['a', 'b'], h, false) # jsonb_set(jsonb, ARRAY['a', 'b'], h, false)
810
+ def set(path, other, create_missing=true)
811
+ self.class.new(function(:set, wrap_input_array(path), wrap_input_jsonb(other), create_missing))
812
+ end
813
+
814
+ # The same as #set, except if +other+ is +nil+, then behaves according to +null_value_treatment+,
815
+ # which can be one of 'raise_exception', 'use_json_null' (default), 'delete_key', or 'return_target'.
816
+ def set_lax(path, other, create_missing=true, null_value_treatment='use_json_null')
817
+ self.class.new(function(:set_lax, wrap_input_array(path), wrap_input_jsonb(other), create_missing, null_value_treatment))
818
+ end
819
+
820
+ private
821
+
822
+ # Internals of the jsonb SQL/JSON path functions.
823
+ def _path_function(func, path, vars, silent)
824
+ args = []
825
+ if vars
826
+ if vars.is_a?(Hash)
827
+ vars = vars.to_json
828
+ end
829
+ args << vars
830
+
831
+ unless silent.nil?
832
+ args << silent
833
+ end
834
+ end
835
+ SQL::Function.new(func, self, path, *args)
836
+ end
837
+
838
+ # Return a placeholder literal with the given str and args, wrapped
839
+ # in a boolean expression, used by operators that return booleans.
840
+ def bool_op(str, other)
841
+ Sequel::SQL::BooleanExpression.new(:NOOP, Sequel::SQL::PlaceholderLiteralString.new(str, [value, other]))
842
+ end
843
+
844
+ # Wrap argument in a PGArray if it is an array or a set
845
+ def wrap_input_array(obj)
846
+ # :nocov:
847
+ if Sequel.respond_to?(:pg_array)
848
+ # :nocov:
849
+ case obj
850
+ when Array
851
+ return Sequel.pg_array(obj)
852
+ when Set
853
+ return Sequel.pg_array(obj.to_a)
854
+ end
855
+ end
856
+
857
+ obj
858
+ end
859
+
860
+ # Wrap argument in a JSONBArray or JSONBHash if it is an array or hash.
861
+ def wrap_input_jsonb(obj)
862
+ if Sequel.respond_to?(:pg_jsonb) && (obj.is_a?(Array) || obj.is_a?(Hash))
863
+ Sequel.pg_jsonb(obj)
864
+ else
865
+ obj
866
+ end
867
+ end
868
+
869
+ # The jsonb type functions are prefixed with jsonb_
870
+ def function_name(name)
871
+ "jsonb_#{name}"
872
+ end
873
+ end
874
+
875
+ # Represents JSONB subscripts. This is abstracted because the
876
+ # subscript support depends on the database version.
877
+ class JSONBSubscriptOp < SQL::Expression
878
+ SUBSCRIPT = ["".freeze, "[".freeze, "]".freeze].freeze
879
+
880
+ # The expression being subscripted
881
+ attr_reader :expression
882
+
883
+ # The subscript to use
884
+ attr_reader :sub
885
+
886
+ # Set the expression and subscript to the given arguments
887
+ def initialize(expression, sub)
888
+ @expression = expression
889
+ @sub = sub
890
+ freeze
891
+ end
892
+
893
+ # Use subscripts instead of -> operator on PostgreSQL 14+
894
+ def to_s_append(ds, sql)
895
+ server_version = ds.db.server_version
896
+ frag = server_version && server_version >= 140000 ? SUBSCRIPT : JSONOp::GET
897
+ ds.literal_append(sql, Sequel::SQL::PlaceholderLiteralString.new(frag, [@expression, @sub]))
898
+ end
899
+
900
+ # Support transforming of jsonb subscripts
901
+ def sequel_ast_transform(transformer)
902
+ self.class.new(transformer.call(@expression), transformer.call(@sub))
903
+ end
904
+ end
905
+
906
+ # Object representing json_exists calls
907
+ class JSONExistsOp < SQL::Expression
908
+ ON_ERROR_SQL = {
909
+ true => 'TRUE',
910
+ false => 'FALSE',
911
+ :null => 'UNKNOWN',
912
+ :error => 'ERROR',
913
+ }.freeze
914
+ private_constant :ON_ERROR_SQL
915
+
916
+ # Expression (context_item in PostgreSQL terms), usually JSONBaseOp instance
917
+ attr_reader :expr
918
+
919
+ # JSON path expression to apply against the expression
920
+ attr_reader :path
921
+
922
+ # Variables to set in the JSON path expression
923
+ attr_reader :passing
924
+
925
+ # How to handle errors when evaluating the JSON path expression
926
+ attr_reader :on_error
927
+
928
+ # See JSONBaseOp#exists for documentation on the options.
929
+ def initialize(expr, path, opts=OPTS)
930
+ @expr = expr
931
+ @path = path
932
+ @passing = opts[:passing]
933
+ @on_error = opts[:on_error]
934
+ freeze
935
+ end
936
+
937
+ # Append the SQL function call expression to the SQL
938
+ def to_s_append(ds, sql)
939
+ to_s_append_function_name(ds, sql)
940
+ to_s_append_args_passing(ds, sql)
941
+ to_s_append_on_error(ds, sql)
942
+ sql << ')'
943
+ end
944
+
945
+ # Support transforming of function call expression
946
+ def sequel_ast_transform(transformer)
947
+ opts = {}
948
+ transform_opts(transformer, opts)
949
+ self.class.new(transformer.call(@expr), @path, opts)
950
+ end
951
+
952
+ private
953
+
954
+ # Set the :passing and :on_error options when doing an
955
+ # AST transform.
956
+ def transform_opts(transformer, opts)
957
+ if @passing
958
+ passing = opts[:passing] = {}
959
+ @passing.each do |k, v|
960
+ passing[k] = transformer.call(v)
961
+ end
962
+ end
963
+
964
+ opts[:on_error] = @on_error
965
+ end
966
+
967
+ def to_s_append_function_name(ds, sql)
968
+ sql << 'json_exists('
969
+ end
970
+
971
+ # Append the expression, path, and optional PASSING fragments
972
+ def to_s_append_args_passing(ds, sql)
973
+ ds.literal_append(sql, @expr)
974
+ sql << ', '
975
+ ds.literal_append(sql, @path)
976
+
977
+ if (passing = @passing) && !passing.empty?
978
+ sql << ' PASSING '
979
+ comma = false
980
+ passing.each do |k, v|
981
+ if comma
982
+ sql << ', '
983
+ else
984
+ comma = true
985
+ end
986
+ ds.literal_append(sql, v)
987
+ sql << " AS " << k.to_s
988
+ end
989
+ end
990
+ end
991
+
992
+ # Append the optional ON ERROR fragments
993
+ def to_s_append_on_error(ds, sql)
994
+ unless @on_error.nil?
995
+ sql << " "
996
+ to_s_append_on_value(ds, sql, @on_error)
997
+ sql << " ON ERROR"
998
+ end
999
+ end
1000
+
1001
+ # Append the value to use for ON ERROR
1002
+ def to_s_append_on_value(ds, sql, value)
1003
+ sql << ON_ERROR_SQL.fetch(value)
1004
+ end
1005
+ end
1006
+
1007
+ # Object representing json_value calls
1008
+ class JSONValueOp < JSONExistsOp
1009
+ ON_SQL = {
1010
+ :null => 'NULL',
1011
+ :error => 'ERROR',
1012
+ }.freeze
1013
+ private_constant :ON_SQL
1014
+
1015
+ # The database type to cast returned values to
1016
+ attr_reader :returning
1017
+
1018
+ # How to handle cases where the JSON path expression evaluation yields
1019
+ # an empty set.
1020
+ attr_reader :on_empty
1021
+
1022
+ # See JSONBaseOp#value for documentation of the options.
1023
+ def initialize(expr, path, opts=OPTS)
1024
+ @returning = opts[:returning]
1025
+ @on_empty = opts[:on_empty]
1026
+ super
1027
+ end
1028
+
1029
+ private
1030
+
1031
+ # Also handle transforming the returning and on_empty options.
1032
+ def transform_opts(transformer, opts)
1033
+ super
1034
+ opts[:returning] = @returning
1035
+ on_error = @on_error
1036
+ on_error = transformer.call(on_error) unless on_sql_value(on_error)
1037
+ opts[:on_error] = on_error
1038
+ on_empty = @on_empty
1039
+ on_empty = transformer.call(on_empty) unless on_sql_value(on_empty)
1040
+ opts[:on_empty] = on_empty
1041
+ end
1042
+
1043
+ def to_s_append_function_name(ds, sql)
1044
+ sql << 'json_value('
1045
+ end
1046
+
1047
+ # Also append the optional RETURNING fragment
1048
+ def to_s_append_args_passing(ds, sql)
1049
+ super
1050
+
1051
+ if @returning
1052
+ sql << ' RETURNING ' << ds.db.cast_type_literal(@returning).to_s
1053
+ end
1054
+ end
1055
+
1056
+ # Also append the optional ON EMPTY fragment
1057
+ def to_s_append_on_error(ds, sql)
1058
+ unless @on_empty.nil?
1059
+ sql << " "
1060
+ to_s_append_on_value(ds, sql, @on_empty)
1061
+ sql << " ON EMPTY"
1062
+ end
1063
+
1064
+ super
1065
+ end
1066
+
1067
+ # Handle DEFAULT values in ON EMPTY/ON ERROR fragments
1068
+ def to_s_append_on_value(ds, sql, value)
1069
+ if v = on_sql_value(value)
1070
+ sql << v
1071
+ else
1072
+ sql << 'DEFAULT '
1073
+ default_literal_append(ds, sql, value)
1074
+ end
1075
+ end
1076
+
1077
+ # Do not auto paramterize default value, as PostgreSQL doesn't allow it.
1078
+ def default_literal_append(ds, sql, v)
1079
+ if sql.respond_to?(:skip_auto_param)
1080
+ sql.skip_auto_param do
1081
+ ds.literal_append(sql, v)
1082
+ end
1083
+ else
1084
+ ds.literal_append(sql, v)
1085
+ end
1086
+ end
1087
+
1088
+ def on_sql_value(value)
1089
+ ON_SQL[value]
1090
+ end
1091
+ end
1092
+
1093
+ # Object representing json_query calls
1094
+ class JSONQueryOp < JSONValueOp
1095
+ ON_SQL = {
1096
+ :null => 'NULL',
1097
+ :error => 'ERROR',
1098
+ :empty_array => 'EMPTY ARRAY',
1099
+ :empty_object => 'EMPTY OBJECT',
1100
+ }.freeze
1101
+ private_constant :ON_SQL
1102
+
1103
+ WRAPPER = {
1104
+ :conditional => ' WITH CONDITIONAL WRAPPER',
1105
+ :unconditional => ' WITH WRAPPER',
1106
+ :omit_quotes => ' OMIT QUOTES'
1107
+ }
1108
+ WRAPPER[true] = WRAPPER[:unconditional]
1109
+ WRAPPER.freeze
1110
+ private_constant :WRAPPER
1111
+
1112
+ # How to handle wrapping of results
1113
+ attr_reader :wrapper
1114
+
1115
+ # See JSONBaseOp#query for documentation of the options.
1116
+ def initialize(expr, path, opts=OPTS)
1117
+ @wrapper = opts[:wrapper]
1118
+ super
1119
+ end
1120
+
1121
+ private
1122
+
1123
+ # Also handle transforming the wrapper option
1124
+ def transform_opts(transformer, opts)
1125
+ super
1126
+ opts[:wrapper] = @wrapper
1127
+ end
1128
+
1129
+ def to_s_append_function_name(ds, sql)
1130
+ sql << 'json_query('
1131
+ end
1132
+
1133
+ # Also append the optional WRAPPER/OMIT QUOTES fragment
1134
+ def to_s_append_args_passing(ds, sql)
1135
+ super
1136
+
1137
+ if @wrapper
1138
+ sql << WRAPPER.fetch(@wrapper)
1139
+ end
1140
+ end
1141
+
1142
+ def on_sql_value(value)
1143
+ ON_SQL[value]
1144
+ end
1145
+ end
1146
+
1147
+ # Object representing json_table calls
1148
+ class JSONTableOp < SQL::Expression
1149
+ TABLE_ON_ERROR_SQL = {
1150
+ :error => ' ERROR ON ERROR',
1151
+ :empty_array => ' EMPTY ARRAY ON ERROR',
1152
+ }.freeze
1153
+ private_constant :TABLE_ON_ERROR_SQL
1154
+
1155
+ COLUMN_ON_SQL = {
1156
+ :null => ' NULL',
1157
+ :error => ' ERROR',
1158
+ :empty_array => ' EMPTY ARRAY',
1159
+ :empty_object => ' EMPTY OBJECT',
1160
+ }.freeze
1161
+ private_constant :COLUMN_ON_SQL
1162
+
1163
+ EXISTS_ON_ERROR_SQL = {
1164
+ :error => ' ERROR',
1165
+ true => ' TRUE',
1166
+ false => ' FALSE',
1167
+ :null => ' UNKNOWN',
1168
+ }.freeze
1169
+ private_constant :EXISTS_ON_ERROR_SQL
1170
+
1171
+ WRAPPER = {
1172
+ :conditional => ' WITH CONDITIONAL WRAPPER',
1173
+ :unconditional => ' WITH WRAPPER',
1174
+ :omit_quotes => ' OMIT QUOTES',
1175
+ :keep_quotes => ' KEEP QUOTES',
1176
+ }
1177
+ WRAPPER[true] = WRAPPER[:unconditional]
1178
+ WRAPPER.freeze
1179
+ private_constant :WRAPPER
1180
+
1181
+ # Class used to evaluate json_table blocks and nested blocks
1182
+ class ColumnDSL
1183
+ # Return array of column information recorded for the instance
1184
+ attr_reader :columns
1185
+
1186
+ def self.columns(&block)
1187
+ new(&block).columns.freeze
1188
+ end
1189
+
1190
+ def initialize(&block)
1191
+ @columns = []
1192
+ instance_exec(&block)
1193
+ end
1194
+
1195
+ # Include a FOR ORDINALITY column
1196
+ def ordinality(name)
1197
+ @columns << [:ordinality, name].freeze
1198
+ end
1199
+
1200
+ # Include a regular column with the given type
1201
+ def column(name, type, opts=OPTS)
1202
+ @columns << [:column, name, type, opts].freeze
1203
+ end
1204
+
1205
+ # Include an EXISTS column with the given type
1206
+ def exists(name, type, opts=OPTS)
1207
+ @columns << [:exists, name, type, opts].freeze
1208
+ end
1209
+
1210
+ # Include a nested set of columns at the given path.
1211
+ def nested(path, &block)
1212
+ @columns << [:nested, path, ColumnDSL.columns(&block)].freeze
1213
+ end
1214
+
1215
+ # Include a bigint column
1216
+ def Bignum(name, opts=OPTS)
1217
+ @columns << [:column, name, :Bignum, opts].freeze
1218
+ end
1219
+
1220
+ # Define methods for handling other generic types
1221
+ %w'String Integer Float Numeric BigDecimal Date DateTime Time File TrueClass FalseClass'.each do |meth|
1222
+ klass = Object.const_get(meth)
1223
+ define_method(meth) do |name, opts=OPTS|
1224
+ @columns << [:column, name, klass, opts].freeze
1225
+ end
1226
+ end
1227
+ end
1228
+ private_constant :ColumnDSL
1229
+
1230
+ # See JSONBaseOp#table for documentation on the options.
1231
+ def initialize(expr, path, opts=OPTS, &block)
1232
+ @expr = expr
1233
+ @path = path
1234
+ @passing = opts[:passing]
1235
+ @on_error = opts[:on_error]
1236
+ @columns = opts[:_columns] || ColumnDSL.columns(&block)
1237
+ freeze
1238
+ end
1239
+
1240
+ # Append the json_table function call expression to the SQL
1241
+ def to_s_append(ds, sql)
1242
+ sql << 'json_table('
1243
+ ds.literal_append(sql, @expr)
1244
+ sql << ', '
1245
+ default_literal_append(ds, sql, @path)
1246
+
1247
+ if (passing = @passing) && !passing.empty?
1248
+ sql << ' PASSING '
1249
+ comma = false
1250
+ passing.each do |k, v|
1251
+ if comma
1252
+ sql << ', '
1253
+ else
1254
+ comma = true
1255
+ end
1256
+ ds.literal_append(sql, v)
1257
+ sql << " AS " << k.to_s
1258
+ end
1259
+ end
1260
+
1261
+ to_s_append_columns(ds, sql, @columns)
1262
+ sql << TABLE_ON_ERROR_SQL.fetch(@on_error) if @on_error
1263
+ sql << ')'
1264
+ end
1265
+
1266
+ # Support transforming of json_table expression
1267
+ def sequel_ast_transform(transformer)
1268
+ opts = {:on_error=>@on_error, :_columns=>@columns}
1269
+
1270
+ if @passing
1271
+ passing = opts[:passing] = {}
1272
+ @passing.each do |k, v|
1273
+ passing[k] = transformer.call(v)
1274
+ end
1275
+ end
1276
+
1277
+ self.class.new(transformer.call(@expr), @path, opts)
1278
+ end
1279
+
1280
+ private
1281
+
1282
+ # Append the set of column information to the SQL. Separated to handle
1283
+ # nested sets of columns.
1284
+ def to_s_append_columns(ds, sql, columns)
1285
+ sql << ' COLUMNS('
1286
+ comma = nil
1287
+ columns.each do |column|
1288
+ if comma
1289
+ sql << comma
1290
+ else
1291
+ comma = ', '
1292
+ end
1293
+ to_s_append_column(ds, sql, column)
1294
+ end
1295
+ sql << ')'
1296
+ end
1297
+
1298
+ # Append the column information to the SQL. Handles the various
1299
+ # types of json_table columns.
1300
+ def to_s_append_column(ds, sql, column)
1301
+ case column[0]
1302
+ when :column
1303
+ _, name, type, opts = column
1304
+ ds.literal_append(sql, name)
1305
+ sql << ' ' << ds.db.send(:type_literal, opts.merge(:type=>type)).to_s
1306
+ sql << ' FORMAT JSON' if opts[:format] == :json
1307
+ to_s_append_path(ds, sql, opts[:path])
1308
+ sql << WRAPPER.fetch(opts[:wrapper]) if opts[:wrapper]
1309
+ to_s_append_on_value(ds, sql, opts[:on_empty], " ON EMPTY")
1310
+ to_s_append_on_value(ds, sql, opts[:on_error], " ON ERROR")
1311
+ when :ordinality
1312
+ ds.literal_append(sql, column[1])
1313
+ sql << ' FOR ORDINALITY'
1314
+ when :exists
1315
+ _, name, type, opts = column
1316
+ ds.literal_append(sql, name)
1317
+ sql << ' ' << ds.db.send(:type_literal, opts.merge(:type=>type)).to_s
1318
+ sql << ' EXISTS'
1319
+ to_s_append_path(ds, sql, opts[:path])
1320
+ unless (on_error = opts[:on_error]).nil?
1321
+ sql << EXISTS_ON_ERROR_SQL.fetch(on_error) << " ON ERROR"
1322
+ end
1323
+ else # when :nested
1324
+ _, path, columns = column
1325
+ sql << 'NESTED '
1326
+ default_literal_append(ds, sql, path)
1327
+ to_s_append_columns(ds, sql, columns)
1328
+ end
1329
+ end
1330
+
1331
+ # Handle DEFAULT values in ON EMPTY/ON ERROR fragments
1332
+ def to_s_append_on_value(ds, sql, value, cond)
1333
+ if value
1334
+ if v = COLUMN_ON_SQL[value]
1335
+ sql << v
1336
+ else
1337
+ sql << ' DEFAULT '
1338
+ default_literal_append(ds, sql, value)
1339
+ end
1340
+ sql << cond
1341
+ end
1342
+ end
1343
+
1344
+ # Append path caluse to the SQL
1345
+ def to_s_append_path(ds, sql, path)
1346
+ if path
1347
+ sql << ' PATH '
1348
+ default_literal_append(ds, sql, path)
1349
+ end
1350
+ end
1351
+
1352
+ # Do not auto paramterize default value or path value, as PostgreSQL doesn't allow it.
1353
+ def default_literal_append(ds, sql, v)
1354
+ if sql.respond_to?(:skip_auto_param)
1355
+ sql.skip_auto_param do
1356
+ ds.literal_append(sql, v)
1357
+ end
1358
+ else
1359
+ ds.literal_append(sql, v)
1360
+ end
1361
+ end
1362
+ end
1363
+
1364
+ module JSONOpMethods
1365
+ # Wrap the receiver in an JSONOp so you can easily use the PostgreSQL
1366
+ # json functions and operators with it.
1367
+ def pg_json
1368
+ JSONOp.new(self)
1369
+ end
1370
+ #
1371
+ # Wrap the receiver in an JSONBOp so you can easily use the PostgreSQL
1372
+ # jsonb functions and operators with it.
1373
+ def pg_jsonb
1374
+ JSONBOp.new(self)
1375
+ end
1376
+ end
1377
+
1378
+ # :nocov:
1379
+ if defined?(JSONArray)
1380
+ # :nocov:
1381
+ class JSONArray
1382
+ # Wrap the JSONArray instance in an JSONOp, allowing you to easily use
1383
+ # the PostgreSQL json functions and operators with literal jsons.
1384
+ def op
1385
+ JSONOp.new(self)
1386
+ end
1387
+ end
1388
+
1389
+ class JSONHash
1390
+ # Wrap the JSONHash instance in an JSONOp, allowing you to easily use
1391
+ # the PostgreSQL json functions and operators with literal jsons.
1392
+ def op
1393
+ JSONOp.new(self)
1394
+ end
1395
+ end
1396
+
1397
+ class JSONBArray
1398
+ # Wrap the JSONBArray instance in an JSONBOp, allowing you to easily use
1399
+ # the PostgreSQL jsonb functions and operators with literal jsonbs.
1400
+ def op
1401
+ JSONBOp.new(self)
1402
+ end
1403
+ end
1404
+
1405
+ class JSONBHash
1406
+ # Wrap the JSONBHash instance in an JSONBOp, allowing you to easily use
1407
+ # the PostgreSQL jsonb functions and operators with literal jsonbs.
1408
+ def op
1409
+ JSONBOp.new(self)
1410
+ end
1411
+ end
1412
+ end
1413
+ end
1414
+
1415
+ module SQL::Builders
1416
+ # Return the object wrapped in an Postgres::JSONOp.
1417
+ def pg_json_op(v)
1418
+ case v
1419
+ when Postgres::JSONOp
1420
+ v
1421
+ else
1422
+ Postgres::JSONOp.new(v)
1423
+ end
1424
+ end
1425
+
1426
+ # Return the object wrapped in an Postgres::JSONBOp.
1427
+ def pg_jsonb_op(v)
1428
+ case v
1429
+ when Postgres::JSONBOp
1430
+ v
1431
+ else
1432
+ Postgres::JSONBOp.new(v)
1433
+ end
1434
+ end
1435
+ end
1436
+
1437
+ class SQL::GenericExpression
1438
+ include Sequel::Postgres::JSONOpMethods
1439
+ end
1440
+
1441
+ class LiteralString
1442
+ include Sequel::Postgres::JSONOpMethods
1443
+ end
1444
+ end
1445
+
1446
+ # :nocov:
1447
+ if Sequel.core_extensions?
1448
+ class Symbol
1449
+ include Sequel::Postgres::JSONOpMethods
1450
+ end
1451
+ end
1452
+
1453
+ if defined?(Sequel::CoreRefinements)
1454
+ module Sequel::CoreRefinements
1455
+ refine Symbol do
1456
+ send INCLUDE_METH, Sequel::Postgres::JSONOpMethods
1457
+ end
1458
+ end
1459
+ end
1460
+ # :nocov: