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,1571 @@
1
+ # frozen-string-literal: true
2
+
3
+ module Sequel
4
+ class Dataset
5
+ # ---------------------
6
+ # :section: 1 - Methods that return modified datasets
7
+ # These methods all return modified copies of the receiver.
8
+ # ---------------------
9
+
10
+ # Hash of extension name symbols to callable objects to load the extension
11
+ # into the Dataset object (usually by extending it with a module defined
12
+ # in the extension).
13
+ EXTENSIONS = {}
14
+
15
+ # Hash of extension name symbols to modules to load to implement the extension.
16
+ EXTENSION_MODULES = {}
17
+ private_constant :EXTENSION_MODULES
18
+
19
+ EMPTY_ARRAY = [].freeze
20
+
21
+ # The dataset options that require the removal of cached columns if changed.
22
+ COLUMN_CHANGE_OPTS = [:select, :sql, :from, :join].freeze
23
+
24
+ # Which options don't affect the SQL generation. Used by simple_select_all?
25
+ # to determine if this is a simple SELECT * FROM table.
26
+ NON_SQL_OPTIONS = [:server, :graph, :row_proc, :quote_identifiers, :skip_symbol_cache].freeze
27
+
28
+ # These symbols have _join methods created (e.g. inner_join) that
29
+ # call join_table with the symbol, passing along the arguments and
30
+ # block from the method call.
31
+ CONDITIONED_JOIN_TYPES = [:inner, :full_outer, :right_outer, :left_outer, :full, :right, :left].freeze
32
+
33
+ # These symbols have _join methods created (e.g. natural_join).
34
+ # They accept a table argument and options hash which is passed to join_table,
35
+ # and they raise an error if called with a block.
36
+ UNCONDITIONED_JOIN_TYPES = [:natural, :natural_left, :natural_right, :natural_full, :cross].freeze
37
+
38
+ # All methods that return modified datasets with a joined table added.
39
+ JOIN_METHODS = ((CONDITIONED_JOIN_TYPES + UNCONDITIONED_JOIN_TYPES).map{|x| "#{x}_join".to_sym} + [:join, :join_table]).freeze
40
+
41
+ # Methods that return modified datasets
42
+ QUERY_METHODS = ((<<-METHS).split.map(&:to_sym) + JOIN_METHODS).freeze
43
+ add_graph_aliases distinct except exclude exclude_having
44
+ filter for_update from from_self graph grep group group_and_count group_append group_by having intersect invert
45
+ limit lock_style naked offset or order order_append order_by order_more order_prepend qualify
46
+ reverse reverse_order select select_all select_append select_group select_more select_prepend server
47
+ set_graph_aliases unfiltered ungraphed ungrouped union
48
+ unlimited unordered where with with_recursive with_sql
49
+ METHS
50
+
51
+ # Register an extension callback for Dataset objects. ext should be the
52
+ # extension name symbol, and mod should be a Module that will be
53
+ # included in the dataset's class. This also registers a Database extension that will
54
+ # extend all of the database's datasets.
55
+ def self.register_extension(ext, mod=nil, &block)
56
+ if mod
57
+ raise(Error, "cannot provide both mod and block to Dataset.register_extension") if block
58
+ if mod.is_a?(Module)
59
+ block = proc{|ds| ds.extend(mod)}
60
+ Sequel::Database.register_extension(ext){|db| db.extend_datasets(mod)}
61
+ Sequel.synchronize{EXTENSION_MODULES[ext] = mod}
62
+ else
63
+ block = mod
64
+ end
65
+ end
66
+
67
+ unless mod.is_a?(Module)
68
+ Sequel::Deprecation.deprecate("Providing a block or non-module to Sequel::Dataset.register_extension is deprecated and support for it will be removed in Sequel 6.")
69
+ end
70
+
71
+ Sequel.synchronize{EXTENSIONS[ext] = block}
72
+ end
73
+
74
+ # On Ruby 2.4+, use clone(freeze: false) to create clones, because
75
+ # we use true freezing in that case, and we need to modify the opts
76
+ # in the frozen copy.
77
+ #
78
+ # On Ruby <2.4, just use Object#clone directly, since we don't
79
+ # use true freezing as it isn't possible.
80
+ if TRUE_FREEZE
81
+ # Save original clone implementation, as some other methods need
82
+ # to call it internally.
83
+ alias _clone clone
84
+ private :_clone
85
+
86
+ # Returns a new clone of the dataset with the given options merged.
87
+ # If the options changed include options in COLUMN_CHANGE_OPTS, the cached
88
+ # columns are deleted. This method should generally not be called
89
+ # directly by user code.
90
+ def clone(opts = nil || (return self))
91
+ # return self used above because clone is called by almost all
92
+ # other query methods, and it is the fastest approach
93
+ c = super(:freeze=>false)
94
+ c.opts.merge!(opts)
95
+ unless opts.each_key{|o| break if COLUMN_CHANGE_OPTS.include?(o)}
96
+ c.clear_columns_cache
97
+ end
98
+ c.freeze
99
+ end
100
+ else
101
+ # :nocov:
102
+ def clone(opts = OPTS) # :nodoc:
103
+ c = super()
104
+ c.opts.merge!(opts)
105
+ unless opts.each_key{|o| break if COLUMN_CHANGE_OPTS.include?(o)}
106
+ c.clear_columns_cache
107
+ end
108
+ c.opts.freeze
109
+ c
110
+ end
111
+ # :nocov:
112
+ end
113
+
114
+ # Returns a copy of the dataset with the SQL DISTINCT clause. The DISTINCT
115
+ # clause is used to remove duplicate rows from the output. If arguments
116
+ # are provided, uses a DISTINCT ON clause, in which case it will only be
117
+ # distinct on those columns, instead of all returned columns. If a block
118
+ # is given, it is treated as a virtual row block, similar to +where+.
119
+ # Raises an error if arguments are given and DISTINCT ON is not supported.
120
+ #
121
+ # DB[:items].distinct # SQL: SELECT DISTINCT * FROM items
122
+ # DB[:items].order(:id).distinct(:id) # SQL: SELECT DISTINCT ON (id) * FROM items ORDER BY id
123
+ # DB[:items].order(:id).distinct{func(:id)} # SQL: SELECT DISTINCT ON (func(id)) * FROM items ORDER BY id
124
+ #
125
+ # There is support for emulating the DISTINCT ON support in MySQL, but it
126
+ # does not support the ORDER of the dataset, and also doesn't work in many
127
+ # cases if the ONLY_FULL_GROUP_BY sql_mode is used, which is the default on
128
+ # MySQL 5.7.5+.
129
+ def distinct(*args, &block)
130
+ virtual_row_columns(args, block)
131
+ if args.empty?
132
+ return self if opts[:distinct] == EMPTY_ARRAY
133
+ cached_dataset(:_distinct_ds){clone(:distinct => EMPTY_ARRAY)}
134
+ else
135
+ raise(InvalidOperation, "DISTINCT ON not supported") unless supports_distinct_on?
136
+ clone(:distinct => args.freeze)
137
+ end
138
+ end
139
+
140
+ # Adds an EXCEPT clause using a second dataset object.
141
+ # An EXCEPT compound dataset returns all rows in the current dataset
142
+ # that are not in the given dataset.
143
+ # Raises an +InvalidOperation+ if the operation is not supported.
144
+ # Options:
145
+ # :alias :: Use the given value as the from_self alias
146
+ # :all :: Set to true to use EXCEPT ALL instead of EXCEPT, so duplicate rows can occur
147
+ # :from_self :: Set to false to not wrap the returned dataset in a from_self, use with care.
148
+ #
149
+ # DB[:items].except(DB[:other_items])
150
+ # # SELECT * FROM (SELECT * FROM items EXCEPT SELECT * FROM other_items) AS t1
151
+ #
152
+ # DB[:items].except(DB[:other_items], all: true, from_self: false)
153
+ # # SELECT * FROM items EXCEPT ALL SELECT * FROM other_items
154
+ #
155
+ # DB[:items].except(DB[:other_items], alias: :i)
156
+ # # SELECT * FROM (SELECT * FROM items EXCEPT SELECT * FROM other_items) AS i
157
+ def except(dataset, opts=OPTS)
158
+ raise(InvalidOperation, "EXCEPT not supported") unless supports_intersect_except?
159
+ raise(InvalidOperation, "EXCEPT ALL not supported") if opts[:all] && !supports_intersect_except_all?
160
+ compound_clone(:except, dataset, opts)
161
+ end
162
+
163
+ # Performs the inverse of Dataset#where. Note that if you have multiple filter
164
+ # conditions, this is not the same as a negation of all conditions.
165
+ #
166
+ # DB[:items].exclude(category: 'software')
167
+ # # SELECT * FROM items WHERE (category != 'software')
168
+ #
169
+ # DB[:items].exclude(category: 'software', id: 3)
170
+ # # SELECT * FROM items WHERE ((category != 'software') OR (id != 3))
171
+ #
172
+ # Also note that SQL uses 3-valued boolean logic (+true+, +false+, +NULL+), so
173
+ # the inverse of a true condition is a false condition, and will still
174
+ # not match rows that were NULL originally. If you take the earlier
175
+ # example:
176
+ #
177
+ # DB[:items].exclude(category: 'software')
178
+ # # SELECT * FROM items WHERE (category != 'software')
179
+ #
180
+ # Note that this does not match rows where +category+ is +NULL+. This
181
+ # is because +NULL+ is an unknown value, and you do not know whether
182
+ # or not the +NULL+ category is +software+. You can explicitly
183
+ # specify how to handle +NULL+ values if you want:
184
+ #
185
+ # DB[:items].exclude(Sequel.~(category: nil) & {category: 'software'})
186
+ # # SELECT * FROM items WHERE ((category IS NULL) OR (category != 'software'))
187
+ def exclude(*cond, &block)
188
+ add_filter(:where, cond, true, &block)
189
+ end
190
+
191
+ # Inverts the given conditions and adds them to the HAVING clause.
192
+ #
193
+ # DB[:items].select_group(:name).exclude_having{count(name) < 2}
194
+ # # SELECT name FROM items GROUP BY name HAVING (count(name) >= 2)
195
+ #
196
+ # See documentation for exclude for how inversion is handled in regards
197
+ # to SQL 3-valued boolean logic.
198
+ def exclude_having(*cond, &block)
199
+ add_filter(:having, cond, true, &block)
200
+ end
201
+
202
+ if TRUE_FREEZE
203
+ # Return a clone of the dataset loaded with the given dataset extensions.
204
+ # If no related extension file exists or the extension does not have
205
+ # specific support for Dataset objects, an error will be raised.
206
+ def extension(*exts)
207
+ exts.each{|ext| Sequel.extension(ext) unless Sequel.synchronize{EXTENSIONS[ext]}}
208
+ mods = exts.map{|ext| Sequel.synchronize{EXTENSION_MODULES[ext]}}
209
+ if mods.all?
210
+ with_extend(*mods)
211
+ else
212
+ with_extend(DeprecatedSingletonClassMethods).extension(*exts)
213
+ end
214
+ end
215
+ else
216
+ # :nocov:
217
+ def extension(*exts) # :nodoc:
218
+ c = clone
219
+ c.send(:_extension!, exts)
220
+ c
221
+ end
222
+ # :nocov:
223
+ end
224
+
225
+ # Alias for where.
226
+ def filter(*cond, &block)
227
+ where(*cond, &block)
228
+ end
229
+
230
+ # Returns a cloned dataset with a :update lock style.
231
+ #
232
+ # DB[:table].for_update # SELECT * FROM table FOR UPDATE
233
+ def for_update
234
+ cached_lock_style_dataset(:_for_update_ds, :update)
235
+ end
236
+
237
+ # Returns a copy of the dataset with the source changed. If no
238
+ # source is given, removes all tables. If multiple sources
239
+ # are given, it is the same as using a CROSS JOIN (cartesian product) between all tables.
240
+ # If a block is given, it is treated as a virtual row block, similar to +where+.
241
+ #
242
+ # DB[:items].from # SQL: SELECT *
243
+ # DB[:items].from(:blah) # SQL: SELECT * FROM blah
244
+ # DB[:items].from(:blah, :foo) # SQL: SELECT * FROM blah, foo
245
+ # DB[:items].from{fun(arg)} # SQL: SELECT * FROM fun(arg)
246
+ def from(*source, &block)
247
+ virtual_row_columns(source, block)
248
+ table_alias_num = 0
249
+ ctes = nil
250
+ source.map! do |s|
251
+ case s
252
+ when Dataset
253
+ if hoist_cte?(s)
254
+ ctes ||= []
255
+ ctes += s.opts[:with]
256
+ s = s.clone(:with=>nil)
257
+ end
258
+ SQL::AliasedExpression.new(s, dataset_alias(table_alias_num+=1))
259
+ when Symbol
260
+ sch, table, aliaz = split_symbol(s)
261
+ if aliaz
262
+ s = sch ? SQL::QualifiedIdentifier.new(sch, table) : SQL::Identifier.new(table)
263
+ SQL::AliasedExpression.new(s, aliaz.to_sym)
264
+ else
265
+ s
266
+ end
267
+ else
268
+ s
269
+ end
270
+ end
271
+ o = {:from=>source.empty? ? nil : source.freeze}
272
+ o[:with] = ((opts[:with] || EMPTY_ARRAY) + ctes).freeze if ctes
273
+ o[:num_dataset_sources] = table_alias_num if table_alias_num > 0
274
+ clone(o)
275
+ end
276
+
277
+ # Returns a dataset selecting from the current dataset.
278
+ # Options:
279
+ # :alias :: Controls the alias of the table
280
+ # :column_aliases :: Also aliases columns, using derived column lists.
281
+ # Only used in conjunction with :alias.
282
+ #
283
+ # ds = DB[:items].order(:name).select(:id, :name)
284
+ # # SELECT id,name FROM items ORDER BY name
285
+ #
286
+ # ds.from_self
287
+ # # SELECT * FROM (SELECT id, name FROM items ORDER BY name) AS t1
288
+ #
289
+ # ds.from_self(alias: :foo)
290
+ # # SELECT * FROM (SELECT id, name FROM items ORDER BY name) AS foo
291
+ #
292
+ # ds.from_self(alias: :foo, column_aliases: [:c1, :c2])
293
+ # # SELECT * FROM (SELECT id, name FROM items ORDER BY name) AS foo(c1, c2)
294
+ def from_self(opts=OPTS)
295
+ fs = {}
296
+ @opts.keys.each{|k| fs[k] = nil unless non_sql_option?(k)}
297
+ pr = proc do
298
+ c = clone(fs).from(opts[:alias] ? as(opts[:alias], opts[:column_aliases]) : self)
299
+ if cols = _columns
300
+ c.send(:columns=, cols)
301
+ end
302
+ c
303
+ end
304
+
305
+ opts.empty? ? cached_dataset(:_from_self_ds, &pr) : pr.call
306
+ end
307
+
308
+ # Match any of the columns to any of the patterns. The terms can be
309
+ # strings (which use LIKE) or regular expressions if the database supports that.
310
+ # Note that the total number of pattern matches will be
311
+ # Array(columns).length * Array(terms).length,
312
+ # which could cause performance issues.
313
+ #
314
+ # Options (all are boolean):
315
+ #
316
+ # :all_columns :: All columns must be matched to any of the given patterns.
317
+ # :all_patterns :: All patterns must match at least one of the columns.
318
+ # :case_insensitive :: Use a case insensitive pattern match (the default is
319
+ # case sensitive if the database supports it).
320
+ #
321
+ # If both :all_columns and :all_patterns are true, all columns must match all patterns.
322
+ #
323
+ # Examples:
324
+ #
325
+ # dataset.grep(:a, '%test%')
326
+ # # SELECT * FROM items WHERE (a LIKE '%test%' ESCAPE '\')
327
+ #
328
+ # dataset.grep([:a, :b], %w'%test% foo')
329
+ # # SELECT * FROM items WHERE ((a LIKE '%test%' ESCAPE '\') OR (a LIKE 'foo' ESCAPE '\')
330
+ # # OR (b LIKE '%test%' ESCAPE '\') OR (b LIKE 'foo' ESCAPE '\'))
331
+ #
332
+ # dataset.grep([:a, :b], %w'%foo% %bar%', all_patterns: true)
333
+ # # SELECT * FROM a WHERE (((a LIKE '%foo%' ESCAPE '\') OR (b LIKE '%foo%' ESCAPE '\'))
334
+ # # AND ((a LIKE '%bar%' ESCAPE '\') OR (b LIKE '%bar%' ESCAPE '\')))
335
+ #
336
+ # dataset.grep([:a, :b], %w'%foo% %bar%', all_columns: true)
337
+ # # SELECT * FROM a WHERE (((a LIKE '%foo%' ESCAPE '\') OR (a LIKE '%bar%' ESCAPE '\'))
338
+ # # AND ((b LIKE '%foo%' ESCAPE '\') OR (b LIKE '%bar%' ESCAPE '\')))
339
+ #
340
+ # dataset.grep([:a, :b], %w'%foo% %bar%', all_patterns: true, all_columns: true)
341
+ # # SELECT * FROM a WHERE ((a LIKE '%foo%' ESCAPE '\') AND (b LIKE '%foo%' ESCAPE '\')
342
+ # # AND (a LIKE '%bar%' ESCAPE '\') AND (b LIKE '%bar%' ESCAPE '\'))
343
+ def grep(columns, patterns, opts=OPTS)
344
+ column_op = opts[:all_columns] ? :AND : :OR
345
+ if opts[:all_patterns]
346
+ conds = Array(patterns).map do |pat|
347
+ SQL::BooleanExpression.new(column_op, *Array(columns).map{|c| SQL::StringExpression.like(c, pat, opts)})
348
+ end
349
+ where(SQL::BooleanExpression.new(:AND, *conds))
350
+ else
351
+ conds = Array(columns).map do |c|
352
+ SQL::BooleanExpression.new(:OR, *Array(patterns).map{|pat| SQL::StringExpression.like(c, pat, opts)})
353
+ end
354
+ where(SQL::BooleanExpression.new(column_op, *conds))
355
+ end
356
+ end
357
+
358
+ # Returns a copy of the dataset with the results grouped by the value of
359
+ # the given columns. If a block is given, it is treated
360
+ # as a virtual row block, similar to +where+.
361
+ #
362
+ # DB[:items].group(:id) # SELECT * FROM items GROUP BY id
363
+ # DB[:items].group(:id, :name) # SELECT * FROM items GROUP BY id, name
364
+ # DB[:items].group{[a, sum(b)]} # SELECT * FROM items GROUP BY a, sum(b)
365
+ def group(*columns, &block)
366
+ virtual_row_columns(columns, block)
367
+ clone(:group => (columns.compact.empty? ? nil : columns.freeze))
368
+ end
369
+
370
+ # Alias of group
371
+ def group_by(*columns, &block)
372
+ group(*columns, &block)
373
+ end
374
+
375
+ # Returns a dataset grouped by the given column with count by group.
376
+ # Column aliases may be supplied, and will be included in the select clause.
377
+ # If a block is given, it is treated as a virtual row block, similar to +where+.
378
+ #
379
+ # Examples:
380
+ #
381
+ # DB[:items].group_and_count(:name).all
382
+ # # SELECT name, count(*) AS count FROM items GROUP BY name
383
+ # # => [{:name=>'a', :count=>1}, ...]
384
+ #
385
+ # DB[:items].group_and_count(:first_name, :last_name).all
386
+ # # SELECT first_name, last_name, count(*) AS count FROM items GROUP BY first_name, last_name
387
+ # # => [{:first_name=>'a', :last_name=>'b', :count=>1}, ...]
388
+ #
389
+ # DB[:items].group_and_count(Sequel[:first_name].as(:name)).all
390
+ # # SELECT first_name AS name, count(*) AS count FROM items GROUP BY first_name
391
+ # # => [{:name=>'a', :count=>1}, ...]
392
+ #
393
+ # DB[:items].group_and_count{substr(:first_name, 1, 1).as(:initial)}.all
394
+ # # SELECT substr(first_name, 1, 1) AS initial, count(*) AS count FROM items GROUP BY substr(first_name, 1, 1)
395
+ # # => [{:initial=>'a', :count=>1}, ...]
396
+ def group_and_count(*columns, &block)
397
+ select_group(*columns, &block).select_append(COUNT_OF_ALL_AS_COUNT)
398
+ end
399
+
400
+ # Returns a copy of the dataset with the given columns added to the list of
401
+ # existing columns to group on. If no existing columns are present this
402
+ # method simply sets the columns as the initial ones to group on.
403
+ #
404
+ # DB[:items].group_append(:b) # SELECT * FROM items GROUP BY b
405
+ # DB[:items].group(:a).group_append(:b) # SELECT * FROM items GROUP BY a, b
406
+ def group_append(*columns, &block)
407
+ columns = @opts[:group] + columns if @opts[:group]
408
+ group(*columns, &block)
409
+ end
410
+
411
+ # Adds the appropriate CUBE syntax to GROUP BY.
412
+ def group_cube
413
+ raise Error, "GROUP BY CUBE not supported on #{db.database_type}" unless supports_group_cube?
414
+ clone(:group_options=>:cube)
415
+ end
416
+
417
+ # Adds the appropriate ROLLUP syntax to GROUP BY.
418
+ def group_rollup
419
+ raise Error, "GROUP BY ROLLUP not supported on #{db.database_type}" unless supports_group_rollup?
420
+ clone(:group_options=>:rollup)
421
+ end
422
+
423
+ # Adds the appropriate GROUPING SETS syntax to GROUP BY.
424
+ def grouping_sets
425
+ raise Error, "GROUP BY GROUPING SETS not supported on #{db.database_type}" unless supports_grouping_sets?
426
+ clone(:group_options=>:"grouping sets")
427
+ end
428
+
429
+ # Returns a copy of the dataset with the HAVING conditions changed. See #where for argument types.
430
+ #
431
+ # DB[:items].group(:sum).having(sum: 10)
432
+ # # SELECT * FROM items GROUP BY sum HAVING (sum = 10)
433
+ def having(*cond, &block)
434
+ add_filter(:having, cond, &block)
435
+ end
436
+
437
+ # Adds an INTERSECT clause using a second dataset object.
438
+ # An INTERSECT compound dataset returns all rows in both the current dataset
439
+ # and the given dataset.
440
+ # Raises an +InvalidOperation+ if the operation is not supported.
441
+ # Options:
442
+ # :alias :: Use the given value as the from_self alias
443
+ # :all :: Set to true to use INTERSECT ALL instead of INTERSECT, so duplicate rows can occur
444
+ # :from_self :: Set to false to not wrap the returned dataset in a from_self, use with care.
445
+ #
446
+ # DB[:items].intersect(DB[:other_items])
447
+ # # SELECT * FROM (SELECT * FROM items INTERSECT SELECT * FROM other_items) AS t1
448
+ #
449
+ # DB[:items].intersect(DB[:other_items], all: true, from_self: false)
450
+ # # SELECT * FROM items INTERSECT ALL SELECT * FROM other_items
451
+ #
452
+ # DB[:items].intersect(DB[:other_items], alias: :i)
453
+ # # SELECT * FROM (SELECT * FROM items INTERSECT SELECT * FROM other_items) AS i
454
+ def intersect(dataset, opts=OPTS)
455
+ raise(InvalidOperation, "INTERSECT not supported") unless supports_intersect_except?
456
+ raise(InvalidOperation, "INTERSECT ALL not supported") if opts[:all] && !supports_intersect_except_all?
457
+ compound_clone(:intersect, dataset, opts)
458
+ end
459
+
460
+ # Inverts the current WHERE and HAVING clauses. If there is neither a
461
+ # WHERE or HAVING clause, adds a WHERE clause that is always false.
462
+ #
463
+ # DB[:items].where(category: 'software').invert
464
+ # # SELECT * FROM items WHERE (category != 'software')
465
+ #
466
+ # DB[:items].where(category: 'software', id: 3).invert
467
+ # # SELECT * FROM items WHERE ((category != 'software') OR (id != 3))
468
+ #
469
+ # See documentation for exclude for how inversion is handled in regards
470
+ # to SQL 3-valued boolean logic.
471
+ def invert
472
+ cached_dataset(:_invert_ds) do
473
+ having, where = @opts.values_at(:having, :where)
474
+ if having.nil? && where.nil?
475
+ where(false)
476
+ else
477
+ o = {}
478
+ o[:having] = SQL::BooleanExpression.invert(having) if having
479
+ o[:where] = SQL::BooleanExpression.invert(where) if where
480
+ clone(o)
481
+ end
482
+ end
483
+ end
484
+
485
+ # Alias of +inner_join+
486
+ def join(*args, &block)
487
+ inner_join(*args, &block)
488
+ end
489
+
490
+ # Returns a joined dataset. Not usually called directly, users should use the
491
+ # appropriate join method (e.g. join, left_join, natural_join, cross_join) which fills
492
+ # in the +type+ argument.
493
+ #
494
+ # Takes the following arguments:
495
+ #
496
+ # type :: The type of join to do (e.g. :inner)
497
+ # table :: table to join into the current dataset. Generally one of the following types:
498
+ # String, Symbol :: identifier used as table or view name
499
+ # Dataset :: a subselect is performed with an alias of tN for some value of N
500
+ # SQL::Function :: set returning function
501
+ # SQL::AliasedExpression :: already aliased expression. Uses given alias unless
502
+ # overridden by the :table_alias option.
503
+ # expr :: conditions used when joining, depends on type:
504
+ # Hash, Array of pairs :: Assumes key (1st arg) is column of joined table (unless already
505
+ # qualified), and value (2nd arg) is column of the last joined or
506
+ # primary table (or the :implicit_qualifier option).
507
+ # To specify multiple conditions on a single joined table column,
508
+ # you must use an array. Uses a JOIN with an ON clause.
509
+ # Array :: If all members of the array are symbols, considers them as columns and
510
+ # uses a JOIN with a USING clause. Most databases will remove duplicate columns from
511
+ # the result set if this is used.
512
+ # nil :: If a block is not given, doesn't use ON or USING, so the JOIN should be a NATURAL
513
+ # or CROSS join. If a block is given, uses an ON clause based on the block, see below.
514
+ # otherwise :: Treats the argument as a filter expression, so strings are considered literal, symbols
515
+ # specify boolean columns, and Sequel expressions can be used. Uses a JOIN with an ON clause.
516
+ # options :: a hash of options, with the following keys supported:
517
+ # :table_alias :: Override the table alias used when joining. In general you shouldn't use this
518
+ # option, you should provide the appropriate SQL::AliasedExpression as the table
519
+ # argument.
520
+ # :implicit_qualifier :: The name to use for qualifying implicit conditions. By default,
521
+ # the last joined or primary table is used.
522
+ # :join_using :: Force the using of JOIN USING, even if +expr+ is not an array of symbols.
523
+ # :reset_implicit_qualifier :: Can set to false to ignore this join when future joins determine qualifier
524
+ # for implicit conditions.
525
+ # :qualify :: Can be set to false to not do any implicit qualification. Can be set
526
+ # to :deep to use the Qualifier AST Transformer, which will attempt to qualify
527
+ # subexpressions of the expression tree. Can be set to :symbol to only qualify
528
+ # symbols. Defaults to the value of default_join_table_qualification.
529
+ # block :: The block argument should only be given if a JOIN with an ON clause is used,
530
+ # in which case it yields the table alias/name for the table currently being joined,
531
+ # the table alias/name for the last joined (or first table), and an array of previous
532
+ # SQL::JoinClause. Unlike +where+, this block is not treated as a virtual row block.
533
+ #
534
+ # Examples:
535
+ #
536
+ # DB[:a].join_table(:cross, :b)
537
+ # # SELECT * FROM a CROSS JOIN b
538
+ #
539
+ # DB[:a].join_table(:inner, DB[:b], c: d)
540
+ # # SELECT * FROM a INNER JOIN (SELECT * FROM b) AS t1 ON (t1.c = a.d)
541
+ #
542
+ # DB[:a].join_table(:left, Sequel[:b].as(:c), [:d])
543
+ # # SELECT * FROM a LEFT JOIN b AS c USING (d)
544
+ #
545
+ # DB[:a].natural_join(:b).join_table(:inner, :c) do |ta, jta, js|
546
+ # (Sequel.qualify(ta, :d) > Sequel.qualify(jta, :e)) & {Sequel.qualify(ta, :f)=>DB.from(js.first.table).select(:g)}
547
+ # end
548
+ # # SELECT * FROM a NATURAL JOIN b INNER JOIN c
549
+ # # ON ((c.d > b.e) AND (c.f IN (SELECT g FROM b)))
550
+ def join_table(type, table, expr=nil, options=OPTS, &block)
551
+ if hoist_cte?(table)
552
+ s, ds = hoist_cte(table)
553
+ return s.join_table(type, ds, expr, options, &block)
554
+ end
555
+
556
+ using_join = options[:join_using] || (expr.is_a?(Array) && !expr.empty? && expr.all?{|x| x.is_a?(Symbol)})
557
+ if using_join && !supports_join_using?
558
+ h = {}
559
+ expr.each{|e| h[e] = e}
560
+ return join_table(type, table, h, options)
561
+ end
562
+
563
+ table_alias = options[:table_alias]
564
+
565
+ if table.is_a?(SQL::AliasedExpression)
566
+ table_expr = if table_alias
567
+ SQL::AliasedExpression.new(table.expression, table_alias, table.columns)
568
+ else
569
+ table
570
+ end
571
+ table = table_expr.expression
572
+ table_name = table_alias = table_expr.alias
573
+ elsif table.is_a?(Dataset)
574
+ if table_alias.nil?
575
+ table_alias_num = (@opts[:num_dataset_sources] || 0) + 1
576
+ table_alias = dataset_alias(table_alias_num)
577
+ end
578
+ table_name = table_alias
579
+ table_expr = SQL::AliasedExpression.new(table, table_alias)
580
+ else
581
+ table, implicit_table_alias = split_alias(table)
582
+ table_alias ||= implicit_table_alias
583
+ table_name = table_alias || table
584
+ table_expr = table_alias ? SQL::AliasedExpression.new(table, table_alias) : table
585
+ end
586
+
587
+ join = if expr.nil? and !block
588
+ SQL::JoinClause.new(type, table_expr)
589
+ elsif using_join
590
+ raise(Sequel::Error, "can't use a block if providing an array of symbols as expr") if block
591
+ SQL::JoinUsingClause.new(expr, type, table_expr)
592
+ else
593
+ last_alias = options[:implicit_qualifier] || @opts[:last_joined_table] || first_source_alias
594
+ qualify_type = options[:qualify]
595
+ if Sequel.condition_specifier?(expr)
596
+ expr = expr.map do |k, v|
597
+ qualify_type = default_join_table_qualification if qualify_type.nil?
598
+ case qualify_type
599
+ when false
600
+ nil # Do no qualification
601
+ when :deep
602
+ k = Sequel::Qualifier.new(table_name).transform(k)
603
+ v = Sequel::Qualifier.new(last_alias).transform(v)
604
+ else
605
+ k = qualified_column_name(k, table_name) if k.is_a?(Symbol)
606
+ v = qualified_column_name(v, last_alias) if v.is_a?(Symbol)
607
+ end
608
+ [k,v]
609
+ end
610
+ expr = SQL::BooleanExpression.from_value_pairs(expr)
611
+ end
612
+ if block
613
+ expr2 = yield(table_name, last_alias, @opts[:join] || EMPTY_ARRAY)
614
+ expr = expr ? SQL::BooleanExpression.new(:AND, expr, expr2) : expr2
615
+ end
616
+ SQL::JoinOnClause.new(expr, type, table_expr)
617
+ end
618
+
619
+ opts = {:join => ((@opts[:join] || EMPTY_ARRAY) + [join]).freeze}
620
+ opts[:last_joined_table] = table_name unless options[:reset_implicit_qualifier] == false
621
+ opts[:num_dataset_sources] = table_alias_num if table_alias_num
622
+ clone(opts)
623
+ end
624
+
625
+ CONDITIONED_JOIN_TYPES.each do |jtype|
626
+ class_eval("def #{jtype}_join(*args, &block); join_table(:#{jtype}, *args, &block) end", __FILE__, __LINE__)
627
+ end
628
+ UNCONDITIONED_JOIN_TYPES.each do |jtype|
629
+ class_eval(<<-END, __FILE__, __LINE__+1)
630
+ def #{jtype}_join(table, opts=Sequel::OPTS)
631
+ raise(Sequel::Error, '#{jtype}_join does not accept join table blocks') if defined?(yield)
632
+ raise(Sequel::Error, '#{jtype}_join 2nd argument should be an options hash, not conditions') unless opts.is_a?(Hash)
633
+ join_table(:#{jtype}, table, nil, opts)
634
+ end
635
+ END
636
+ end
637
+
638
+ # Marks this dataset as a lateral dataset. If used in another dataset's FROM
639
+ # or JOIN clauses, it will surround the subquery with LATERAL to enable it
640
+ # to deal with previous tables in the query:
641
+ #
642
+ # DB.from(:a, DB[:b].where(Sequel[:a][:c]=>Sequel[:b][:d]).lateral)
643
+ # # SELECT * FROM a, LATERAL (SELECT * FROM b WHERE (a.c = b.d))
644
+ def lateral
645
+ return self if opts[:lateral]
646
+ cached_dataset(:_lateral_ds){clone(:lateral=>true)}
647
+ end
648
+
649
+ # If given an integer, the dataset will contain only the first l results.
650
+ # If given a range, it will contain only those at offsets within that
651
+ # range. If a second argument is given, it is used as an offset. To use
652
+ # an offset without a limit, pass nil as the first argument.
653
+ #
654
+ # DB[:items].limit(10) # SELECT * FROM items LIMIT 10
655
+ # DB[:items].limit(10, 20) # SELECT * FROM items LIMIT 10 OFFSET 20
656
+ # DB[:items].limit(10...20) # SELECT * FROM items LIMIT 10 OFFSET 10
657
+ # DB[:items].limit(10..20) # SELECT * FROM items LIMIT 11 OFFSET 10
658
+ # DB[:items].limit(nil, 20) # SELECT * FROM items OFFSET 20
659
+ def limit(l, o = (no_offset = true; nil))
660
+ return from_self.limit(l, o) if @opts[:sql]
661
+
662
+ if l.is_a?(Range)
663
+ no_offset = false
664
+ o = l.first
665
+ l = l.last - l.first + (l.exclude_end? ? 0 : 1)
666
+ end
667
+ l = l.to_i if l.is_a?(String) && !l.is_a?(LiteralString)
668
+ if l.is_a?(Integer)
669
+ raise(Error, 'Limits must be greater than or equal to 1') unless l >= 1
670
+ end
671
+
672
+ ds = clone(:limit=>l)
673
+ ds = ds.offset(o) unless no_offset
674
+ ds
675
+ end
676
+
677
+ # Returns a cloned dataset with the given lock style. If style is a
678
+ # string, it will be used directly. You should never pass a string
679
+ # to this method that is derived from user input, as that can lead to
680
+ # SQL injection.
681
+ #
682
+ # A symbol may be used for database independent locking behavior, but
683
+ # all supported symbols have separate methods (e.g. for_update).
684
+ #
685
+ # DB[:items].lock_style('FOR SHARE NOWAIT')
686
+ # # SELECT * FROM items FOR SHARE NOWAIT
687
+ # DB[:items].lock_style('FOR UPDATE OF table1 SKIP LOCKED')
688
+ # # SELECT * FROM items FOR UPDATE OF table1 SKIP LOCKED
689
+ def lock_style(style)
690
+ clone(:lock => style)
691
+ end
692
+
693
+ # Return a dataset with a WHEN MATCHED THEN DELETE clause added to the
694
+ # MERGE statement. If a block is passed, treat it as a virtual row and
695
+ # use it as additional conditions for the match.
696
+ #
697
+ # merge_delete
698
+ # # WHEN MATCHED THEN DELETE
699
+ #
700
+ # merge_delete{a > 30}
701
+ # # WHEN MATCHED AND (a > 30) THEN DELETE
702
+ def merge_delete(&block)
703
+ _merge_when(:type=>:delete, &block)
704
+ end
705
+
706
+ # Return a dataset with a WHEN NOT MATCHED THEN INSERT clause added to the
707
+ # MERGE statement. If a block is passed, treat it as a virtual row and
708
+ # use it as additional conditions for the match.
709
+ #
710
+ # The arguments provided can be any arguments that would be accepted by
711
+ # #insert.
712
+ #
713
+ # merge_insert(i1: :i2, a: Sequel[:b]+11)
714
+ # # WHEN NOT MATCHED THEN INSERT (i1, a) VALUES (i2, (b + 11))
715
+ #
716
+ # merge_insert(:i2, Sequel[:b]+11){a > 30}
717
+ # # WHEN NOT MATCHED AND (a > 30) THEN INSERT VALUES (i2, (b + 11))
718
+ def merge_insert(*values, &block)
719
+ _merge_when(:type=>:insert, :values=>values, &block)
720
+ end
721
+
722
+ # Return a dataset with a WHEN MATCHED THEN UPDATE clause added to the
723
+ # MERGE statement. If a block is passed, treat it as a virtual row and
724
+ # use it as additional conditions for the match.
725
+ #
726
+ # merge_update(i1: Sequel[:i1]+:i2+10, a: Sequel[:a]+:b+20)
727
+ # # WHEN MATCHED THEN UPDATE SET i1 = (i1 + i2 + 10), a = (a + b + 20)
728
+ #
729
+ # merge_update(i1: :i2){a > 30}
730
+ # # WHEN MATCHED AND (a > 30) THEN UPDATE SET i1 = i2
731
+ def merge_update(values, &block)
732
+ _merge_when(:type=>:update, :values=>values, &block)
733
+ end
734
+
735
+ # Return a dataset with the source and join condition to use for the MERGE statement.
736
+ #
737
+ # merge_using(:m2, i1: :i2)
738
+ # # USING m2 ON (i1 = i2)
739
+ def merge_using(source, join_condition)
740
+ clone(:merge_using => [source, join_condition].freeze)
741
+ end
742
+
743
+ # Returns a cloned dataset without a row_proc.
744
+ #
745
+ # ds = DB[:items].with_row_proc(:invert.to_proc)
746
+ # ds.all # => [{2=>:id}]
747
+ # ds.naked.all # => [{:id=>2}]
748
+ def naked
749
+ return self unless opts[:row_proc]
750
+ cached_dataset(:_naked_ds){with_row_proc(nil)}
751
+ end
752
+
753
+ # Returns a copy of the dataset that will raise a DatabaseLockTimeout instead
754
+ # of waiting for rows that are locked by another transaction
755
+ #
756
+ # DB[:items].for_update.nowait
757
+ # # SELECT * FROM items FOR UPDATE NOWAIT
758
+ def nowait
759
+ return self if opts[:nowait]
760
+ cached_dataset(:_nowait_ds) do
761
+ raise(Error, 'This dataset does not support raises errors instead of waiting for locked rows') unless supports_nowait?
762
+ clone(:nowait=>true)
763
+ end
764
+ end
765
+
766
+ # Returns a copy of the dataset with a specified order. Can be safely combined with limit.
767
+ # If you call limit with an offset, it will override the offset if you've called
768
+ # offset first.
769
+ #
770
+ # DB[:items].offset(10) # SELECT * FROM items OFFSET 10
771
+ def offset(o)
772
+ o = o.to_i if o.is_a?(String) && !o.is_a?(LiteralString)
773
+ if o.is_a?(Integer)
774
+ raise(Error, 'Offsets must be greater than or equal to 0') unless o >= 0
775
+ end
776
+ clone(:offset => o)
777
+ end
778
+
779
+ # Adds an alternate filter to an existing WHERE clause using OR. If there
780
+ # is no WHERE clause, then the default is WHERE true, and OR would be redundant,
781
+ # so return the dataset in that case.
782
+ #
783
+ # DB[:items].where(:a).or(:b) # SELECT * FROM items WHERE a OR b
784
+ # DB[:items].or(:b) # SELECT * FROM items
785
+ def or(*cond, &block)
786
+ if @opts[:where].nil?
787
+ self
788
+ else
789
+ add_filter(:where, cond, false, :OR, &block)
790
+ end
791
+ end
792
+
793
+ # Returns a copy of the dataset with the order changed. If the dataset has an
794
+ # existing order, it is ignored and overwritten with this order. If a nil is given
795
+ # the returned dataset has no order. This can accept multiple arguments
796
+ # of varying kinds, such as SQL functions. If a block is given, it is treated
797
+ # as a virtual row block, similar to +where+.
798
+ #
799
+ # DB[:items].order(:name) # SELECT * FROM items ORDER BY name
800
+ # DB[:items].order(:a, :b) # SELECT * FROM items ORDER BY a, b
801
+ # DB[:items].order(Sequel.lit('a + b')) # SELECT * FROM items ORDER BY a + b
802
+ # DB[:items].order(Sequel[:a] + :b) # SELECT * FROM items ORDER BY (a + b)
803
+ # DB[:items].order(Sequel.desc(:name)) # SELECT * FROM items ORDER BY name DESC
804
+ # DB[:items].order(Sequel.asc(:name, nulls: :last)) # SELECT * FROM items ORDER BY name ASC NULLS LAST
805
+ # DB[:items].order{sum(name).desc} # SELECT * FROM items ORDER BY sum(name) DESC
806
+ # DB[:items].order(nil) # SELECT * FROM items
807
+ def order(*columns, &block)
808
+ virtual_row_columns(columns, block)
809
+ clone(:order => (columns.compact.empty?) ? nil : columns.freeze)
810
+ end
811
+
812
+ # Returns a copy of the dataset with the order columns added
813
+ # to the end of the existing order.
814
+ #
815
+ # DB[:items].order(:a).order(:b) # SELECT * FROM items ORDER BY b
816
+ # DB[:items].order(:a).order_append(:b) # SELECT * FROM items ORDER BY a, b
817
+ def order_append(*columns, &block)
818
+ columns = @opts[:order] + columns if @opts[:order]
819
+ order(*columns, &block)
820
+ end
821
+
822
+ # Alias of order
823
+ def order_by(*columns, &block)
824
+ order(*columns, &block)
825
+ end
826
+
827
+ # Alias of order_append.
828
+ def order_more(*columns, &block)
829
+ order_append(*columns, &block)
830
+ end
831
+
832
+ # Returns a copy of the dataset with the order columns added
833
+ # to the beginning of the existing order.
834
+ #
835
+ # DB[:items].order(:a).order(:b) # SELECT * FROM items ORDER BY b
836
+ # DB[:items].order(:a).order_prepend(:b) # SELECT * FROM items ORDER BY b, a
837
+ def order_prepend(*columns, &block)
838
+ ds = order(*columns, &block)
839
+ @opts[:order] ? ds.order_append(*@opts[:order]) : ds
840
+ end
841
+
842
+ # Qualify to the given table, or first source if no table is given.
843
+ #
844
+ # DB[:items].where(id: 1).qualify
845
+ # # SELECT items.* FROM items WHERE (items.id = 1)
846
+ #
847
+ # DB[:items].where(id: 1).qualify(:i)
848
+ # # SELECT i.* FROM items WHERE (i.id = 1)
849
+ def qualify(table=(cache=true; first_source))
850
+ o = @opts
851
+ return self if o[:sql]
852
+
853
+ pr = proc do
854
+ h = {}
855
+ (o.keys & QUALIFY_KEYS).each do |k|
856
+ h[k] = qualified_expression(o[k], table)
857
+ end
858
+ h[:select] = [SQL::ColumnAll.new(table)].freeze if !o[:select] || o[:select].empty?
859
+ clone(h)
860
+ end
861
+
862
+ cache ? cached_dataset(:_qualify_ds, &pr) : pr.call
863
+ end
864
+
865
+ # Modify the RETURNING clause, only supported on a few databases. If returning
866
+ # is used, instead of insert returning the autogenerated primary key or
867
+ # update/delete returning the number of modified rows, results are
868
+ # returned using +fetch_rows+.
869
+ #
870
+ # DB[:items].returning # RETURNING *
871
+ # DB[:items].returning(nil) # RETURNING NULL
872
+ # DB[:items].returning(:id, :name) # RETURNING id, name
873
+ #
874
+ # DB[:items].returning.insert(a: 1) do |hash|
875
+ # # hash for each row inserted, with values for all columns
876
+ # end
877
+ # DB[:items].returning.update(a: 1) do |hash|
878
+ # # hash for each row updated, with values for all columns
879
+ # end
880
+ # DB[:items].returning.delete(a: 1) do |hash|
881
+ # # hash for each row deleted, with values for all columns
882
+ # end
883
+ def returning(*values)
884
+ if values.empty?
885
+ return self if opts[:returning] == EMPTY_ARRAY
886
+ cached_dataset(:_returning_ds) do
887
+ raise Error, "RETURNING is not supported on #{db.database_type}" unless supports_returning?(:insert)
888
+ clone(:returning=>EMPTY_ARRAY)
889
+ end
890
+ else
891
+ raise Error, "RETURNING is not supported on #{db.database_type}" unless supports_returning?(:insert)
892
+ clone(:returning=>values.freeze)
893
+ end
894
+ end
895
+
896
+ # Returns a copy of the dataset with the order reversed. If no order is
897
+ # given, the existing order is inverted.
898
+ #
899
+ # DB[:items].reverse(:id) # SELECT * FROM items ORDER BY id DESC
900
+ # DB[:items].reverse{foo(bar)} # SELECT * FROM items ORDER BY foo(bar) DESC
901
+ # DB[:items].order(:id).reverse # SELECT * FROM items ORDER BY id DESC
902
+ # DB[:items].order(:id).reverse(Sequel.desc(:name)) # SELECT * FROM items ORDER BY name ASC
903
+ def reverse(*order, &block)
904
+ if order.empty? && !block
905
+ cached_dataset(:_reverse_ds){order(*invert_order(@opts[:order]))}
906
+ else
907
+ virtual_row_columns(order, block)
908
+ order(*invert_order(order.empty? ? @opts[:order] : order.freeze))
909
+ end
910
+ end
911
+
912
+ # Alias of +reverse+
913
+ def reverse_order(*order, &block)
914
+ reverse(*order, &block)
915
+ end
916
+
917
+ # Returns a copy of the dataset with the columns selected changed
918
+ # to the given columns. This also takes a virtual row block,
919
+ # similar to +where+.
920
+ #
921
+ # DB[:items].select(:a) # SELECT a FROM items
922
+ # DB[:items].select(:a, :b) # SELECT a, b FROM items
923
+ # DB[:items].select{[a, sum(b)]} # SELECT a, sum(b) FROM items
924
+ def select(*columns, &block)
925
+ virtual_row_columns(columns, block)
926
+ clone(:select => columns.freeze)
927
+ end
928
+
929
+ # Returns a copy of the dataset selecting the wildcard if no arguments
930
+ # are given. If arguments are given, treat them as tables and select
931
+ # all columns (using the wildcard) from each table.
932
+ #
933
+ # DB[:items].select(:a).select_all # SELECT * FROM items
934
+ # DB[:items].select_all(:items) # SELECT items.* FROM items
935
+ # DB[:items].select_all(:items, :foo) # SELECT items.*, foo.* FROM items
936
+ def select_all(*tables)
937
+ if tables.empty?
938
+ return self unless opts[:select]
939
+ cached_dataset(:_select_all_ds){clone(:select => nil)}
940
+ else
941
+ select(*tables.map{|t| i, a = split_alias(t); a || i}.map!{|t| SQL::ColumnAll.new(t)}.freeze)
942
+ end
943
+ end
944
+
945
+ # Returns a copy of the dataset with the given columns added
946
+ # to the existing selected columns. If no columns are currently selected,
947
+ # it will select the columns given in addition to *.
948
+ #
949
+ # DB[:items].select(:a).select(:b) # SELECT b FROM items
950
+ # DB[:items].select(:a).select_append(:b) # SELECT a, b FROM items
951
+ # DB[:items].select_append(:b) # SELECT *, b FROM items
952
+ def select_append(*columns, &block)
953
+ virtual_row_columns(columns, block)
954
+ select(*(_current_select(true) + columns))
955
+ end
956
+
957
+ # Set both the select and group clauses with the given +columns+.
958
+ # Column aliases may be supplied, and will be included in the select clause.
959
+ # This also takes a virtual row block similar to +where+.
960
+ #
961
+ # DB[:items].select_group(:a, :b)
962
+ # # SELECT a, b FROM items GROUP BY a, b
963
+ #
964
+ # DB[:items].select_group(Sequel[:c].as(:a)){f(c2)}
965
+ # # SELECT c AS a, f(c2) FROM items GROUP BY c, f(c2)
966
+ def select_group(*columns, &block)
967
+ virtual_row_columns(columns, block)
968
+ select(*columns).group(*columns.map{|c| unaliased_identifier(c)})
969
+ end
970
+
971
+ # Alias for select_append.
972
+ def select_more(*columns, &block)
973
+ select_append(*columns, &block)
974
+ end
975
+
976
+ # Returns a copy of the dataset with the given columns added
977
+ # to the existing selected columns. If no columns are currently selected,
978
+ # it will select the columns given in addition to *.
979
+ #
980
+ # DB[:items].select(:a).select(:b) # SELECT b FROM items
981
+ # DB[:items].select(:a).select_prepend(:b) # SELECT b, a FROM items
982
+ # DB[:items].select_prepend(:b) # SELECT b, * FROM items
983
+ def select_prepend(*columns, &block)
984
+ virtual_row_columns(columns, block)
985
+ select(*(columns + _current_select(false)))
986
+ end
987
+
988
+ # Set the server for this dataset to use. Used to pick a specific database
989
+ # shard to run a query against, or to override the default (where SELECT uses
990
+ # :read_only database and all other queries use the :default database). This
991
+ # method is always available but is only useful when database sharding is being
992
+ # used.
993
+ #
994
+ # DB[:items].all # Uses the :read_only or :default server
995
+ # DB[:items].delete # Uses the :default server
996
+ # DB[:items].server(:blah).delete # Uses the :blah server
997
+ def server(servr)
998
+ clone(:server=>servr)
999
+ end
1000
+
1001
+ # If the database uses sharding and the current dataset has not had a
1002
+ # server set, return a cloned dataset that uses the given server.
1003
+ # Otherwise, return the receiver directly instead of returning a clone.
1004
+ def server?(server)
1005
+ if db.sharded? && !opts[:server]
1006
+ server(server)
1007
+ else
1008
+ self
1009
+ end
1010
+ end
1011
+
1012
+ # Specify that the check for limits/offsets when updating/deleting be skipped for the dataset.
1013
+ def skip_limit_check
1014
+ return self if opts[:skip_limit_check]
1015
+ cached_dataset(:_skip_limit_check_ds) do
1016
+ clone(:skip_limit_check=>true)
1017
+ end
1018
+ end
1019
+
1020
+ # Skip locked rows when returning results from this dataset.
1021
+ def skip_locked
1022
+ return self if opts[:skip_locked]
1023
+ cached_dataset(:_skip_locked_ds) do
1024
+ raise(Error, 'This dataset does not support skipping locked rows') unless supports_skip_locked?
1025
+ clone(:skip_locked=>true)
1026
+ end
1027
+ end
1028
+
1029
+ # Returns a copy of the dataset with no filters (HAVING or WHERE clause) applied.
1030
+ #
1031
+ # DB[:items].group(:a).having(a: 1).where(:b).unfiltered
1032
+ # # SELECT * FROM items GROUP BY a
1033
+ def unfiltered
1034
+ return self unless opts[:where] || opts[:having]
1035
+ cached_dataset(:_unfiltered_ds){clone(:where => nil, :having => nil)}
1036
+ end
1037
+
1038
+ # Returns a copy of the dataset with no grouping (GROUP or HAVING clause) applied.
1039
+ #
1040
+ # DB[:items].group(:a).having(a: 1).where(:b).ungrouped
1041
+ # # SELECT * FROM items WHERE b
1042
+ def ungrouped
1043
+ return self unless opts[:group] || opts[:having]
1044
+ cached_dataset(:_ungrouped_ds){clone(:group => nil, :having => nil)}
1045
+ end
1046
+
1047
+ # Adds a UNION clause using a second dataset object.
1048
+ # A UNION compound dataset returns all rows in either the current dataset
1049
+ # or the given dataset.
1050
+ # Options:
1051
+ # :alias :: Use the given value as the from_self alias
1052
+ # :all :: Set to true to use UNION ALL instead of UNION, so duplicate rows can occur
1053
+ # :from_self :: Set to false to not wrap the returned dataset in a from_self, use with care.
1054
+ #
1055
+ # DB[:items].union(DB[:other_items])
1056
+ # # SELECT * FROM (SELECT * FROM items UNION SELECT * FROM other_items) AS t1
1057
+ #
1058
+ # DB[:items].union(DB[:other_items], all: true, from_self: false)
1059
+ # # SELECT * FROM items UNION ALL SELECT * FROM other_items
1060
+ #
1061
+ # DB[:items].union(DB[:other_items], alias: :i)
1062
+ # # SELECT * FROM (SELECT * FROM items UNION SELECT * FROM other_items) AS i
1063
+ def union(dataset, opts=OPTS)
1064
+ compound_clone(:union, dataset, opts)
1065
+ end
1066
+
1067
+ # Returns a copy of the dataset with no limit or offset.
1068
+ #
1069
+ # DB[:items].limit(10, 20).unlimited # SELECT * FROM items
1070
+ def unlimited
1071
+ return self unless opts[:limit] || opts[:offset]
1072
+ cached_dataset(:_unlimited_ds){clone(:limit=>nil, :offset=>nil)}
1073
+ end
1074
+
1075
+ # Returns a copy of the dataset with no order.
1076
+ #
1077
+ # DB[:items].order(:a).unordered # SELECT * FROM items
1078
+ def unordered
1079
+ return self unless opts[:order]
1080
+ cached_dataset(:_unordered_ds){clone(:order=>nil)}
1081
+ end
1082
+
1083
+ # Returns a copy of the dataset with the given WHERE conditions imposed upon it.
1084
+ #
1085
+ # Accepts the following argument types:
1086
+ #
1087
+ # Hash, Array of pairs :: list of equality/inclusion expressions
1088
+ # Symbol :: taken as a boolean column argument (e.g. WHERE active)
1089
+ # Sequel::SQL::BooleanExpression, Sequel::LiteralString :: an existing condition expression, probably created
1090
+ # using the Sequel expression filter DSL.
1091
+ #
1092
+ # where also accepts a block, which should return one of the above argument
1093
+ # types, and is treated the same way. This block yields a virtual row object,
1094
+ # which is easy to use to create identifiers and functions. For more details
1095
+ # on the virtual row support, see the {"Virtual Rows" guide}[rdoc-ref:doc/virtual_rows.rdoc]
1096
+ #
1097
+ # If both a block and regular argument are provided, they get ANDed together.
1098
+ #
1099
+ # Examples:
1100
+ #
1101
+ # DB[:items].where(id: 3)
1102
+ # # SELECT * FROM items WHERE (id = 3)
1103
+ #
1104
+ # DB[:items].where(Sequel.lit('price < ?', 100))
1105
+ # # SELECT * FROM items WHERE price < 100
1106
+ #
1107
+ # DB[:items].where([[:id, [1,2,3]], [:id, 0..10]])
1108
+ # # SELECT * FROM items WHERE ((id IN (1, 2, 3)) AND ((id >= 0) AND (id <= 10)))
1109
+ #
1110
+ # DB[:items].where(Sequel.lit('price < 100'))
1111
+ # # SELECT * FROM items WHERE price < 100
1112
+ #
1113
+ # DB[:items].where(:active)
1114
+ # # SELECT * FROM items WHERE :active
1115
+ #
1116
+ # DB[:items].where{price < 100}
1117
+ # # SELECT * FROM items WHERE (price < 100)
1118
+ #
1119
+ # Multiple where calls can be chained for scoping:
1120
+ #
1121
+ # software = dataset.where(category: 'software').where{price < 100}
1122
+ # # SELECT * FROM items WHERE ((category = 'software') AND (price < 100))
1123
+ #
1124
+ # See the {"Dataset Filtering" guide}[rdoc-ref:doc/dataset_filtering.rdoc] for more examples and details.
1125
+ def where(*cond, &block)
1126
+ add_filter(:where, cond, &block)
1127
+ end
1128
+
1129
+ # Return a clone of the dataset with an addition named window that can be
1130
+ # referenced in window functions. See Sequel::SQL::Window for a list of
1131
+ # options that can be passed in. Example:
1132
+ #
1133
+ # DB[:items].window(:w, partition: :c1, order: :c2)
1134
+ # # SELECT * FROM items WINDOW w AS (PARTITION BY c1 ORDER BY c2)
1135
+ def window(name, opts)
1136
+ clone(:window=>((@opts[:window]||EMPTY_ARRAY) + [[name, SQL::Window.new(opts)].freeze]).freeze)
1137
+ end
1138
+
1139
+ # Add a common table expression (CTE) with the given name and a dataset that defines the CTE.
1140
+ # A common table expression acts as an inline view for the query.
1141
+ #
1142
+ # Options:
1143
+ # :args :: Specify the arguments/columns for the CTE, should be an array of symbols.
1144
+ # :recursive :: Specify that this is a recursive CTE
1145
+ # :materialized :: Set to false to force inlining of the CTE, or true to force not inlining
1146
+ # the CTE (PostgreSQL 12+/SQLite 3.35+).
1147
+ #
1148
+ # DB[:items].with(:items, DB[:syx].where(Sequel[:name].like('A%')))
1149
+ # # WITH items AS (SELECT * FROM syx WHERE (name LIKE 'A%' ESCAPE '\')) SELECT * FROM items
1150
+ def with(name, dataset, opts=OPTS)
1151
+ raise(Error, 'This dataset does not support common table expressions') unless supports_cte?
1152
+ if hoist_cte?(dataset)
1153
+ s, ds = hoist_cte(dataset)
1154
+ s.with(name, ds, opts)
1155
+ else
1156
+ clone(:with=>((@opts[:with]||EMPTY_ARRAY) + [Hash[opts].merge!(:name=>name, :dataset=>dataset)]).freeze)
1157
+ end
1158
+ end
1159
+
1160
+ # Add a recursive common table expression (CTE) with the given name, a dataset that
1161
+ # defines the nonrecursive part of the CTE, and a dataset that defines the recursive part
1162
+ # of the CTE.
1163
+ #
1164
+ # Options:
1165
+ # :args :: Specify the arguments/columns for the CTE, should be an array of symbols.
1166
+ # :union_all :: Set to false to use UNION instead of UNION ALL combining the nonrecursive and recursive parts.
1167
+ #
1168
+ # PostgreSQL 14+ Options:
1169
+ # :cycle :: Stop recursive searching when a cycle is detected. Includes two columns in the
1170
+ # result of the CTE, a cycle column indicating whether a cycle was detected for
1171
+ # the current row, and a path column for the path traversed to get to the current
1172
+ # row. If given, must be a hash with the following keys:
1173
+ # :columns :: (required) The column or array of columns to use to detect a cycle.
1174
+ # If the value of these columns match columns already traversed, then
1175
+ # a cycle is detected, and recursive searching will not traverse beyond
1176
+ # the cycle (the CTE will include the row where the cycle was detected).
1177
+ # :cycle_column :: The name of the cycle column in the output, defaults to :is_cycle.
1178
+ # :cycle_value :: The value of the cycle column in the output if the current row was
1179
+ # detected as a cycle, defaults to true.
1180
+ # :noncycle_value :: The value of the cycle column in the output if the current row
1181
+ # was not detected as a cycle, defaults to false. Only respected
1182
+ # if :cycle_value is given.
1183
+ # :path_column :: The name of the path column in the output, defaults to :path.
1184
+ # :search :: Include an order column in the result of the CTE that allows for breadth or
1185
+ # depth first searching. If given, must be a hash with the following keys:
1186
+ # :by :: (required) The column or array of columns to search by.
1187
+ # :order_column :: The name of the order column in the output, defaults to :ordercol.
1188
+ # :type :: Set to :breadth to use breadth-first searching (depth-first searching
1189
+ # is the default).
1190
+ #
1191
+ # DB[:t].with_recursive(:t,
1192
+ # DB[:i1].select(:id, :parent_id).where(parent_id: nil),
1193
+ # DB[:i1].join(:t, id: :parent_id).select(Sequel[:i1][:id], Sequel[:i1][:parent_id]),
1194
+ # args: [:id, :parent_id])
1195
+ #
1196
+ # # WITH RECURSIVE t(id, parent_id) AS (
1197
+ # # SELECT id, parent_id FROM i1 WHERE (parent_id IS NULL)
1198
+ # # UNION ALL
1199
+ # # SELECT i1.id, i1.parent_id FROM i1 INNER JOIN t ON (t.id = i1.parent_id)
1200
+ # # ) SELECT * FROM t
1201
+ #
1202
+ # DB[:t].with_recursive(:t,
1203
+ # DB[:i1].where(parent_id: nil),
1204
+ # DB[:i1].join(:t, id: :parent_id).select_all(:i1),
1205
+ # search: {by: :id, type: :breadth},
1206
+ # cycle: {columns: :id, cycle_value: 1, noncycle_value: 2})
1207
+ #
1208
+ # # WITH RECURSIVE t AS (
1209
+ # # SELECT * FROM i1 WHERE (parent_id IS NULL)
1210
+ # # UNION ALL
1211
+ # # (SELECT i1.* FROM i1 INNER JOIN t ON (t.id = i1.parent_id))
1212
+ # # )
1213
+ # # SEARCH BREADTH FIRST BY id SET ordercol
1214
+ # # CYCLE id SET is_cycle TO 1 DEFAULT 2 USING path
1215
+ # # SELECT * FROM t
1216
+ def with_recursive(name, nonrecursive, recursive, opts=OPTS)
1217
+ raise(Error, 'This dataset does not support common table expressions') unless supports_cte?
1218
+ if hoist_cte?(nonrecursive)
1219
+ s, ds = hoist_cte(nonrecursive)
1220
+ s.with_recursive(name, ds, recursive, opts)
1221
+ elsif hoist_cte?(recursive)
1222
+ s, ds = hoist_cte(recursive)
1223
+ s.with_recursive(name, nonrecursive, ds, opts)
1224
+ else
1225
+ clone(:with=>((@opts[:with]||EMPTY_ARRAY) + [Hash[opts].merge!(:recursive=>true, :name=>name, :dataset=>nonrecursive.union(recursive, {:all=>opts[:union_all] != false, :from_self=>false}))]).freeze)
1226
+ end
1227
+ end
1228
+
1229
+ if TRUE_FREEZE
1230
+ # Create a subclass of the receiver's class, and include the given modules
1231
+ # into it. If a block is provided, a DatasetModule is created using the block and
1232
+ # is included into the subclass. Create an instance of the subclass using the
1233
+ # same db and opts, so that the returned dataset operates similarly to a clone
1234
+ # extended with the given modules. This approach is used to avoid singleton
1235
+ # classes, which significantly improves performance.
1236
+ #
1237
+ # Note that like Object#extend, when multiple modules are provided
1238
+ # as arguments the subclass includes the modules in reverse order.
1239
+ def with_extend(*mods, &block)
1240
+ c = Sequel.set_temp_name(Class.new(self.class)){"Sequel::Dataset::_Subclass"}
1241
+ c.include(*mods) unless mods.empty?
1242
+ c.include(Sequel.set_temp_name(DatasetModule.new(&block)){"Sequel::Dataset::_DatasetModule(#{block.source_location[0,2].join(':')})"}) if block
1243
+ o = c.freeze.allocate
1244
+ o.instance_variable_set(:@db, @db)
1245
+ o.instance_variable_set(:@opts, @opts)
1246
+ o.instance_variable_set(:@cache, {})
1247
+ if cols = cache_get(:_columns)
1248
+ o.send(:columns=, cols)
1249
+ end
1250
+ o.freeze
1251
+ end
1252
+ else
1253
+ # :nocov:
1254
+ def with_extend(*mods, &block) # :nodoc:
1255
+ c = clone
1256
+ c.extend(*mods) unless mods.empty?
1257
+ c.extend(DatasetModule.new(&block)) if block
1258
+ c
1259
+ end
1260
+ # :nocov:
1261
+ end
1262
+
1263
+ # Returns a cloned dataset with the given row_proc.
1264
+ #
1265
+ # ds = DB[:items]
1266
+ # ds.all # => [{:id=>2}]
1267
+ # ds.with_row_proc(:invert.to_proc).all # => [{2=>:id}]
1268
+ def with_row_proc(callable)
1269
+ clone(:row_proc=>callable)
1270
+ end
1271
+
1272
+ # Returns a copy of the dataset with the static SQL used. This is useful if you want
1273
+ # to keep the same row_proc/graph, but change the SQL used to custom SQL.
1274
+ #
1275
+ # DB[:items].with_sql('SELECT * FROM foo') # SELECT * FROM foo
1276
+ #
1277
+ # You can use placeholders in your SQL and provide arguments for those placeholders:
1278
+ #
1279
+ # DB[:items].with_sql('SELECT ? FROM foo', 1) # SELECT 1 FROM foo
1280
+ #
1281
+ # You can also provide a method name and arguments to call to get the SQL:
1282
+ #
1283
+ # DB[:items].with_sql(:insert_sql, b: 1) # INSERT INTO items (b) VALUES (1)
1284
+ #
1285
+ # Note that datasets that specify custom SQL using this method will generally
1286
+ # ignore future dataset methods that modify the SQL used, as specifying custom SQL
1287
+ # overrides Sequel's SQL generator. You should probably limit yourself to the following
1288
+ # dataset methods when using this method, or use the implicit_subquery extension:
1289
+ #
1290
+ # * each
1291
+ # * all
1292
+ # * single_record (if only one record could be returned)
1293
+ # * single_value (if only one record could be returned, and a single column is selected)
1294
+ # * map
1295
+ # * as_hash
1296
+ # * to_hash
1297
+ # * to_hash_groups
1298
+ # * delete (if a DELETE statement)
1299
+ # * update (if an UPDATE statement, with no arguments)
1300
+ # * insert (if an INSERT statement, with no arguments)
1301
+ # * truncate (if a TRUNCATE statement, with no arguments)
1302
+ def with_sql(sql, *args)
1303
+ if sql.is_a?(Symbol)
1304
+ sql = public_send(sql, *args)
1305
+ else
1306
+ sql = SQL::PlaceholderLiteralString.new(sql, args) unless args.empty?
1307
+ end
1308
+ clone(:sql=>sql)
1309
+ end
1310
+
1311
+ protected
1312
+
1313
+ # Add the dataset to the list of compounds
1314
+ def compound_clone(type, dataset, opts)
1315
+ if dataset.is_a?(Dataset) && dataset.opts[:with] && !supports_cte_in_compounds?
1316
+ s, ds = hoist_cte(dataset)
1317
+ return s.compound_clone(type, ds, opts)
1318
+ end
1319
+ ds = compound_from_self.clone(:compounds=>(Array(@opts[:compounds]).map(&:dup) + [[type, dataset.compound_from_self, opts[:all]].freeze]).freeze)
1320
+ opts[:from_self] == false ? ds : ds.from_self(opts)
1321
+ end
1322
+
1323
+ # Return true if the dataset has a non-nil value for any key in opts.
1324
+ def options_overlap(opts)
1325
+ !(@opts.map{|k,v| k unless v.nil?}.compact & opts).empty?
1326
+ end
1327
+
1328
+ # From types allowed to be considered a simple_select_all
1329
+ SIMPLE_SELECT_ALL_ALLOWED_FROM = [Symbol, SQL::Identifier, SQL::QualifiedIdentifier].freeze
1330
+
1331
+ # Whether this dataset is a simple select from an underlying table, such as:
1332
+ #
1333
+ # SELECT * FROM table
1334
+ # SELECT table.* FROM table
1335
+ def simple_select_all?
1336
+ return false unless (f = @opts[:from]) && f.length == 1
1337
+ o = @opts.reject{|k,v| v.nil? || non_sql_option?(k)}
1338
+ from = f.first
1339
+ from = from.expression if from.is_a?(SQL::AliasedExpression)
1340
+
1341
+ if SIMPLE_SELECT_ALL_ALLOWED_FROM.any?{|x| from.is_a?(x)}
1342
+ case o.length
1343
+ when 1
1344
+ true
1345
+ when 2
1346
+ (s = o[:select]) && s.length == 1 && s.first.is_a?(SQL::ColumnAll)
1347
+ else
1348
+ false
1349
+ end
1350
+ else
1351
+ false
1352
+ end
1353
+ end
1354
+
1355
+ private
1356
+
1357
+ # :nocov:
1358
+ unless TRUE_FREEZE
1359
+ # Load the extensions into the receiver, without checking if the receiver is frozen.
1360
+ def _extension!(exts)
1361
+ exts.each do |ext|
1362
+ unless pr = Sequel.synchronize{EXTENSIONS[ext]}
1363
+ Sequel.extension(ext)
1364
+ pr = Sequel.synchronize{EXTENSIONS[ext]}
1365
+ end
1366
+
1367
+ if pr
1368
+ pr.call(self)
1369
+ else
1370
+ raise(Error, "Extension #{ext} does not have specific support handling individual datasets (try: Sequel.extension #{ext.inspect})")
1371
+ end
1372
+ end
1373
+ self
1374
+ end
1375
+ end
1376
+ # :nocov:
1377
+
1378
+ # A frozen array for the currently selected columns.
1379
+ def _current_select(allow_plain_wildcard)
1380
+ cur_sel = @opts[:select]
1381
+
1382
+ if !cur_sel || cur_sel.empty?
1383
+ cur_sel = if allow_plain_wildcard && supports_select_all_and_column?
1384
+ [WILDCARD].freeze
1385
+ else
1386
+ _current_select_column_all
1387
+ end
1388
+ elsif !allow_plain_wildcard && cur_sel.include?(WILDCARD)
1389
+ cur_sel = cur_sel.dup
1390
+ index = cur_sel.index(WILDCARD)
1391
+ cur_sel.delete(WILDCARD)
1392
+ _current_select_column_all.each_with_index do |ca, i|
1393
+ cur_sel.insert(index+i, ca)
1394
+ end
1395
+ cur_sel.freeze
1396
+ end
1397
+
1398
+ cur_sel
1399
+ end
1400
+
1401
+ # An array of SQL::ColumnAll objects for all FROM and JOIN tables. Used for select_append
1402
+ # and select_prepend.
1403
+ def _current_select_column_all
1404
+ tables = Array(@opts[:from]) + Array(@opts[:join])
1405
+ tables.map{|t| i, a = split_alias(t); a || i}.map!{|t| SQL::ColumnAll.new(t)}.freeze
1406
+ end
1407
+
1408
+ # If invert is true, invert the condition.
1409
+ def _invert_filter(cond, invert)
1410
+ if invert
1411
+ SQL::BooleanExpression.invert(cond)
1412
+ else
1413
+ cond
1414
+ end
1415
+ end
1416
+
1417
+ # Append to the current MERGE WHEN clauses.
1418
+ # Mutates the hash to add the conditions, if a virtual row block is passed.
1419
+ def _merge_when(hash, &block)
1420
+ hash[:conditions] = Sequel.virtual_row(&block) if block
1421
+
1422
+ if merge_when = @opts[:merge_when]
1423
+ clone(:merge_when => (merge_when.dup << hash.freeze).freeze)
1424
+ else
1425
+ clone(:merge_when => [hash.freeze].freeze)
1426
+ end
1427
+ end
1428
+
1429
+ # Add the given filter condition. Arguments:
1430
+ # clause :: Symbol or which SQL clause to effect, should be :where or :having
1431
+ # cond :: The filter condition to add
1432
+ # invert :: Whether the condition should be inverted (true or false)
1433
+ # combine :: How to combine the condition with an existing condition, should be :AND or :OR
1434
+ def add_filter(clause, cond, invert=false, combine=:AND, &block)
1435
+ if cond == EMPTY_ARRAY && !block
1436
+ raise Error, "must provide an argument to a filtering method if not passing a block"
1437
+ end
1438
+
1439
+ cond = cond.first if cond.size == 1
1440
+
1441
+ empty = cond == OPTS || cond == EMPTY_ARRAY
1442
+
1443
+ if empty && !block
1444
+ self
1445
+ else
1446
+ if cond == nil
1447
+ cond = Sequel::NULL
1448
+ end
1449
+ if empty && block
1450
+ cond = nil
1451
+ end
1452
+
1453
+ cond = _invert_filter(filter_expr(cond, &block), invert)
1454
+ cond = SQL::BooleanExpression.new(combine, @opts[clause], cond) if @opts[clause]
1455
+
1456
+ if cond.nil?
1457
+ cond = Sequel::NULL
1458
+ end
1459
+
1460
+ clone(clause => cond)
1461
+ end
1462
+ end
1463
+
1464
+ # Internals of for_update and adapter-specific lock methods.
1465
+ # Returns receiver if it already uses this lock style, and a cached
1466
+ # dataset using the given key otherwise. The key could be derived from
1467
+ # the style, but doing so would require allocation, so pass it in as
1468
+ # an argument.
1469
+ def cached_lock_style_dataset(key, style)
1470
+ opts[:lock] == style ? self : cached_dataset(key){lock_style(style)}
1471
+ end
1472
+
1473
+ # The default :qualify option to use for join tables if one is not specified.
1474
+ def default_join_table_qualification
1475
+ :symbol
1476
+ end
1477
+
1478
+ # SQL expression object based on the expr type. See +where+.
1479
+ def filter_expr(expr = nil, &block)
1480
+ expr = nil if expr == EMPTY_ARRAY
1481
+
1482
+ if block
1483
+ cond = filter_expr(Sequel.virtual_row(&block))
1484
+ cond = SQL::BooleanExpression.new(:AND, filter_expr(expr), cond) if expr
1485
+ return cond
1486
+ end
1487
+
1488
+ case expr
1489
+ when Hash
1490
+ SQL::BooleanExpression.from_value_pairs(expr)
1491
+ when Array
1492
+ if Sequel.condition_specifier?(expr)
1493
+ SQL::BooleanExpression.from_value_pairs(expr)
1494
+ else
1495
+ raise Error, "Invalid filter expression: #{expr.inspect}"
1496
+ end
1497
+ when LiteralString
1498
+ LiteralString.new("(#{expr})")
1499
+ when Numeric, SQL::NumericExpression, SQL::StringExpression, Proc, String, Set
1500
+ raise Error, "Invalid filter expression: #{expr.inspect}"
1501
+ when TrueClass, FalseClass
1502
+ if supports_where_true?
1503
+ SQL::BooleanExpression.new(:NOOP, expr)
1504
+ elsif expr
1505
+ SQL::Constants::SQLTRUE
1506
+ else
1507
+ SQL::Constants::SQLFALSE
1508
+ end
1509
+ when PlaceholderLiteralizer::Argument
1510
+ expr.transform{|v| filter_expr(v)}
1511
+ when SQL::PlaceholderLiteralString
1512
+ expr.with_parens
1513
+ else
1514
+ expr
1515
+ end
1516
+ end
1517
+
1518
+ # Return two datasets, the first a clone of the receiver with the WITH
1519
+ # clause from the given dataset added to it, and the second a clone of
1520
+ # the given dataset with the WITH clause removed.
1521
+ def hoist_cte(ds)
1522
+ [clone(:with => ((opts[:with] || EMPTY_ARRAY) + ds.opts[:with]).freeze), ds.clone(:with => nil)]
1523
+ end
1524
+
1525
+ # Whether CTEs need to be hoisted from the given ds into the current ds.
1526
+ def hoist_cte?(ds)
1527
+ ds.is_a?(Dataset) && ds.opts[:with] && !supports_cte_in_subqueries?
1528
+ end
1529
+
1530
+ # Inverts the given order by breaking it into a list of column references
1531
+ # and inverting them.
1532
+ #
1533
+ # DB[:items].invert_order([Sequel.desc(:id)]]) #=> [Sequel.asc(:id)]
1534
+ # DB[:items].invert_order([:category, Sequel.desc(:price)]) #=> [Sequel.desc(:category), Sequel.asc(:price)]
1535
+ def invert_order(order)
1536
+ return unless order
1537
+ order.map do |f|
1538
+ case f
1539
+ when SQL::OrderedExpression
1540
+ f.invert
1541
+ else
1542
+ SQL::OrderedExpression.new(f)
1543
+ end
1544
+ end
1545
+ end
1546
+
1547
+ # Return self if the dataset already has a server, or a cloned dataset with the
1548
+ # default server otherwise.
1549
+ def default_server
1550
+ server?(:default)
1551
+ end
1552
+
1553
+ # Whether the given option key does not affect the generated SQL.
1554
+ def non_sql_option?(key)
1555
+ NON_SQL_OPTIONS.include?(key)
1556
+ end
1557
+
1558
+ # Treat the +block+ as a virtual_row block if not +nil+ and
1559
+ # add the resulting columns to the +columns+ array (modifies +columns+).
1560
+ def virtual_row_columns(columns, block)
1561
+ if block
1562
+ v = Sequel.virtual_row(&block)
1563
+ if v.is_a?(Array)
1564
+ columns.concat(v)
1565
+ else
1566
+ columns << v
1567
+ end
1568
+ end
1569
+ end
1570
+ end
1571
+ end