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,1863 @@
1
+ # frozen-string-literal: true
2
+
3
+ module Sequel
4
+ class Dataset
5
+ # ---------------------
6
+ # :section: 3 - User Methods relating to SQL Creation
7
+ # These are methods you can call to see what SQL will be generated by the dataset.
8
+ # ---------------------
9
+
10
+ # Returns an EXISTS clause for the dataset as an SQL::PlaceholderLiteralString.
11
+ #
12
+ # DB.select(1).where(DB[:items].exists)
13
+ # # SELECT 1 WHERE (EXISTS (SELECT * FROM items))
14
+ def exists
15
+ SQL::PlaceholderLiteralString.new(EXISTS, [self], true)
16
+ end
17
+
18
+ # Returns an INSERT SQL query string. See +insert+.
19
+ #
20
+ # DB[:items].insert_sql(a: 1)
21
+ # # => "INSERT INTO items (a) VALUES (1)"
22
+ def insert_sql(*values)
23
+ return static_sql(@opts[:sql]) if @opts[:sql]
24
+
25
+ check_insert_allowed!
26
+
27
+ columns, values = _parse_insert_sql_args(values)
28
+ if values.is_a?(Array) && values.empty? && !insert_supports_empty_values?
29
+ columns, values = insert_empty_columns_values
30
+ elsif values.is_a?(Dataset) && hoist_cte?(values) && supports_cte?(:insert)
31
+ ds, values = hoist_cte(values)
32
+ return ds.clone(:columns=>columns, :values=>values).send(:_insert_sql)
33
+ end
34
+ clone(:columns=>columns, :values=>values).send(:_insert_sql)
35
+ end
36
+
37
+ # Append a literal representation of a value to the given SQL string.
38
+ #
39
+ # If an unsupported object is given, an +Error+ is raised.
40
+ def literal_append(sql, v)
41
+ case v
42
+ when Symbol
43
+ if skip_symbol_cache?
44
+ literal_symbol_append(sql, v)
45
+ else
46
+ unless l = db.literal_symbol(v)
47
+ l = String.new
48
+ literal_symbol_append(l, v)
49
+ db.literal_symbol_set(v, l)
50
+ end
51
+ sql << l
52
+ end
53
+ when String
54
+ case v
55
+ when LiteralString
56
+ sql << v
57
+ when SQL::Blob
58
+ literal_blob_append(sql, v)
59
+ else
60
+ literal_string_append(sql, v)
61
+ end
62
+ when Integer
63
+ sql << literal_integer(v)
64
+ when Hash
65
+ literal_hash_append(sql, v)
66
+ when SQL::Expression
67
+ literal_expression_append(sql, v)
68
+ when Float
69
+ sql << literal_float(v)
70
+ when BigDecimal
71
+ sql << literal_big_decimal(v)
72
+ when NilClass
73
+ sql << literal_nil
74
+ when TrueClass
75
+ sql << literal_true
76
+ when FalseClass
77
+ sql << literal_false
78
+ when Array
79
+ literal_array_append(sql, v)
80
+ when Time
81
+ v.is_a?(SQLTime) ? literal_sqltime_append(sql, v) : literal_time_append(sql, v)
82
+ when DateTime
83
+ literal_datetime_append(sql, v)
84
+ when Date
85
+ literal_date_append(sql, v)
86
+ when Dataset
87
+ literal_dataset_append(sql, v)
88
+ when Set
89
+ literal_set_append(sql, v)
90
+ else
91
+ literal_other_append(sql, v)
92
+ end
93
+ end
94
+
95
+ # The SQL to use for the MERGE statement.
96
+ def merge_sql
97
+ raise Error, "This database doesn't support MERGE" unless supports_merge?
98
+ if sql = opts[:sql]
99
+ return static_sql(sql)
100
+ end
101
+ if sql = cache_get(:_merge_sql)
102
+ return sql
103
+ end
104
+ source, join_condition = @opts[:merge_using]
105
+ raise Error, "No USING clause for MERGE" unless source
106
+ sql = @opts[:append_sql] || sql_string_origin
107
+
108
+ select_with_sql(sql)
109
+ sql << "MERGE INTO "
110
+ source_list_append(sql, @opts[:from])
111
+ sql << " USING "
112
+ identifier_append(sql, source)
113
+ sql << " ON "
114
+ literal_append(sql, join_condition)
115
+ _merge_when_sql(sql)
116
+ cache_set(:_merge_sql, sql) if cache_sql?
117
+ sql
118
+ end
119
+
120
+ # Literalize a date or time value, as a SQL string value with no
121
+ # typecasting. If +raw+ is true, remove the surrounding single
122
+ # quotes. This is designed for usage by bound argument code that
123
+ # can work even if the auto_cast_date_and_time extension is
124
+ # used (either manually or implicitly in the related adapter).
125
+ def literal_date_or_time(dt, raw=false)
126
+ value = case dt
127
+ when SQLTime
128
+ literal_sqltime(dt)
129
+ when Time
130
+ literal_time(dt)
131
+ when DateTime
132
+ literal_datetime(dt)
133
+ when Date
134
+ literal_date(dt)
135
+ else
136
+ raise TypeError, "unsupported type: #{dt.inspect}"
137
+ end
138
+
139
+ if raw
140
+ value.sub!(/\A'/, '')
141
+ value.sub!(/'\z/, '')
142
+ end
143
+
144
+ value
145
+ end
146
+
147
+ # Returns an array of insert statements for inserting multiple records.
148
+ # This method is used by +multi_insert+ to format insert statements and
149
+ # expects a keys array and and an array of value arrays.
150
+ def multi_insert_sql(columns, values)
151
+ case multi_insert_sql_strategy
152
+ when :values
153
+ sql = LiteralString.new('VALUES ')
154
+ expression_list_append(sql, values.map{|r| Array(r)})
155
+ [insert_sql(columns, sql)]
156
+ when :union
157
+ c = false
158
+ sql = LiteralString.new
159
+ u = ' UNION ALL SELECT '
160
+ f = empty_from_sql
161
+ values.each do |v|
162
+ if c
163
+ sql << u
164
+ else
165
+ sql << 'SELECT '
166
+ c = true
167
+ end
168
+ expression_list_append(sql, v)
169
+ sql << f if f
170
+ end
171
+ [insert_sql(columns, sql)]
172
+ else
173
+ values.map{|r| insert_sql(columns, r)}
174
+ end
175
+ end
176
+
177
+ # Same as +select_sql+, not aliased directly to make subclassing simpler.
178
+ def sql
179
+ select_sql
180
+ end
181
+
182
+ # Returns a TRUNCATE SQL query string. See +truncate+
183
+ #
184
+ # DB[:items].truncate_sql # => 'TRUNCATE items'
185
+ def truncate_sql
186
+ if opts[:sql]
187
+ static_sql(opts[:sql])
188
+ else
189
+ check_truncation_allowed!
190
+ check_not_limited!(:truncate)
191
+ raise(InvalidOperation, "Can't truncate filtered datasets") if opts[:where] || opts[:having]
192
+ t = String.new
193
+ source_list_append(t, opts[:from])
194
+ _truncate_sql(t)
195
+ end
196
+ end
197
+
198
+ # Formats an UPDATE statement using the given values. See +update+.
199
+ #
200
+ # DB[:items].update_sql(price: 100, category: 'software')
201
+ # # => "UPDATE items SET price = 100, category = 'software'
202
+ #
203
+ # Raises an +Error+ if the dataset is grouped or includes more
204
+ # than one table.
205
+ def update_sql(values = OPTS)
206
+ return static_sql(opts[:sql]) if opts[:sql]
207
+ check_update_allowed!
208
+ check_not_limited!(:update)
209
+
210
+ case values
211
+ when LiteralString
212
+ # nothing
213
+ when String
214
+ raise Error, "plain string passed to Dataset#update is not supported, use Sequel.lit to use a literal string"
215
+ end
216
+
217
+ clone(:values=>values).send(:_update_sql)
218
+ end
219
+
220
+ # ---------------------
221
+ # :section: 9 - Internal Methods relating to SQL Creation
222
+ # These methods, while public, are not designed to be used directly by the end user.
223
+ # ---------------------
224
+
225
+ # Given a type (e.g. select) and an array of clauses,
226
+ # return an array of methods to call to build the SQL string.
227
+ def self.clause_methods(type, clauses)
228
+ clauses.map{|clause| :"#{type}_#{clause}_sql"}.freeze
229
+ end
230
+
231
+ # Define a dataset literalization method for the given type in the given module,
232
+ # using the given clauses.
233
+ #
234
+ # Arguments:
235
+ # mod :: Module in which to define method
236
+ # type :: Type of SQL literalization method to create, either :select, :insert, :update, or :delete
237
+ # clauses :: array of clauses that make up the SQL query for the type. This can either be a single
238
+ # array of symbols/strings, or it can be an array of pairs, with the first element in
239
+ # each pair being an if/elsif/else code fragment, and the second element in each pair
240
+ # being an array of symbol/strings for the appropriate branch.
241
+ def self.def_sql_method(mod, type, clauses)
242
+ priv = type == :update || type == :insert
243
+ cacheable = type == :select || type == :delete
244
+
245
+ lines = []
246
+ lines << 'private' if priv
247
+ lines << "def #{'_' if priv}#{type}_sql"
248
+ lines << 'if sql = opts[:sql]; return static_sql(sql) end' unless priv
249
+ lines << "if sql = cache_get(:_#{type}_sql); return sql end" if cacheable
250
+ lines << 'check_delete_allowed!' << 'check_not_limited!(:delete)' if type == :delete
251
+ lines << 'sql = @opts[:append_sql] || sql_string_origin'
252
+
253
+ if clauses.all?{|c| c.is_a?(Array)}
254
+ clauses.each do |i, cs|
255
+ lines << i
256
+ lines.concat(clause_methods(type, cs).map{|x| "#{x}(sql)"})
257
+ end
258
+ lines << 'end'
259
+ else
260
+ lines.concat(clause_methods(type, clauses).map{|x| "#{x}(sql)"})
261
+ end
262
+
263
+ lines << "cache_set(:_#{type}_sql, sql) if cache_sql?" if cacheable
264
+ lines << 'sql'
265
+ lines << 'end'
266
+
267
+ mod.class_eval lines.join("\n"), __FILE__, __LINE__
268
+ end
269
+
270
+ def_sql_method(self, :delete, %w'delete from where')
271
+ def_sql_method(self, :insert, %w'insert into columns values')
272
+ def_sql_method(self, :select, %w'with select distinct columns from join where group having compounds order limit lock')
273
+ def_sql_method(self, :update, %w'update table set where')
274
+
275
+ WILDCARD = LiteralString.new('*').freeze
276
+ COUNT_OF_ALL_AS_COUNT = SQL::Function.new(:count, WILDCARD).as(:count)
277
+ DEFAULT = LiteralString.new('DEFAULT').freeze
278
+
279
+ EXISTS = ['EXISTS '.freeze].freeze
280
+ BITWISE_METHOD_MAP = {:& =>:BITAND, :| => :BITOR, :^ => :BITXOR}.freeze
281
+ COUNT_FROM_SELF_OPTS = [:distinct, :group, :sql, :limit, :offset, :compounds].freeze
282
+ IS_LITERALS = {nil=>'NULL'.freeze, true=>'TRUE'.freeze, false=>'FALSE'.freeze}.freeze
283
+ QUALIFY_KEYS = [:select, :where, :having, :order, :group].freeze
284
+
285
+ IS_OPERATORS = ::Sequel::SQL::ComplexExpression::IS_OPERATORS
286
+ LIKE_OPERATORS = ::Sequel::SQL::ComplexExpression::LIKE_OPERATORS
287
+ N_ARITY_OPERATORS = ::Sequel::SQL::ComplexExpression::N_ARITY_OPERATORS
288
+ TWO_ARITY_OPERATORS = ::Sequel::SQL::ComplexExpression::TWO_ARITY_OPERATORS
289
+ REGEXP_OPERATORS = ::Sequel::SQL::ComplexExpression::REGEXP_OPERATORS
290
+
291
+ [:literal, :quote_identifier, :quote_schema_table].each do |meth|
292
+ class_eval(<<-END, __FILE__, __LINE__ + 1)
293
+ def #{meth}(*args, &block)
294
+ s = ''.dup
295
+ #{meth}_append(s, *args, &block)
296
+ s
297
+ end
298
+ END
299
+ end
300
+
301
+ # Append literalization of aliased expression to SQL string.
302
+ def aliased_expression_sql_append(sql, ae)
303
+ literal_append(sql, ae.expression)
304
+ as_sql_append(sql, ae.alias, ae.columns)
305
+ end
306
+
307
+ # Append literalization of array to SQL string.
308
+ def array_sql_append(sql, a)
309
+ if a.empty?
310
+ sql << '(NULL)'
311
+ else
312
+ sql << '('
313
+ expression_list_append(sql, a)
314
+ sql << ')'
315
+ end
316
+ end
317
+
318
+ # Append literalization of boolean constant to SQL string.
319
+ def boolean_constant_sql_append(sql, constant)
320
+ if (constant == true || constant == false) && !supports_where_true?
321
+ sql << (constant == true ? '(1 = 1)' : '(1 = 0)')
322
+ else
323
+ literal_append(sql, constant)
324
+ end
325
+ end
326
+
327
+ # Append literalization of case expression to SQL string.
328
+ def case_expression_sql_append(sql, ce)
329
+ sql << '(CASE'
330
+ if ce.expression?
331
+ sql << ' '
332
+ literal_append(sql, ce.expression)
333
+ end
334
+ w = " WHEN "
335
+ t = " THEN "
336
+ ce.conditions.each do |c,r|
337
+ sql << w
338
+ literal_append(sql, c)
339
+ sql << t
340
+ literal_append(sql, r)
341
+ end
342
+ sql << " ELSE "
343
+ literal_append(sql, ce.default)
344
+ sql << " END)"
345
+ end
346
+
347
+ # Append literalization of cast expression to SQL string.
348
+ def cast_sql_append(sql, expr, type)
349
+ sql << 'CAST('
350
+ literal_append(sql, expr)
351
+ sql << ' AS ' << db.cast_type_literal(type).to_s
352
+ sql << ')'
353
+ end
354
+
355
+ # Append literalization of column all selection to SQL string.
356
+ def column_all_sql_append(sql, ca)
357
+ qualified_identifier_sql_append(sql, ca.table, WILDCARD)
358
+ end
359
+
360
+ # Append literalization of complex expression to SQL string.
361
+ def complex_expression_sql_append(sql, op, args)
362
+ case op
363
+ when *IS_OPERATORS
364
+ r = args[1]
365
+ if r.nil? || supports_is_true?
366
+ raise(InvalidOperation, 'Invalid argument used for IS operator') unless val = IS_LITERALS[r]
367
+ sql << '('
368
+ literal_append(sql, args[0])
369
+ sql << ' ' << op.to_s << ' '
370
+ sql << val << ')'
371
+ elsif op == :IS
372
+ complex_expression_sql_append(sql, :"=", args)
373
+ else
374
+ complex_expression_sql_append(sql, :OR, [SQL::BooleanExpression.new(:"!=", *args), SQL::BooleanExpression.new(:IS, args[0], nil)])
375
+ end
376
+ when :IN, :"NOT IN"
377
+ cols = args[0]
378
+ vals = args[1]
379
+ col_array = true if cols.is_a?(Array)
380
+ if vals.is_a?(Array) || vals.is_a?(Set)
381
+ val_array = true
382
+ empty_val_array = vals.empty?
383
+ end
384
+ if empty_val_array
385
+ literal_append(sql, empty_array_value(op, cols))
386
+ elsif col_array
387
+ if !supports_multiple_column_in?
388
+ if val_array
389
+ expr = SQL::BooleanExpression.new(:OR, *vals.to_a.map{|vs| SQL::BooleanExpression.from_value_pairs(cols.to_a.zip(vs).map{|c, v| [c, v]})})
390
+ literal_append(sql, op == :IN ? expr : ~expr)
391
+ else
392
+ old_vals = vals
393
+ vals = vals.naked if vals.is_a?(Sequel::Dataset)
394
+ vals = vals.to_a
395
+ val_cols = old_vals.columns
396
+ complex_expression_sql_append(sql, op, [cols, vals.map!{|x| x.values_at(*val_cols)}])
397
+ end
398
+ else
399
+ # If the columns and values are both arrays, use array_sql instead of
400
+ # literal so that if values is an array of two element arrays, it
401
+ # will be treated as a value list instead of a condition specifier.
402
+ sql << '('
403
+ literal_append(sql, cols)
404
+ sql << ' ' << op.to_s << ' '
405
+ if val_array
406
+ array_sql_append(sql, vals)
407
+ else
408
+ literal_append(sql, vals)
409
+ end
410
+ sql << ')'
411
+ end
412
+ else
413
+ sql << '('
414
+ literal_append(sql, cols)
415
+ sql << ' ' << op.to_s << ' '
416
+ literal_append(sql, vals)
417
+ sql << ')'
418
+ end
419
+ when :LIKE, :'NOT LIKE'
420
+ sql << '('
421
+ literal_append(sql, args[0])
422
+ sql << ' ' << op.to_s << ' '
423
+ literal_append(sql, args[1])
424
+ if requires_like_escape?
425
+ sql << " ESCAPE "
426
+ literal_append(sql, "\\")
427
+ end
428
+ sql << ')'
429
+ when :ILIKE, :'NOT ILIKE'
430
+ complex_expression_sql_append(sql, (op == :ILIKE ? :LIKE : :"NOT LIKE"), args.map{|v| Sequel.function(:UPPER, v)})
431
+ when :**
432
+ function_sql_append(sql, Sequel.function(:power, *args))
433
+ when *TWO_ARITY_OPERATORS
434
+ if REGEXP_OPERATORS.include?(op) && !supports_regexp?
435
+ raise InvalidOperation, "Pattern matching via regular expressions is not supported on #{db.database_type}"
436
+ end
437
+ sql << '('
438
+ literal_append(sql, args[0])
439
+ sql << ' ' << op.to_s << ' '
440
+ literal_append(sql, args[1])
441
+ sql << ')'
442
+ when *N_ARITY_OPERATORS
443
+ sql << '('
444
+ c = false
445
+ op_str = " #{op} "
446
+ args.each do |a|
447
+ sql << op_str if c
448
+ literal_append(sql, a)
449
+ c ||= true
450
+ end
451
+ sql << ')'
452
+ when :NOT
453
+ sql << 'NOT '
454
+ literal_append(sql, args[0])
455
+ when :NOOP
456
+ literal_append(sql, args[0])
457
+ when :'B~'
458
+ sql << '~'
459
+ literal_append(sql, args[0])
460
+ when :extract
461
+ sql << 'extract(' << args[0].to_s << ' FROM '
462
+ literal_append(sql, args[1])
463
+ sql << ')'
464
+ else
465
+ raise(InvalidOperation, "invalid operator #{op}")
466
+ end
467
+ end
468
+
469
+ # Append literalization of constant to SQL string.
470
+ def constant_sql_append(sql, constant)
471
+ sql << constant.to_s
472
+ end
473
+
474
+ # Append literalization of delayed evaluation to SQL string,
475
+ # causing the delayed evaluation proc to be evaluated.
476
+ def delayed_evaluation_sql_append(sql, delay)
477
+ # Delayed evaluations are used specifically so the SQL
478
+ # can differ in subsequent calls, so we definitely don't
479
+ # want to cache the sql in this case.
480
+ disable_sql_caching!
481
+
482
+ if recorder = @opts[:placeholder_literalizer]
483
+ recorder.use(sql, lambda{delay.call(self)}, nil)
484
+ else
485
+ literal_append(sql, delay.call(self))
486
+ end
487
+ end
488
+
489
+ # Append literalization of function call to SQL string.
490
+ def function_sql_append(sql, f)
491
+ name = f.name
492
+ opts = f.opts
493
+
494
+ if opts[:emulate]
495
+ if emulate_function?(name)
496
+ emulate_function_sql_append(sql, f)
497
+ return
498
+ end
499
+
500
+ name = native_function_name(name)
501
+ end
502
+
503
+ sql << 'LATERAL ' if opts[:lateral]
504
+
505
+ case name
506
+ when SQL::Identifier
507
+ if supports_quoted_function_names? && opts[:quoted]
508
+ literal_append(sql, name)
509
+ else
510
+ sql << name.value.to_s
511
+ end
512
+ when SQL::QualifiedIdentifier
513
+ if supports_quoted_function_names? && opts[:quoted] != false
514
+ literal_append(sql, name)
515
+ else
516
+ sql << split_qualifiers(name).join('.')
517
+ end
518
+ else
519
+ if supports_quoted_function_names? && opts[:quoted]
520
+ quote_identifier_append(sql, name)
521
+ else
522
+ sql << name.to_s
523
+ end
524
+ end
525
+
526
+ sql << '('
527
+ if filter = opts[:filter]
528
+ filter = filter_expr(filter, &opts[:filter_block])
529
+ end
530
+ if opts[:*]
531
+ if filter && !supports_filtered_aggregates?
532
+ literal_append(sql, Sequel.case({filter=>1}, nil))
533
+ filter = nil
534
+ else
535
+ sql << '*'
536
+ end
537
+ else
538
+ sql << "DISTINCT " if opts[:distinct]
539
+ if filter && !supports_filtered_aggregates?
540
+ expression_list_append(sql, f.args.map{|arg| Sequel.case({filter=>arg}, nil)})
541
+ filter = nil
542
+ else
543
+ expression_list_append(sql, f.args)
544
+ end
545
+ if order = opts[:order]
546
+ sql << " ORDER BY "
547
+ expression_list_append(sql, order)
548
+ end
549
+ end
550
+ sql << ')'
551
+
552
+ if group = opts[:within_group]
553
+ sql << " WITHIN GROUP (ORDER BY "
554
+ expression_list_append(sql, group)
555
+ sql << ')'
556
+ end
557
+
558
+ if filter
559
+ sql << " FILTER (WHERE "
560
+ literal_append(sql, filter)
561
+ sql << ')'
562
+ end
563
+
564
+ if window = opts[:over]
565
+ sql << ' OVER '
566
+ window_sql_append(sql, window.opts)
567
+ end
568
+
569
+ if opts[:with_ordinality]
570
+ sql << " WITH ORDINALITY"
571
+ end
572
+ end
573
+
574
+ # Append literalization of JOIN clause without ON or USING to SQL string.
575
+ def join_clause_sql_append(sql, jc)
576
+ table = jc.table
577
+ table_alias = jc.table_alias
578
+ table_alias = nil if table == table_alias && !jc.column_aliases
579
+ sql << ' ' << join_type_sql(jc.join_type) << ' '
580
+ identifier_append(sql, table)
581
+ as_sql_append(sql, table_alias, jc.column_aliases) if table_alias
582
+ end
583
+
584
+ # Append literalization of JOIN ON clause to SQL string.
585
+ def join_on_clause_sql_append(sql, jc)
586
+ join_clause_sql_append(sql, jc)
587
+ sql << ' ON '
588
+ literal_append(sql, filter_expr(jc.on))
589
+ end
590
+
591
+ # Append literalization of JOIN USING clause to SQL string.
592
+ def join_using_clause_sql_append(sql, jc)
593
+ join_clause_sql_append(sql, jc)
594
+ join_using_clause_using_sql_append(sql, jc.using)
595
+ end
596
+
597
+ # Append literalization of negative boolean constant to SQL string.
598
+ def negative_boolean_constant_sql_append(sql, constant)
599
+ sql << 'NOT '
600
+ boolean_constant_sql_append(sql, constant)
601
+ end
602
+
603
+ # Append literalization of ordered expression to SQL string.
604
+ def ordered_expression_sql_append(sql, oe)
605
+ if emulate = requires_emulating_nulls_first?
606
+ case oe.nulls
607
+ when :first
608
+ null_order = 0
609
+ when :last
610
+ null_order = 2
611
+ end
612
+
613
+ if null_order
614
+ literal_append(sql, Sequel.case({{oe.expression=>nil}=>null_order}, 1))
615
+ sql << ", "
616
+ end
617
+ end
618
+
619
+ literal_append(sql, oe.expression)
620
+ sql << (oe.descending ? ' DESC' : ' ASC')
621
+
622
+ unless emulate
623
+ case oe.nulls
624
+ when :first
625
+ sql << " NULLS FIRST"
626
+ when :last
627
+ sql << " NULLS LAST"
628
+ end
629
+ end
630
+ end
631
+
632
+ # Append literalization of placeholder literal string to SQL string.
633
+ def placeholder_literal_string_sql_append(sql, pls)
634
+ args = pls.args
635
+ str = pls.str
636
+ sql << '(' if pls.parens
637
+ if args.is_a?(Hash)
638
+ if args.empty?
639
+ sql << str
640
+ else
641
+ re = /:(#{Regexp.union(args.keys.map(&:to_s))})\b/
642
+ until str.empty?
643
+ previous, q, str = str.partition(re)
644
+ sql << previous
645
+ literal_append(sql, args[$1.to_sym]) unless q.empty?
646
+ end
647
+ end
648
+ elsif str.is_a?(Array)
649
+ len = args.length
650
+ str.each_with_index do |s, i|
651
+ sql << s
652
+ literal_append(sql, args[i]) unless i == len
653
+ end
654
+ unless str.length == args.length || str.length == args.length + 1
655
+ raise Error, "Mismatched number of placeholders (#{str.length}) and placeholder arguments (#{args.length}) when using placeholder array"
656
+ end
657
+ else
658
+ i = -1
659
+ match_len = args.length - 1
660
+ while true
661
+ previous, q, str = str.partition('?')
662
+ sql << previous
663
+ literal_append(sql, args.at(i+=1)) unless q.empty?
664
+ if str.empty?
665
+ unless i == match_len
666
+ raise Error, "Mismatched number of placeholders (#{i+1}) and placeholder arguments (#{args.length}) when using placeholder string"
667
+ end
668
+ break
669
+ end
670
+ end
671
+ end
672
+ sql << ')' if pls.parens
673
+ end
674
+
675
+ # Append literalization of qualified identifier to SQL string.
676
+ # If 3 arguments are given, the 2nd should be the table/qualifier and the third should be
677
+ # column/qualified. If 2 arguments are given, the 2nd should be an SQL::QualifiedIdentifier.
678
+ def qualified_identifier_sql_append(sql, table, column=(c = table.column; table = table.table; c))
679
+ identifier_append(sql, table)
680
+ sql << '.'
681
+ identifier_append(sql, column)
682
+ end
683
+
684
+ # Append literalization of unqualified identifier to SQL string.
685
+ # Adds quoting to identifiers (columns and tables). If identifiers are not
686
+ # being quoted, returns name as a string. If identifiers are being quoted
687
+ # quote the name with quoted_identifier.
688
+ def quote_identifier_append(sql, name)
689
+ name = name.value if name.is_a?(SQL::Identifier)
690
+ if name.is_a?(LiteralString)
691
+ sql << name
692
+ else
693
+ name = input_identifier(name)
694
+ if quote_identifiers?
695
+ quoted_identifier_append(sql, name)
696
+ else
697
+ sql << name
698
+ end
699
+ end
700
+ end
701
+
702
+ # Append literalization of identifier or unqualified identifier to SQL string.
703
+ def quote_schema_table_append(sql, table)
704
+ qualifiers = split_qualifiers(table)
705
+ table = qualifiers.pop
706
+
707
+ qualifiers.each do |q|
708
+ quote_identifier_append(sql, q)
709
+ sql << '.'
710
+ end
711
+
712
+ quote_identifier_append(sql, table)
713
+ end
714
+
715
+ # Append literalization of quoted identifier to SQL string.
716
+ # This method quotes the given name with the SQL standard double quote.
717
+ # should be overridden by subclasses to provide quoting not matching the
718
+ # SQL standard, such as backtick (used by MySQL and SQLite).
719
+ def quoted_identifier_append(sql, name)
720
+ sql << '"' << name.to_s.gsub('"', '""') << '"'
721
+ end
722
+
723
+ # Split the schema information from the table, returning two strings,
724
+ # one for the schema and one for the table. The returned schema may
725
+ # be nil, but the table will always have a string value.
726
+ #
727
+ # Note that this function does not handle tables with more than one
728
+ # level of qualification (e.g. database.schema.table on Microsoft
729
+ # SQL Server).
730
+ def schema_and_table(table_name, sch=nil)
731
+ sch = sch.to_s if sch
732
+ case table_name
733
+ when Symbol
734
+ s, t, _ = split_symbol(table_name)
735
+ [s||sch, t]
736
+ when SQL::QualifiedIdentifier
737
+ [table_name.table.to_s, table_name.column.to_s]
738
+ when SQL::Identifier
739
+ [sch, table_name.value.to_s]
740
+ when String
741
+ [sch, table_name]
742
+ else
743
+ raise Error, 'table_name should be a Symbol, SQL::QualifiedIdentifier, SQL::Identifier, or String'
744
+ end
745
+ end
746
+
747
+ # Splits table_name into an array of strings.
748
+ #
749
+ # ds.split_qualifiers(:s) # ['s']
750
+ # ds.split_qualifiers(Sequel[:t][:s]) # ['t', 's']
751
+ # ds.split_qualifiers(Sequel[:d][:t][:s]) # ['d', 't', 's']
752
+ # ds.split_qualifiers(Sequel.qualify(Sequel[:h][:d], Sequel[:t][:s])) # ['h', 'd', 't', 's']
753
+ def split_qualifiers(table_name, *args)
754
+ case table_name
755
+ when SQL::QualifiedIdentifier
756
+ split_qualifiers(table_name.table, nil) + split_qualifiers(table_name.column, nil)
757
+ else
758
+ sch, table = schema_and_table(table_name, *args)
759
+ sch ? [sch, table] : [table]
760
+ end
761
+ end
762
+
763
+ # Append literalization of subscripts (SQL array accesses) to SQL string.
764
+ def subscript_sql_append(sql, s)
765
+ case s.expression
766
+ when Symbol, SQL::Subscript, SQL::Identifier, SQL::QualifiedIdentifier
767
+ # nothing
768
+ else
769
+ wrap_expression = true
770
+ sql << '('
771
+ end
772
+ literal_append(sql, s.expression)
773
+ if wrap_expression
774
+ sql << ')['
775
+ else
776
+ sql << '['
777
+ end
778
+ sub = s.sub
779
+ if sub.length == 1 && (range = sub.first).is_a?(Range)
780
+ literal_append(sql, range.begin)
781
+ sql << ':'
782
+ e = range.end
783
+ e -= 1 if range.exclude_end? && e.is_a?(Integer)
784
+ literal_append(sql, e)
785
+ else
786
+ expression_list_append(sql, s.sub)
787
+ end
788
+ sql << ']'
789
+ end
790
+
791
+ # Append literalization of windows (for window functions) to SQL string.
792
+ def window_sql_append(sql, opts)
793
+ raise(Error, 'This dataset does not support window functions') unless supports_window_functions?
794
+ space = false
795
+ space_s = ' '
796
+
797
+ sql << '('
798
+
799
+ if window = opts[:window]
800
+ literal_append(sql, window)
801
+ space = true
802
+ end
803
+
804
+ if part = opts[:partition]
805
+ sql << space_s if space
806
+ sql << "PARTITION BY "
807
+ expression_list_append(sql, Array(part))
808
+ space = true
809
+ end
810
+
811
+ if order = opts[:order]
812
+ sql << space_s if space
813
+ sql << "ORDER BY "
814
+ expression_list_append(sql, Array(order))
815
+ space = true
816
+ end
817
+
818
+ if frame = opts[:frame]
819
+ sql << space_s if space
820
+
821
+ if frame.is_a?(String)
822
+ sql << frame
823
+ else
824
+ case frame
825
+ when :all
826
+ frame_type = :rows
827
+ frame_start = :preceding
828
+ frame_end = :following
829
+ when :rows, :range, :groups
830
+ frame_type = frame
831
+ frame_start = :preceding
832
+ frame_end = :current
833
+ when Hash
834
+ frame_type = frame[:type]
835
+ unless frame_type == :rows || frame_type == :range || frame_type == :groups
836
+ raise Error, "invalid window :frame :type option: #{frame_type.inspect}"
837
+ end
838
+ unless frame_start = frame[:start]
839
+ raise Error, "invalid window :frame :start option: #{frame_start.inspect}"
840
+ end
841
+ frame_end = frame[:end]
842
+ frame_exclude = frame[:exclude]
843
+ else
844
+ raise Error, "invalid window :frame option: #{frame.inspect}"
845
+ end
846
+
847
+ sql << frame_type.to_s.upcase << " "
848
+ sql << 'BETWEEN ' if frame_end
849
+ window_frame_boundary_sql_append(sql, frame_start, :preceding)
850
+ if frame_end
851
+ sql << " AND "
852
+ window_frame_boundary_sql_append(sql, frame_end, :following)
853
+ end
854
+
855
+ if frame_exclude
856
+ sql << " EXCLUDE "
857
+
858
+ case frame_exclude
859
+ when :current
860
+ sql << "CURRENT ROW"
861
+ when :group
862
+ sql << "GROUP"
863
+ when :ties
864
+ sql << "TIES"
865
+ when :no_others
866
+ sql << "NO OTHERS"
867
+ else
868
+ raise Error, "invalid window :frame :exclude option: #{frame_exclude.inspect}"
869
+ end
870
+ end
871
+ end
872
+ end
873
+
874
+ sql << ')'
875
+ end
876
+
877
+ protected
878
+
879
+ # Return a from_self dataset if an order or limit is specified, so it works as expected
880
+ # with UNION, EXCEPT, and INTERSECT clauses.
881
+ def compound_from_self
882
+ (@opts[:sql] || @opts[:limit] || @opts[:order] || @opts[:offset]) ? from_self : self
883
+ end
884
+
885
+ private
886
+
887
+ # Append the INSERT sql used in a MERGE
888
+ def _merge_insert_sql(sql, data)
889
+ sql << " THEN INSERT"
890
+ columns, values = _parse_insert_sql_args(data[:values])
891
+ _insert_columns_sql(sql, columns)
892
+ _insert_values_sql(sql, values)
893
+ end
894
+
895
+ def _merge_update_sql(sql, data)
896
+ sql << " THEN UPDATE SET "
897
+ update_sql_values_hash(sql, data[:values])
898
+ end
899
+
900
+ def _merge_delete_sql(sql, data)
901
+ sql << " THEN DELETE"
902
+ end
903
+
904
+ # Mapping of merge types to related SQL
905
+ MERGE_TYPE_SQL = {
906
+ :insert => ' WHEN NOT MATCHED',
907
+ :delete => ' WHEN MATCHED',
908
+ :delete_not_matched_by_source => ' WHEN NOT MATCHED BY SOURCE',
909
+ :update => ' WHEN MATCHED',
910
+ :update_not_matched_by_source => ' WHEN NOT MATCHED BY SOURCE',
911
+ :matched => ' WHEN MATCHED',
912
+ :not_matched => ' WHEN NOT MATCHED',
913
+ :not_matched_by_source => ' WHEN NOT MATCHED BY SOURCE',
914
+ }.freeze
915
+ private_constant :MERGE_TYPE_SQL
916
+
917
+ MERGE_NORMALIZE_TYPE_MAP = {
918
+ :delete_not_matched_by_source => :delete,
919
+ :update_not_matched_by_source => :update,
920
+ :matched => :do_nothing,
921
+ :not_matched => :do_nothing,
922
+ :not_matched_by_source => :do_nothing,
923
+ }.freeze
924
+ private_constant :MERGE_NORMALIZE_TYPE_MAP
925
+
926
+ # Add the WHEN clauses to the MERGE SQL
927
+ def _merge_when_sql(sql)
928
+ raise Error, "no WHEN [NOT] MATCHED clauses provided for MERGE" unless merge_when = @opts[:merge_when]
929
+ merge_when.each do |data|
930
+ type = data[:type]
931
+ sql << MERGE_TYPE_SQL[type]
932
+ type = MERGE_NORMALIZE_TYPE_MAP[type] || type
933
+ _merge_when_conditions_sql(sql, data)
934
+ send(:"_merge_#{type}_sql", sql, data)
935
+ end
936
+ end
937
+
938
+ # Append MERGE WHEN conditions, if there are conditions provided.
939
+ def _merge_when_conditions_sql(sql, data)
940
+ if data.has_key?(:conditions)
941
+ sql << " AND "
942
+ literal_append(sql, data[:conditions])
943
+ end
944
+ end
945
+
946
+ # Parse the values passed to insert_sql, returning columns and values
947
+ # to use for the INSERT. Returned columns is always an array, but can be empty
948
+ # for an INSERT without explicit column references. Returned values can be an
949
+ # array, dataset, or literal string.
950
+ def _parse_insert_sql_args(values)
951
+ columns = []
952
+
953
+ case values.size
954
+ when 0
955
+ values = []
956
+ when 1
957
+ case vals = values[0]
958
+ when Hash
959
+ values = []
960
+ vals.each do |k,v|
961
+ columns << k
962
+ values << v
963
+ end
964
+ when Dataset, Array, LiteralString
965
+ values = vals
966
+ end
967
+ when 2
968
+ if (v0 = values[0]).is_a?(Array) && ((v1 = values[1]).is_a?(Array) || v1.is_a?(Dataset) || v1.is_a?(LiteralString))
969
+ columns, values = v0, v1
970
+ raise(Error, "Different number of values and columns given to insert_sql") if values.is_a?(Array) and columns.length != values.length
971
+ end
972
+ end
973
+
974
+ [columns, values]
975
+ end
976
+
977
+ # Formats the truncate statement. Assumes the table given has already been
978
+ # literalized.
979
+ def _truncate_sql(table)
980
+ "TRUNCATE TABLE #{table}"
981
+ end
982
+
983
+ # Returns an appropriate symbol for the alias represented by s.
984
+ def alias_alias_symbol(s)
985
+ case s
986
+ when Symbol
987
+ s
988
+ when String
989
+ s.to_sym
990
+ when SQL::Identifier
991
+ s.value.to_s.to_sym
992
+ else
993
+ raise Error, "Invalid alias for alias_alias_symbol: #{s.inspect}"
994
+ end
995
+ end
996
+
997
+ # Returns an appropriate alias symbol for the given object, which can be
998
+ # a Symbol, String, SQL::Identifier, SQL::QualifiedIdentifier, or
999
+ # SQL::AliasedExpression.
1000
+ def alias_symbol(sym)
1001
+ case sym
1002
+ when Symbol
1003
+ s, t, a = split_symbol(sym)
1004
+ a || s ? (a || t).to_sym : sym
1005
+ when String
1006
+ sym.to_sym
1007
+ when SQL::Identifier
1008
+ sym.value.to_s.to_sym
1009
+ when SQL::QualifiedIdentifier
1010
+ alias_symbol(sym.column)
1011
+ when SQL::AliasedExpression
1012
+ alias_alias_symbol(sym.alias)
1013
+ else
1014
+ raise Error, "Invalid alias for alias_symbol: #{sym.inspect}"
1015
+ end
1016
+ end
1017
+
1018
+ # Clone of this dataset usable in aggregate operations. Does
1019
+ # a from_self if dataset contains any parameters that would
1020
+ # affect normal aggregation, or just removes an existing
1021
+ # order if not. Also removes the row_proc, which isn't needed
1022
+ # for aggregate calculations.
1023
+ def aggregate_dataset
1024
+ (aggreate_dataset_use_from_self? ? from_self : unordered).naked
1025
+ end
1026
+
1027
+ # Whether to use from_self for an aggregate dataset.
1028
+ def aggreate_dataset_use_from_self?
1029
+ options_overlap(COUNT_FROM_SELF_OPTS)
1030
+ end
1031
+
1032
+ # Append aliasing expression to SQL string.
1033
+ def as_sql_append(sql, aliaz, column_aliases=nil)
1034
+ sql << ' AS '
1035
+ quote_identifier_append(sql, aliaz)
1036
+ if column_aliases
1037
+ raise Error, "#{db.database_type} does not support derived column lists" unless supports_derived_column_lists?
1038
+ sql << '('
1039
+ derived_column_list_sql_append(sql, column_aliases)
1040
+ sql << ')'
1041
+ end
1042
+ end
1043
+
1044
+ # Don't allow caching SQL if specifically marked not to.
1045
+ def cache_sql?
1046
+ !@opts[:no_cache_sql] && !cache_get(:_no_cache_sql)
1047
+ end
1048
+
1049
+ # Raise an InvalidOperation exception if modification is not allowed for this dataset.
1050
+ # Check whether it is allowed to insert into this dataset.
1051
+ # Only for backwards compatibility with older external adapters.
1052
+ def check_modification_allowed!
1053
+ # SEQUEL6: Remove
1054
+ Sequel::Deprecation.deprecate("Dataset#check_modification_allowed!", "Use check_{insert,delete,update,truncation}_allowed! instead")
1055
+ _check_modification_allowed!(supports_modifying_joins?)
1056
+ end
1057
+
1058
+ # Check whether it is allowed to insert into this dataset.
1059
+ def check_insert_allowed!
1060
+ _check_modification_allowed!(false)
1061
+ end
1062
+ alias check_truncation_allowed! check_insert_allowed!
1063
+
1064
+ # Check whether it is allowed to delete from this dataset.
1065
+ def check_delete_allowed!
1066
+ _check_modification_allowed!(supports_deleting_joins?)
1067
+ end
1068
+
1069
+ # Check whether it is allowed to update this dataset.
1070
+ def check_update_allowed!
1071
+ _check_modification_allowed!(supports_updating_joins?)
1072
+ end
1073
+
1074
+ # Internals of the check_*_allowed! methods
1075
+ def _check_modification_allowed!(modifying_joins_supported)
1076
+ raise(InvalidOperation, "Grouped datasets cannot be modified") if opts[:group]
1077
+ raise(InvalidOperation, "Joined datasets cannot be modified") if !modifying_joins_supported && joined_dataset?
1078
+ end
1079
+
1080
+ # Raise error if the dataset uses limits or offsets.
1081
+ def check_not_limited!(type)
1082
+ return if @opts[:skip_limit_check] && type != :truncate
1083
+ raise InvalidOperation, "Dataset##{type} not supported on datasets with limits or offsets" if opts[:limit] || opts[:offset]
1084
+ end
1085
+
1086
+ # Append column list to SQL string.
1087
+ # If the column list is empty, a wildcard (*) is appended.
1088
+ def column_list_append(sql, columns)
1089
+ if (columns.nil? || columns.empty?)
1090
+ sql << '*'
1091
+ else
1092
+ expression_list_append(sql, columns)
1093
+ end
1094
+ end
1095
+
1096
+ # Yield each pair of arguments to the block, which should
1097
+ # return an object representing the SQL expression for those
1098
+ # two arguments. For more than two arguments, the first
1099
+ # argument to the block will be result of the previous block call.
1100
+ def complex_expression_arg_pairs(args)
1101
+ case args.length
1102
+ when 1
1103
+ args[0]
1104
+ when 2
1105
+ yield args[0], args[1]
1106
+ else
1107
+ args.inject{|m, a| yield(m, a)}
1108
+ end
1109
+ end
1110
+
1111
+ # Append the literalization of the args using complex_expression_arg_pairs
1112
+ # to the given SQL string, used when database operator/function is 2-ary
1113
+ # where Sequel expression is N-ary.
1114
+ def complex_expression_arg_pairs_append(sql, args, &block)
1115
+ literal_append(sql, complex_expression_arg_pairs(args, &block))
1116
+ end
1117
+
1118
+ # Append literalization of complex expression to SQL string, for
1119
+ # operators unsupported by some databases. Used by adapters for databases
1120
+ # that don't support the operators natively.
1121
+ def complex_expression_emulate_append(sql, op, args)
1122
+ # :nocov:
1123
+ case op
1124
+ # :nocov:
1125
+ when :%
1126
+ complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.function(:MOD, a, b)}
1127
+ when :>>
1128
+ complex_expression_arg_pairs_append(sql, args){|a, b| Sequel./(a, Sequel.function(:power, 2, b))}
1129
+ when :<<
1130
+ complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.*(a, Sequel.function(:power, 2, b))}
1131
+ when :&, :|, :^
1132
+ f = BITWISE_METHOD_MAP[op]
1133
+ complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.function(f, a, b)}
1134
+ when :'B~'
1135
+ sql << "((0 - "
1136
+ literal_append(sql, args[0])
1137
+ sql << ") - 1)"
1138
+ end
1139
+ end
1140
+
1141
+ # Append literalization of dataset used in UNION/INTERSECT/EXCEPT clause to SQL string.
1142
+ def compound_dataset_sql_append(sql, ds)
1143
+ subselect_sql_append(sql, ds)
1144
+ end
1145
+
1146
+ # The alias to use for datasets, takes a number to make sure the name is unique.
1147
+ def dataset_alias(number)
1148
+ :"t#{number}"
1149
+ end
1150
+
1151
+ # The strftime format to use when literalizing time (Sequel::SQLTime) values.
1152
+ def default_time_format
1153
+ "'%H:%M:%S.%6N'"
1154
+ end
1155
+
1156
+ # The strftime format to use when literalizing timestamp (Time/DateTime) values.
1157
+ def default_timestamp_format
1158
+ "'%Y-%m-%d %H:%M:%S.%6N'"
1159
+ end
1160
+
1161
+ def delete_delete_sql(sql)
1162
+ sql << 'DELETE'
1163
+ end
1164
+
1165
+ def delete_from_sql(sql)
1166
+ if f = @opts[:from]
1167
+ sql << ' FROM '
1168
+ source_list_append(sql, f)
1169
+ end
1170
+ end
1171
+
1172
+ # Append the column aliases to the SQL.
1173
+ def derived_column_list_sql_append(sql, column_aliases)
1174
+ identifier_list_append(sql, column_aliases)
1175
+ end
1176
+
1177
+ # Disable caching of SQL for the current dataset
1178
+ def disable_sql_caching!
1179
+ cache_set(:_no_cache_sql, true)
1180
+ end
1181
+
1182
+ # An SQL FROM clause to use in SELECT statements where the dataset has
1183
+ # no from tables.
1184
+ def empty_from_sql
1185
+ nil
1186
+ end
1187
+
1188
+ # Whether to emulate the function with the given name. This should only be true
1189
+ # if the emulation goes beyond choosing a function with a different name.
1190
+ def emulate_function?(name)
1191
+ false
1192
+ end
1193
+
1194
+ # Append literalization of array of expressions to SQL string, separating them
1195
+ # with commas.
1196
+ def expression_list_append(sql, columns)
1197
+ c = false
1198
+ co = ', '
1199
+ columns.each do |col|
1200
+ sql << co if c
1201
+ literal_append(sql, col)
1202
+ c ||= true
1203
+ end
1204
+ end
1205
+
1206
+ # Append literalization of array of grouping elements to SQL string, seperating them with commas.
1207
+ def grouping_element_list_append(sql, columns)
1208
+ c = false
1209
+ co = ', '
1210
+ columns.each do |col|
1211
+ sql << co if c
1212
+ if col.is_a?(Array) && col.empty?
1213
+ sql << '()'
1214
+ else
1215
+ literal_append(sql, Array(col))
1216
+ end
1217
+ c ||= true
1218
+ end
1219
+ end
1220
+
1221
+ # An expression for how to handle an empty array lookup.
1222
+ def empty_array_value(op, cols)
1223
+ {1 => ((op == :IN) ? 0 : 1)}
1224
+ end
1225
+
1226
+ # Format the timestamp based on the default_timestamp_format.
1227
+ def format_timestamp(v)
1228
+ db.from_application_timestamp(v).strftime(default_timestamp_format)
1229
+ end
1230
+
1231
+ # :nocov:
1232
+
1233
+ # Return the SQL timestamp fragment to use for the fractional time part.
1234
+ # Should start with the decimal point. Uses 6 decimal places by default.
1235
+ def format_timestamp_usec(usec, ts=timestamp_precision)
1236
+ # SEQUEL6: Remove
1237
+ unless ts == 6
1238
+ usec = usec/(10 ** (6 - ts))
1239
+ end
1240
+ sprintf(".%0#{ts}d", usec)
1241
+ end
1242
+ # :nocov:
1243
+
1244
+ # Append literalization of identifier to SQL string, considering regular strings
1245
+ # as SQL identifiers instead of SQL strings.
1246
+ def identifier_append(sql, v)
1247
+ if v.is_a?(String)
1248
+ case v
1249
+ when LiteralString
1250
+ sql << v
1251
+ when SQL::Blob
1252
+ literal_append(sql, v)
1253
+ else
1254
+ quote_identifier_append(sql, v)
1255
+ end
1256
+ else
1257
+ literal_append(sql, v)
1258
+ end
1259
+ end
1260
+
1261
+ # Append literalization of array of identifiers to SQL string.
1262
+ def identifier_list_append(sql, args)
1263
+ c = false
1264
+ comma = ', '
1265
+ args.each do |a|
1266
+ sql << comma if c
1267
+ identifier_append(sql, a)
1268
+ c ||= true
1269
+ end
1270
+ end
1271
+
1272
+ # Upcase identifiers by default when inputting them into the database.
1273
+ def input_identifier(v)
1274
+ v.to_s.upcase
1275
+ end
1276
+
1277
+ def insert_into_sql(sql)
1278
+ sql << " INTO "
1279
+ if (f = @opts[:from]) && f.length == 1
1280
+ identifier_append(sql, unaliased_identifier(f.first))
1281
+ else
1282
+ source_list_append(sql, f)
1283
+ end
1284
+ end
1285
+
1286
+ def insert_columns_sql(sql)
1287
+ _insert_columns_sql(sql, opts[:columns])
1288
+ end
1289
+
1290
+ def _insert_columns_sql(sql, columns)
1291
+ if columns && !columns.empty?
1292
+ sql << ' ('
1293
+ identifier_list_append(sql, columns)
1294
+ sql << ')'
1295
+ end
1296
+ end
1297
+
1298
+ # The columns and values to use for an empty insert if the database doesn't support
1299
+ # INSERT with DEFAULT VALUES.
1300
+ def insert_empty_columns_values
1301
+ [[columns.last], [DEFAULT]]
1302
+ end
1303
+
1304
+ def insert_insert_sql(sql)
1305
+ sql << "INSERT"
1306
+ end
1307
+
1308
+ def insert_values_sql(sql)
1309
+ _insert_values_sql(sql, opts[:values])
1310
+ end
1311
+
1312
+ def _insert_values_sql(sql, values)
1313
+ case values
1314
+ when Array
1315
+ if values.empty?
1316
+ sql << " DEFAULT VALUES"
1317
+ else
1318
+ sql << " VALUES "
1319
+ literal_append(sql, values)
1320
+ end
1321
+ when Dataset
1322
+ sql << ' '
1323
+ subselect_sql_append(sql, values)
1324
+ when LiteralString
1325
+ sql << ' ' << values
1326
+ else
1327
+ raise Error, "Unsupported INSERT values type, should be an Array or Dataset: #{values.inspect}"
1328
+ end
1329
+ end
1330
+
1331
+ def insert_returning_sql(sql)
1332
+ if opts.has_key?(:returning)
1333
+ sql << " RETURNING "
1334
+ column_list_append(sql, Array(opts[:returning]))
1335
+ end
1336
+ end
1337
+ alias delete_returning_sql insert_returning_sql
1338
+ alias update_returning_sql insert_returning_sql
1339
+
1340
+ # SQL fragment specifying a JOIN type, converts underscores to
1341
+ # spaces and upcases.
1342
+ def join_type_sql(join_type)
1343
+ "#{join_type.to_s.tr('_', ' ').upcase} JOIN"
1344
+ end
1345
+
1346
+ # Append USING clause for JOIN USING
1347
+ def join_using_clause_using_sql_append(sql, using_columns)
1348
+ sql << ' USING ('
1349
+ column_list_append(sql, using_columns)
1350
+ sql << ')'
1351
+ end
1352
+
1353
+ # Append a literalization of the array to SQL string.
1354
+ # Treats as an expression if an array of all two pairs, or as a SQL array otherwise.
1355
+ def literal_array_append(sql, v)
1356
+ if Sequel.condition_specifier?(v)
1357
+ literal_expression_append(sql, SQL::BooleanExpression.from_value_pairs(v))
1358
+ else
1359
+ array_sql_append(sql, v)
1360
+ end
1361
+ end
1362
+
1363
+ # SQL fragment for BigDecimal
1364
+ def literal_big_decimal(v)
1365
+ d = v.to_s("F")
1366
+ v.nan? || v.infinite? ? "'#{d}'" : d
1367
+ end
1368
+
1369
+ # Append literalization of SQL::Blob to SQL string.
1370
+ def literal_blob_append(sql, v)
1371
+ literal_string_append(sql, v)
1372
+ end
1373
+
1374
+ # Append literalization of dataset to SQL string. Does a subselect inside parantheses.
1375
+ def literal_dataset_append(sql, v)
1376
+ sql << 'LATERAL ' if v.opts[:lateral]
1377
+ sql << '('
1378
+ subselect_sql_append(sql, v)
1379
+ sql << ')'
1380
+ end
1381
+
1382
+ # SQL fragment for Date, using the ISO8601 format.
1383
+ def literal_date(v)
1384
+ v.strftime("'%Y-%m-%d'")
1385
+ end
1386
+
1387
+ # Append literalization of date to SQL string.
1388
+ def literal_date_append(sql, v)
1389
+ sql << literal_date(v)
1390
+ end
1391
+
1392
+ # SQL fragment for DateTime
1393
+ def literal_datetime(v)
1394
+ format_timestamp(v)
1395
+ end
1396
+
1397
+ # Append literalization of DateTime to SQL string.
1398
+ def literal_datetime_append(sql, v)
1399
+ sql << literal_datetime(v)
1400
+ end
1401
+
1402
+ # Append literalization of SQL::Expression to SQL string.
1403
+ def literal_expression_append(sql, v)
1404
+ v.to_s_append(self, sql)
1405
+ end
1406
+
1407
+ # SQL fragment for false
1408
+ def literal_false
1409
+ "'f'"
1410
+ end
1411
+
1412
+ # SQL fragment for Float
1413
+ def literal_float(v)
1414
+ v.to_s
1415
+ end
1416
+
1417
+ # Append literalization of Hash to SQL string, treating hash as a boolean expression.
1418
+ def literal_hash_append(sql, v)
1419
+ literal_expression_append(sql, SQL::BooleanExpression.from_value_pairs(v))
1420
+ end
1421
+
1422
+ # SQL fragment for Integer
1423
+ def literal_integer(v)
1424
+ v.to_s
1425
+ end
1426
+
1427
+ # SQL fragment for nil
1428
+ def literal_nil
1429
+ "NULL"
1430
+ end
1431
+
1432
+ # Append a literalization of the object to the given SQL string.
1433
+ # Calls +sql_literal_append+ if object responds to it, otherwise
1434
+ # calls +sql_literal+ if object responds to it, otherwise raises an error.
1435
+ # If a database specific type is allowed, this should be overriden in a subclass.
1436
+ def literal_other_append(sql, v)
1437
+ if v.respond_to?(:sql_literal_append)
1438
+ v.sql_literal_append(self, sql)
1439
+ elsif v.respond_to?(:sql_literal)
1440
+ sql << v.sql_literal(self)
1441
+ else
1442
+ raise Error, "can't express #{v.inspect} as a SQL literal"
1443
+ end
1444
+
1445
+ if !v.respond_to?(:sql_literal_allow_caching?) || !v.sql_literal_allow_caching?(self)
1446
+ # We can't be sure if v will always literalize to the same SQL, so
1447
+ # don't cache SQL for a dataset that uses this.
1448
+ disable_sql_caching!
1449
+ end
1450
+ end
1451
+
1452
+ # Append a literalization of the set to SQL string.
1453
+ # Treats as an expression as an SQL value list.
1454
+ def literal_set_append(sql, v)
1455
+ array_sql_append(sql, v)
1456
+ end
1457
+
1458
+ # SQL fragment for Sequel::SQLTime, containing just the time part
1459
+ def literal_sqltime(v)
1460
+ v.strftime(default_time_format)
1461
+ end
1462
+
1463
+ # Append literalization of Sequel::SQLTime to SQL string.
1464
+ def literal_sqltime_append(sql, v)
1465
+ sql << literal_sqltime(v)
1466
+ end
1467
+
1468
+ # Append literalization of string to SQL string.
1469
+ def literal_string_append(sql, v)
1470
+ sql << "'" << v.gsub("'", "''") << "'"
1471
+ end
1472
+
1473
+ # Append literalization of symbol to SQL string.
1474
+ def literal_symbol_append(sql, v)
1475
+ c_table, column, c_alias = split_symbol(v)
1476
+ if c_table
1477
+ quote_identifier_append(sql, c_table)
1478
+ sql << '.'
1479
+ end
1480
+ quote_identifier_append(sql, column)
1481
+ as_sql_append(sql, c_alias) if c_alias
1482
+ end
1483
+
1484
+ # SQL fragment for Time
1485
+ def literal_time(v)
1486
+ format_timestamp(v)
1487
+ end
1488
+
1489
+ # Append literalization of Time to SQL string.
1490
+ def literal_time_append(sql, v)
1491
+ sql << literal_time(v)
1492
+ end
1493
+
1494
+ # SQL fragment for true
1495
+ def literal_true
1496
+ "'t'"
1497
+ end
1498
+
1499
+ # What strategy to use for import/multi_insert. While SQL-92 defaults
1500
+ # to allowing multiple rows in a VALUES clause, there are enough databases
1501
+ # that don't allow that that it can't be the default. Use separate queries
1502
+ # by default, which works everywhere.
1503
+ def multi_insert_sql_strategy
1504
+ :separate
1505
+ end
1506
+
1507
+
1508
+ # Get the native function name given the emulated function name.
1509
+ def native_function_name(emulated_function)
1510
+ emulated_function
1511
+ end
1512
+
1513
+ # Returns a qualified column name (including a table name) if the column
1514
+ # name isn't already qualified.
1515
+ def qualified_column_name(column, table)
1516
+ if column.is_a?(Symbol)
1517
+ c_table, column, _ = split_symbol(column)
1518
+ unless c_table
1519
+ case table
1520
+ when Symbol
1521
+ schema, table, t_alias = split_symbol(table)
1522
+ t_alias ||= Sequel::SQL::QualifiedIdentifier.new(schema, table) if schema
1523
+ when Sequel::SQL::AliasedExpression
1524
+ t_alias = table.alias
1525
+ end
1526
+ c_table = t_alias || table
1527
+ end
1528
+ ::Sequel::SQL::QualifiedIdentifier.new(c_table, column)
1529
+ else
1530
+ column
1531
+ end
1532
+ end
1533
+
1534
+ # Qualify the given expression to the given table.
1535
+ def qualified_expression(e, table)
1536
+ Qualifier.new(table).transform(e)
1537
+ end
1538
+
1539
+ def select_columns_sql(sql)
1540
+ sql << ' '
1541
+ column_list_append(sql, @opts[:select])
1542
+ end
1543
+
1544
+ def select_distinct_sql(sql)
1545
+ if distinct = @opts[:distinct]
1546
+ sql << " DISTINCT"
1547
+ unless distinct.empty?
1548
+ sql << " ON ("
1549
+ expression_list_append(sql, distinct)
1550
+ sql << ')'
1551
+ end
1552
+ end
1553
+ end
1554
+
1555
+ # Modify the sql to add a dataset to the via an EXCEPT, INTERSECT, or UNION clause.
1556
+ # This uses a subselect for the compound datasets used, because using parantheses doesn't
1557
+ # work on all databases.
1558
+ def select_compounds_sql(sql)
1559
+ return unless c = @opts[:compounds]
1560
+ c.each do |type, dataset, all|
1561
+ sql << ' ' << type.to_s.upcase
1562
+ sql << ' ALL' if all
1563
+ sql << ' '
1564
+ compound_dataset_sql_append(sql, dataset)
1565
+ end
1566
+ end
1567
+
1568
+ def select_from_sql(sql)
1569
+ if f = @opts[:from]
1570
+ sql << ' FROM '
1571
+ source_list_append(sql, f)
1572
+ elsif f = empty_from_sql
1573
+ sql << f
1574
+ end
1575
+ end
1576
+
1577
+ def select_group_sql(sql)
1578
+ if group = @opts[:group]
1579
+ sql << " GROUP BY "
1580
+ if go = @opts[:group_options]
1581
+ if go == :"grouping sets"
1582
+ sql << go.to_s.upcase << '('
1583
+ grouping_element_list_append(sql, group)
1584
+ sql << ')'
1585
+ elsif uses_with_rollup?
1586
+ expression_list_append(sql, group)
1587
+ sql << " WITH " << go.to_s.upcase
1588
+ else
1589
+ sql << go.to_s.upcase << '('
1590
+ expression_list_append(sql, group)
1591
+ sql << ')'
1592
+ end
1593
+ else
1594
+ expression_list_append(sql, group)
1595
+ end
1596
+ end
1597
+ end
1598
+
1599
+ def select_having_sql(sql)
1600
+ if having = @opts[:having]
1601
+ sql << " HAVING "
1602
+ literal_append(sql, having)
1603
+ end
1604
+ end
1605
+
1606
+ def select_join_sql(sql)
1607
+ if js = @opts[:join]
1608
+ js.each{|j| literal_append(sql, j)}
1609
+ end
1610
+ end
1611
+
1612
+ def select_limit_sql(sql)
1613
+ if l = @opts[:limit]
1614
+ sql << " LIMIT "
1615
+ literal_append(sql, l)
1616
+ if o = @opts[:offset]
1617
+ sql << " OFFSET "
1618
+ literal_append(sql, o)
1619
+ end
1620
+ elsif @opts[:offset]
1621
+ select_only_offset_sql(sql)
1622
+ end
1623
+ end
1624
+
1625
+ def select_lock_sql(sql)
1626
+ case l = @opts[:lock]
1627
+ when :update
1628
+ sql << ' FOR UPDATE'
1629
+ when String
1630
+ sql << ' ' << l
1631
+ end
1632
+ end
1633
+
1634
+ # Used only if there is an offset and no limit, making it easier to override
1635
+ # in the adapter, as many databases do not support just a plain offset with
1636
+ # no limit.
1637
+ def select_only_offset_sql(sql)
1638
+ sql << " OFFSET "
1639
+ literal_append(sql, @opts[:offset])
1640
+ end
1641
+
1642
+ def select_order_sql(sql)
1643
+ if o = @opts[:order]
1644
+ sql << " ORDER BY "
1645
+ expression_list_append(sql, o)
1646
+ end
1647
+ end
1648
+ alias delete_order_sql select_order_sql
1649
+ alias update_order_sql select_order_sql
1650
+
1651
+ def select_select_sql(sql)
1652
+ sql << 'SELECT'
1653
+ end
1654
+
1655
+ def select_where_sql(sql)
1656
+ if w = @opts[:where]
1657
+ sql << " WHERE "
1658
+ literal_append(sql, w)
1659
+ end
1660
+ end
1661
+ alias delete_where_sql select_where_sql
1662
+ alias update_where_sql select_where_sql
1663
+
1664
+ def select_window_sql(sql)
1665
+ if ws = @opts[:window]
1666
+ sql << " WINDOW "
1667
+ c = false
1668
+ co = ', '
1669
+ as = ' AS '
1670
+ ws.map do |name, window|
1671
+ sql << co if c
1672
+ literal_append(sql, name)
1673
+ sql << as
1674
+ literal_append(sql, window)
1675
+ c ||= true
1676
+ end
1677
+ end
1678
+ end
1679
+
1680
+ def select_with_sql(sql)
1681
+ return unless supports_cte?
1682
+ ctes = opts[:with]
1683
+ return if !ctes || ctes.empty?
1684
+ sql << select_with_sql_base
1685
+ c = false
1686
+ comma = ', '
1687
+ ctes.each do |cte|
1688
+ sql << comma if c
1689
+ select_with_sql_cte(sql, cte)
1690
+ c ||= true
1691
+ end
1692
+ sql << ' '
1693
+ end
1694
+ alias delete_with_sql select_with_sql
1695
+ alias insert_with_sql select_with_sql
1696
+ alias update_with_sql select_with_sql
1697
+
1698
+ def select_with_sql_base
1699
+ "WITH "
1700
+ end
1701
+
1702
+ def select_with_sql_cte(sql, cte)
1703
+ select_with_sql_prefix(sql, cte)
1704
+ literal_dataset_append(sql, cte[:dataset])
1705
+ end
1706
+
1707
+ def select_with_sql_prefix(sql, w)
1708
+ quote_identifier_append(sql, w[:name])
1709
+ if args = w[:args]
1710
+ sql << '('
1711
+ identifier_list_append(sql, args)
1712
+ sql << ')'
1713
+ end
1714
+ sql << ' AS '
1715
+
1716
+ case w[:materialized]
1717
+ when true
1718
+ sql << "MATERIALIZED "
1719
+ when false
1720
+ sql << "NOT MATERIALIZED "
1721
+ end
1722
+ end
1723
+
1724
+ # Whether the symbol cache should be skipped when literalizing the dataset
1725
+ def skip_symbol_cache?
1726
+ @opts[:skip_symbol_cache]
1727
+ end
1728
+
1729
+ # Append literalization of array of sources/tables to SQL string, raising an Error if there
1730
+ # are no sources.
1731
+ def source_list_append(sql, sources)
1732
+ raise(Error, 'No source specified for query') if sources.nil? || sources == []
1733
+ identifier_list_append(sql, sources)
1734
+ end
1735
+
1736
+ # Delegate to Sequel.split_symbol.
1737
+ def split_symbol(sym)
1738
+ Sequel.split_symbol(sym)
1739
+ end
1740
+
1741
+ # The string that is appended to to create the SQL query, the empty
1742
+ # string by default.
1743
+ def sql_string_origin
1744
+ String.new
1745
+ end
1746
+
1747
+ # The precision to use for SQLTime instances (time column values without dates).
1748
+ # Defaults to timestamp_precision.
1749
+ def sqltime_precision
1750
+ timestamp_precision
1751
+ end
1752
+
1753
+ # SQL to use if this dataset uses static SQL. Since static SQL
1754
+ # can be a PlaceholderLiteralString in addition to a String,
1755
+ # we literalize nonstrings. If there is an append_sql for this
1756
+ # dataset, append to that SQL instead of returning the value.
1757
+ def static_sql(sql)
1758
+ if append_sql = @opts[:append_sql]
1759
+ if sql.is_a?(String)
1760
+ append_sql << sql
1761
+ else
1762
+ literal_append(append_sql, sql)
1763
+ end
1764
+ else
1765
+ if sql.is_a?(String)
1766
+ sql
1767
+ else
1768
+ literal(sql)
1769
+ end
1770
+ end
1771
+ end
1772
+
1773
+ # Append literalization of the subselect to SQL string.
1774
+ def subselect_sql_append(sql, ds)
1775
+ sds = subselect_sql_dataset(sql, ds)
1776
+ subselect_sql_append_sql(sql, sds)
1777
+ unless sds.send(:cache_sql?)
1778
+ # If subquery dataset does not allow caching SQL,
1779
+ # then this dataset should not allow caching SQL.
1780
+ disable_sql_caching!
1781
+ end
1782
+ end
1783
+
1784
+ def subselect_sql_dataset(sql, ds)
1785
+ ds.clone(:append_sql=>sql)
1786
+ end
1787
+
1788
+ def subselect_sql_append_sql(sql, ds)
1789
+ ds.sql
1790
+ end
1791
+
1792
+ # The number of decimal digits of precision to use in timestamps.
1793
+ def timestamp_precision
1794
+ supports_timestamp_usecs? ? 6 : 0
1795
+ end
1796
+
1797
+ def update_table_sql(sql)
1798
+ sql << ' '
1799
+ source_list_append(sql, @opts[:from])
1800
+ select_join_sql(sql) if supports_modifying_joins?
1801
+ end
1802
+
1803
+ def update_set_sql(sql)
1804
+ sql << ' SET '
1805
+ values = @opts[:values]
1806
+ if values.is_a?(Hash)
1807
+ update_sql_values_hash(sql, values)
1808
+ else
1809
+ sql << values
1810
+ end
1811
+ end
1812
+
1813
+ def update_sql_values_hash(sql, values)
1814
+ c = false
1815
+ eq = ' = '
1816
+ values.each do |k, v|
1817
+ sql << ', ' if c
1818
+ if k.is_a?(String) && !k.is_a?(LiteralString)
1819
+ quote_identifier_append(sql, k)
1820
+ else
1821
+ literal_append(sql, k)
1822
+ end
1823
+ sql << eq
1824
+ literal_append(sql, v)
1825
+ c ||= true
1826
+ end
1827
+ end
1828
+
1829
+ def update_update_sql(sql)
1830
+ sql << 'UPDATE'
1831
+ end
1832
+
1833
+ def window_frame_boundary_sql_append(sql, boundary, direction)
1834
+ case boundary
1835
+ when :current
1836
+ sql << "CURRENT ROW"
1837
+ when :preceding
1838
+ sql << "UNBOUNDED PRECEDING"
1839
+ when :following
1840
+ sql << "UNBOUNDED FOLLOWING"
1841
+ else
1842
+ if boundary.is_a?(Array)
1843
+ offset, direction = boundary
1844
+ unless boundary.length == 2 && (direction == :preceding || direction == :following)
1845
+ raise Error, "invalid window :frame boundary (:start or :end) option: #{boundary.inspect}"
1846
+ end
1847
+ else
1848
+ offset = boundary
1849
+ end
1850
+
1851
+ case offset
1852
+ when Numeric, String, SQL::Cast
1853
+ # nothing
1854
+ else
1855
+ raise Error, "invalid window :frame boundary (:start or :end) option: #{boundary.inspect}"
1856
+ end
1857
+
1858
+ literal_append(sql, offset)
1859
+ sql << (direction == :preceding ? " PRECEDING" : " FOLLOWING")
1860
+ end
1861
+ end
1862
+ end
1863
+ end