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,1073 @@
1
+ # frozen-string-literal: true
2
+
3
+ require_relative '../utils/replace'
4
+ require_relative '../utils/unmodified_identifiers'
5
+
6
+ module Sequel
7
+ module SQLite
8
+ Sequel::Database.set_shared_adapter_scheme(:sqlite, self)
9
+
10
+ def self.mock_adapter_setup(db)
11
+ db.instance_exec do
12
+ @sqlite_version = 30903
13
+
14
+ def schema_parse_table(*)
15
+ []
16
+ end
17
+ singleton_class.send(:private, :schema_parse_table)
18
+ end
19
+ end
20
+
21
+ # No matter how you connect to SQLite, the following Database options
22
+ # can be used to set PRAGMAs on connections in a thread-safe manner:
23
+ # :auto_vacuum, :foreign_keys, :synchronous, and :temp_store.
24
+ module DatabaseMethods
25
+ include UnmodifiedIdentifiers::DatabaseMethods
26
+
27
+ AUTO_VACUUM = [:none, :full, :incremental].freeze
28
+ SYNCHRONOUS = [:off, :normal, :full].freeze
29
+ TEMP_STORE = [:default, :file, :memory].freeze
30
+ TRANSACTION_MODE = {
31
+ :deferred => "BEGIN DEFERRED TRANSACTION".freeze,
32
+ :immediate => "BEGIN IMMEDIATE TRANSACTION".freeze,
33
+ :exclusive => "BEGIN EXCLUSIVE TRANSACTION".freeze,
34
+ nil => "BEGIN".freeze
35
+ }.freeze
36
+
37
+ # Whether to use integers for booleans in the database. SQLite recommends
38
+ # booleans be stored as integers, but historically Sequel has used 't'/'f'.
39
+ attr_accessor :integer_booleans
40
+
41
+ # Whether to keep CURRENT_TIMESTAMP and similar expressions in UTC. By
42
+ # default, the expressions are converted to localtime.
43
+ attr_accessor :current_timestamp_utc
44
+
45
+ # A symbol signifying the value of the default transaction mode
46
+ attr_reader :transaction_mode
47
+
48
+ # Set the default transaction mode.
49
+ def transaction_mode=(value)
50
+ if TRANSACTION_MODE.include?(value)
51
+ @transaction_mode = value
52
+ else
53
+ raise Error, "Invalid value for transaction_mode. Please specify one of :deferred, :immediate, :exclusive, nil"
54
+ end
55
+ end
56
+
57
+ # SQLite uses the :sqlite database type.
58
+ def database_type
59
+ :sqlite
60
+ end
61
+
62
+ # Set the integer_booleans option using the passed in :integer_boolean option.
63
+ def set_integer_booleans
64
+ @integer_booleans = @opts.has_key?(:integer_booleans) ? typecast_value_boolean(@opts[:integer_booleans]) : true
65
+ end
66
+
67
+ # Return the array of foreign key info hashes using the foreign_key_list PRAGMA,
68
+ # including information for the :on_update and :on_delete entries.
69
+ def foreign_key_list(table, opts=OPTS)
70
+ m = output_identifier_meth
71
+ h = {}
72
+ _foreign_key_list_ds(table).each do |row|
73
+ if r = h[row[:id]]
74
+ r[:columns] << m.call(row[:from])
75
+ r[:key] << m.call(row[:to]) if r[:key]
76
+ else
77
+ h[row[:id]] = {:columns=>[m.call(row[:from])], :table=>m.call(row[:table]), :key=>([m.call(row[:to])] if row[:to]), :on_update=>on_delete_sql_to_sym(row[:on_update]), :on_delete=>on_delete_sql_to_sym(row[:on_delete])}
78
+ end
79
+ end
80
+ h.values
81
+ end
82
+
83
+ def freeze
84
+ sqlite_version
85
+ use_timestamp_timezones?
86
+ super
87
+ end
88
+
89
+ # Use the index_list and index_info PRAGMAs to determine the indexes on the table.
90
+ def indexes(table, opts=OPTS)
91
+ m = output_identifier_meth
92
+ im = input_identifier_meth
93
+ indexes = {}
94
+ table = table.value if table.is_a?(Sequel::SQL::Identifier)
95
+ metadata_dataset.with_sql("PRAGMA index_list(?)", im.call(table)).each do |r|
96
+ if opts[:only_autocreated]
97
+ # If specifically asked for only autocreated indexes, then return those an only those
98
+ next unless r[:name].start_with?('sqlite_autoindex_')
99
+ elsif r.has_key?(:origin)
100
+ # If origin is set, then only exclude primary key indexes and partial indexes
101
+ next if r[:origin] == 'pk'
102
+ next if r[:partial].to_i == 1
103
+ else
104
+ # When :origin key not present, assume any autoindex could be a primary key one and exclude it
105
+ next if r[:name].start_with?('sqlite_autoindex_')
106
+ end
107
+
108
+ indexes[m.call(r[:name])] = {:unique=>r[:unique].to_i==1}
109
+ end
110
+ indexes.each do |k, v|
111
+ v[:columns] = metadata_dataset.with_sql("PRAGMA index_info(?)", im.call(k)).map(:name).map{|x| m.call(x)}
112
+ end
113
+ indexes
114
+ end
115
+
116
+ # The version of the server as an integer, where 3.6.19 = 30619.
117
+ # If the server version can't be determined, 0 is used.
118
+ def sqlite_version
119
+ return @sqlite_version if defined?(@sqlite_version)
120
+ @sqlite_version = begin
121
+ v = fetch('SELECT sqlite_version()').single_value
122
+ [10000, 100, 1].zip(v.split('.')).inject(0){|a, m| a + m[0] * Integer(m[1])}
123
+ rescue
124
+ 0
125
+ end
126
+ end
127
+
128
+ # SQLite supports CREATE TABLE IF NOT EXISTS syntax since 3.3.0.
129
+ def supports_create_table_if_not_exists?
130
+ sqlite_version >= 30300
131
+ end
132
+
133
+ # SQLite 3.6.19+ supports deferrable foreign key constraints.
134
+ def supports_deferrable_foreign_key_constraints?
135
+ sqlite_version >= 30619
136
+ end
137
+
138
+ # SQLite 3.8.0+ supports partial indexes.
139
+ def supports_partial_indexes?
140
+ sqlite_version >= 30800
141
+ end
142
+
143
+ # SQLite 3.6.8+ supports savepoints.
144
+ def supports_savepoints?
145
+ sqlite_version >= 30608
146
+ end
147
+
148
+ # SQLite 3.8.2+ supports the without rowid table constraint
149
+ def support_without_rowid?
150
+ sqlite_version >= 30802
151
+ end
152
+
153
+ # Override the default setting for whether to use timezones in timestamps.
154
+ # It is set to +false+ by default, as SQLite's date/time methods do not
155
+ # support timezones in timestamps.
156
+ attr_writer :use_timestamp_timezones
157
+
158
+ # SQLite supports timezones in timestamps, since it just stores them as strings,
159
+ # but it breaks the usage of SQLite's datetime functions.
160
+ def use_timestamp_timezones?
161
+ defined?(@use_timestamp_timezones) ? @use_timestamp_timezones : (@use_timestamp_timezones = false)
162
+ end
163
+
164
+ # Array of symbols specifying the table names in the current database.
165
+ #
166
+ # Options:
167
+ # :server :: Set the server to use.
168
+ def tables(opts=OPTS)
169
+ tables_and_views(Sequel.~(:name=>'sqlite_sequence') & {:type => 'table'}, opts)
170
+ end
171
+
172
+ # Creates a dataset that uses the VALUES clause:
173
+ #
174
+ # DB.values([[1, 2], [3, 4]])
175
+ # # VALUES ((1, 2), (3, 4))
176
+ def values(v)
177
+ raise Error, "Cannot provide an empty array for values" if v.empty?
178
+ @default_dataset.clone(:values=>v)
179
+ end
180
+
181
+ # Array of symbols specifying the view names in the current database.
182
+ #
183
+ # Options:
184
+ # :server :: Set the server to use.
185
+ def views(opts=OPTS)
186
+ tables_and_views({:type => 'view'}, opts)
187
+ end
188
+
189
+ private
190
+
191
+ # Dataset used for parsing foreign key lists
192
+ def _foreign_key_list_ds(table)
193
+ metadata_dataset.with_sql("PRAGMA foreign_key_list(?)", input_identifier_meth.call(table))
194
+ end
195
+
196
+ # Dataset used for parsing schema
197
+ def _parse_pragma_ds(table_name, opts)
198
+ metadata_dataset.with_sql("PRAGMA table_#{'x' if sqlite_version > 33100}info(?)", input_identifier_meth(opts[:dataset]).call(table_name))
199
+ end
200
+
201
+ # Run all alter_table commands in a transaction. This is technically only
202
+ # needed for drop column.
203
+ def apply_alter_table(table, ops)
204
+ fks = fetch("PRAGMA foreign_keys")
205
+ if fks
206
+ run "PRAGMA foreign_keys = 0"
207
+ run "PRAGMA legacy_alter_table = 1" if sqlite_version >= 32600
208
+ end
209
+ transaction do
210
+ if ops.length > 1 && ops.all?{|op| op[:op] == :add_constraint || op[:op] == :set_column_null}
211
+ null_ops, ops = ops.partition{|op| op[:op] == :set_column_null}
212
+
213
+ # Apply NULL/NOT NULL ops first, since those should be purely idependent of the constraints.
214
+ null_ops.each{|op| alter_table_sql_list(table, [op]).flatten.each{|sql| execute_ddl(sql)}}
215
+
216
+ # If you are just doing constraints, apply all of them at the same time,
217
+ # as otherwise all but the last one get lost.
218
+ alter_table_sql_list(table, [{:op=>:add_constraints, :ops=>ops}]).flatten.each{|sql| execute_ddl(sql)}
219
+ else
220
+ # Run each operation separately, as later operations may depend on the
221
+ # results of earlier operations.
222
+ ops.each{|op| alter_table_sql_list(table, [op]).flatten.each{|sql| execute_ddl(sql)}}
223
+ end
224
+ end
225
+ remove_cached_schema(table)
226
+ ensure
227
+ if fks
228
+ run "PRAGMA foreign_keys = 1"
229
+ run "PRAGMA legacy_alter_table = 0" if sqlite_version >= 32600
230
+ end
231
+ end
232
+
233
+ # SQLite supports limited table modification. You can add a column
234
+ # or an index. Dropping columns is supported by copying the table into
235
+ # a temporary table, dropping the table, and creating a new table without
236
+ # the column inside of a transaction.
237
+ def alter_table_sql(table, op)
238
+ case op[:op]
239
+ when :add_index, :drop_index
240
+ super
241
+ when :add_column
242
+ if op[:unique] || op[:primary_key]
243
+ duplicate_table(table){|columns| columns.push(op)}
244
+ else
245
+ super
246
+ end
247
+ when :drop_column
248
+ if sqlite_version >= 33500 && !indexes(table).any?{|_, h| h[:columns].include?(op[:name])}
249
+ super
250
+ else
251
+ ocp = lambda{|oc| oc.delete_if{|c| c.to_s == op[:name].to_s}}
252
+ duplicate_table(table, :old_columns_proc=>ocp){|columns| columns.delete_if{|s| s[:name].to_s == op[:name].to_s}}
253
+ end
254
+ when :rename_column
255
+ if sqlite_version >= 32500
256
+ super
257
+ else
258
+ ncp = lambda{|nc| nc.map!{|c| c.to_s == op[:name].to_s ? op[:new_name] : c}}
259
+ duplicate_table(table, :new_columns_proc=>ncp){|columns| columns.each{|s| s[:name] = op[:new_name] if s[:name].to_s == op[:name].to_s}}
260
+ end
261
+ when :set_column_default
262
+ duplicate_table(table){|columns| columns.each{|s| s[:default] = op[:default] if s[:name].to_s == op[:name].to_s}}
263
+ when :set_column_null
264
+ duplicate_table(table){|columns| columns.each{|s| s[:null] = op[:null] if s[:name].to_s == op[:name].to_s}}
265
+ when :set_column_type
266
+ duplicate_table(table){|columns| columns.each{|s| s.merge!(op) if s[:name].to_s == op[:name].to_s}}
267
+ when :drop_constraint
268
+ case op[:type]
269
+ when :primary_key
270
+ duplicate_table(table) do |columns|
271
+ columns.each do |s|
272
+ s[:unique] = false if s[:primary_key]
273
+ s[:primary_key] = s[:auto_increment] = nil
274
+ end
275
+ end
276
+ when :foreign_key
277
+ if op[:columns]
278
+ duplicate_table(table, :skip_foreign_key_columns=>op[:columns])
279
+ else
280
+ duplicate_table(table, :no_foreign_keys=>true)
281
+ end
282
+ when :unique
283
+ duplicate_table(table, :no_unique=>true)
284
+ else
285
+ duplicate_table(table)
286
+ end
287
+ when :add_constraint
288
+ duplicate_table(table, :constraints=>[op])
289
+ when :add_constraints
290
+ duplicate_table(table, :constraints=>op[:ops])
291
+ else
292
+ raise Error, "Unsupported ALTER TABLE operation: #{op[:op].inspect}"
293
+ end
294
+ end
295
+
296
+ def begin_new_transaction(conn, opts)
297
+ mode = opts[:mode] || @transaction_mode
298
+ sql = TRANSACTION_MODE[mode] or raise Error, "transaction :mode must be one of: :deferred, :immediate, :exclusive, nil"
299
+ log_connection_execute(conn, sql)
300
+ set_transaction_isolation(conn, opts)
301
+ end
302
+
303
+ # A name to use for the backup table
304
+ def backup_table_name(table, opts=OPTS)
305
+ table = table.delete('`')
306
+ (opts[:times]||1000).times do |i|
307
+ table_name = "#{table}_backup#{i}"
308
+ return table_name unless table_exists?(table_name)
309
+ end
310
+ end
311
+
312
+ # SQLite allows adding primary key constraints on NULLABLE columns, but then
313
+ # does not enforce NOT NULL for such columns, so force setting the columns NOT NULL.
314
+ def can_add_primary_key_constraint_on_nullable_columns?
315
+ false
316
+ end
317
+
318
+ # Surround default with parens to appease SQLite. Add support for GENERATED ALWAYS AS.
319
+ def column_definition_default_sql(sql, column)
320
+ sql << " DEFAULT (#{literal(column[:default])})" if column.include?(:default)
321
+ if (generated = column[:generated_always_as])
322
+ if (generated_type = column[:generated_type]) && (generated_type == :stored || generated_type == :virtual)
323
+ generated_type = generated_type.to_s.upcase
324
+ end
325
+ sql << " GENERATED ALWAYS AS (#{literal(generated)}) #{generated_type}"
326
+ end
327
+ end
328
+
329
+ # SQLite does not restrict the integer or decimal type to a specific range.
330
+ def column_schema_integer_min_max_values(column)
331
+ nil
332
+ end
333
+ alias column_schema_decimal_min_max_values column_schema_integer_min_max_values
334
+
335
+ # Array of PRAGMA SQL statements based on the Database options that should be applied to
336
+ # new connections.
337
+ def connection_pragmas
338
+ ps = []
339
+ v = typecast_value_boolean(opts.fetch(:foreign_keys, 1))
340
+ ps << "PRAGMA foreign_keys = #{v ? 1 : 0}"
341
+ v = typecast_value_boolean(opts.fetch(:case_sensitive_like, 1))
342
+ ps << "PRAGMA case_sensitive_like = #{v ? 1 : 0}"
343
+ [[:auto_vacuum, AUTO_VACUUM], [:synchronous, SYNCHRONOUS], [:temp_store, TEMP_STORE]].each do |prag, con|
344
+ if v = opts[prag]
345
+ raise(Error, "Value for PRAGMA #{prag} not supported, should be one of #{con.join(', ')}") unless v = con.index(v.to_sym)
346
+ ps << "PRAGMA #{prag} = #{v}"
347
+ end
348
+ end
349
+ ps
350
+ end
351
+
352
+ # Support creating STRICT AND/OR WITHOUT ROWID tables via :strict and :without_rowid options, and VIRTUAL tables with :using option.
353
+ def create_table_sql(name, generator, options)
354
+ if options[:strict] && options[:without_rowid]
355
+ "#{super} STRICT, WITHOUT ROWID"
356
+ elsif options[:strict]
357
+ "#{super} STRICT"
358
+ elsif options[:without_rowid]
359
+ "#{super} WITHOUT ROWID"
360
+ elsif options[:using]
361
+ "CREATE VIRTUAL TABLE#{' IF NOT EXISTS' if options[:if_not_exists]} #{create_table_table_name_sql(name, options)} USING #{options[:using]}"
362
+ else
363
+ super
364
+ end
365
+ end
366
+
367
+ # SQLite support creating temporary views.
368
+ def create_view_prefix_sql(name, options)
369
+ create_view_sql_append_columns("CREATE #{'TEMPORARY 'if options[:temp]}VIEW #{quote_schema_table(name)}", options[:columns])
370
+ end
371
+
372
+ DATABASE_ERROR_REGEXPS = {
373
+ /(is|are) not unique\z|PRIMARY KEY must be unique\z|UNIQUE constraint failed: .+\z/ => UniqueConstraintViolation,
374
+ /foreign key constraint failed\z/i => ForeignKeyConstraintViolation,
375
+ /\ASQLITE ERROR 3091/ => CheckConstraintViolation,
376
+ /\A(SQLITE ERROR 275 \(CONSTRAINT_CHECK\) : )?CHECK constraint failed/ => CheckConstraintViolation,
377
+ /\A(SQLITE ERROR 19 \(CONSTRAINT\) : )?constraint failed\z/ => ConstraintViolation,
378
+ /\Acannot store [A-Z]+ value in [A-Z]+ column / => ConstraintViolation,
379
+ /may not be NULL\z|NOT NULL constraint failed: .+\z/ => NotNullConstraintViolation,
380
+ /\ASQLITE ERROR \d+ \(\) : CHECK constraint failed: / => CheckConstraintViolation
381
+ }.freeze
382
+ def database_error_regexps
383
+ DATABASE_ERROR_REGEXPS
384
+ end
385
+
386
+ # Recognize SQLite error codes if the exception provides access to them.
387
+ def database_specific_error_class(exception, opts)
388
+ case sqlite_error_code(exception)
389
+ when 1299
390
+ NotNullConstraintViolation
391
+ when 1555, 2067, 2579
392
+ UniqueConstraintViolation
393
+ when 787
394
+ ForeignKeyConstraintViolation
395
+ when 275
396
+ CheckConstraintViolation
397
+ when 19
398
+ ConstraintViolation
399
+ when 517
400
+ SerializationFailure
401
+ else
402
+ super
403
+ end
404
+ end
405
+
406
+ # The array of column schema hashes for the current columns in the table
407
+ def defined_columns_for(table)
408
+ cols = parse_pragma(table, OPTS)
409
+ cols.each do |c|
410
+ c[:default] = LiteralString.new(c[:default]) if c[:default]
411
+ c[:type] = c[:db_type]
412
+ end
413
+ cols
414
+ end
415
+
416
+ # Duplicate an existing table by creating a new table, copying all records
417
+ # from the existing table into the new table, deleting the existing table
418
+ # and renaming the new table to the existing table's name.
419
+ def duplicate_table(table, opts=OPTS)
420
+ remove_cached_schema(table)
421
+ def_columns = defined_columns_for(table)
422
+ old_columns = def_columns.map{|c| c[:name]}
423
+ opts[:old_columns_proc].call(old_columns) if opts[:old_columns_proc]
424
+
425
+ yield def_columns if defined?(yield)
426
+
427
+ constraints = (opts[:constraints] || []).dup
428
+ pks = []
429
+ def_columns.each{|c| pks << c[:name] if c[:primary_key]}
430
+ if pks.length > 1
431
+ constraints << {:type=>:primary_key, :columns=>pks}
432
+ def_columns.each{|c| c[:primary_key] = false if c[:primary_key]}
433
+ end
434
+
435
+ # If dropping a foreign key constraint, drop all foreign key constraints,
436
+ # as there is no way to determine which one to drop.
437
+ unless opts[:no_foreign_keys]
438
+ fks = foreign_key_list(table)
439
+
440
+ # If dropping a column, if there is a foreign key with that
441
+ # column, don't include it when building a copy of the table.
442
+ if ocp = opts[:old_columns_proc]
443
+ fks.delete_if{|c| ocp.call(c[:columns].dup) != c[:columns]}
444
+ end
445
+
446
+ # Skip any foreign key columns where a constraint for those
447
+ # foreign keys is being dropped.
448
+ if sfkc = opts[:skip_foreign_key_columns]
449
+ fks.delete_if{|c| c[:columns] == sfkc}
450
+ end
451
+
452
+ constraints.concat(fks.each{|h| h[:type] = :foreign_key})
453
+ end
454
+
455
+ # Determine unique constraints and make sure the new columns have them
456
+ unique_columns = []
457
+ skip_indexes = []
458
+ indexes(table, :only_autocreated=>true).each do |name, h|
459
+ skip_indexes << name
460
+ if h[:unique] && !opts[:no_unique]
461
+ if h[:columns].length == 1
462
+ unique_columns.concat(h[:columns])
463
+ elsif h[:columns].map(&:to_s) != pks
464
+ constraints << {:type=>:unique, :columns=>h[:columns]}
465
+ end
466
+ end
467
+ end
468
+ unique_columns -= pks
469
+ unless unique_columns.empty?
470
+ unique_columns.map!{|c| quote_identifier(c)}
471
+ def_columns.each do |c|
472
+ c[:unique] = true if unique_columns.include?(quote_identifier(c[:name])) && c[:unique] != false
473
+ end
474
+ end
475
+
476
+ def_columns_str = (def_columns.map{|c| column_definition_sql(c)} + constraints.map{|c| constraint_definition_sql(c)}).join(', ')
477
+ new_columns = old_columns.dup
478
+ opts[:new_columns_proc].call(new_columns) if opts[:new_columns_proc]
479
+
480
+ qt = quote_schema_table(table)
481
+ bt = quote_identifier(backup_table_name(qt))
482
+ a = [
483
+ "ALTER TABLE #{qt} RENAME TO #{bt}",
484
+ "CREATE TABLE #{qt}(#{def_columns_str})",
485
+ "INSERT INTO #{qt}(#{dataset.send(:identifier_list, new_columns)}) SELECT #{dataset.send(:identifier_list, old_columns)} FROM #{bt}",
486
+ "DROP TABLE #{bt}"
487
+ ]
488
+ indexes(table).each do |name, h|
489
+ next if skip_indexes.include?(name)
490
+ if (h[:columns].map(&:to_s) - new_columns).empty?
491
+ a << alter_table_sql(table, h.merge(:op=>:add_index, :name=>name))
492
+ end
493
+ end
494
+ a
495
+ end
496
+
497
+ # Does the reverse of on_delete_clause, eg. converts strings like +'SET NULL'+
498
+ # to symbols +:set_null+.
499
+ def on_delete_sql_to_sym(str)
500
+ case str
501
+ when 'RESTRICT'
502
+ :restrict
503
+ when 'CASCADE'
504
+ :cascade
505
+ when 'SET NULL'
506
+ :set_null
507
+ when 'SET DEFAULT'
508
+ :set_default
509
+ when 'NO ACTION'
510
+ :no_action
511
+ end
512
+ end
513
+
514
+ # Parse the output of the table_info pragma
515
+ def parse_pragma(table_name, opts)
516
+ pks = 0
517
+ sch = _parse_pragma_ds(table_name, opts).map do |row|
518
+ if sqlite_version > 33100
519
+ # table_xinfo PRAGMA used, remove hidden columns
520
+ # that are not generated columns
521
+ if row[:generated] = (row.delete(:hidden) != 0)
522
+ row[:type] = row[:type].sub(' GENERATED ALWAYS', '')
523
+ end
524
+ end
525
+
526
+ row.delete(:cid)
527
+ row[:allow_null] = row.delete(:notnull).to_i == 0
528
+ row[:default] = row.delete(:dflt_value)
529
+ row[:default] = nil if blank_object?(row[:default]) || row[:default] == 'NULL'
530
+ row[:db_type] = row.delete(:type)
531
+ if row[:primary_key] = row.delete(:pk).to_i > 0
532
+ pks += 1
533
+ # Guess that an integer primary key uses auto increment,
534
+ # since that is Sequel's default and SQLite does not provide
535
+ # a way to introspect whether it is actually autoincrementing.
536
+ row[:auto_increment] = row[:db_type].downcase == 'integer'
537
+ end
538
+ row[:type] = schema_column_type(row[:db_type])
539
+ row
540
+ end
541
+
542
+ sch.compact!
543
+
544
+ if pks > 1
545
+ # SQLite does not allow use of auto increment for tables
546
+ # with composite primary keys, so remove auto_increment
547
+ # if composite primary keys are detected.
548
+ sch.each{|r| r.delete(:auto_increment)}
549
+ end
550
+
551
+ sch
552
+ end
553
+
554
+ # SQLite supports schema parsing using the table_info PRAGMA, so
555
+ # parse the output of that into the format Sequel expects.
556
+ def schema_parse_table(table_name, opts)
557
+ m = output_identifier_meth(opts[:dataset])
558
+ parse_pragma(table_name, opts).map do |row|
559
+ [m.call(row.delete(:name)), row]
560
+ end
561
+ end
562
+
563
+ # Don't support SQLite error codes for exceptions by default.
564
+ def sqlite_error_code(exception)
565
+ nil
566
+ end
567
+
568
+ # Backbone of the tables and views support.
569
+ def tables_and_views(filter, opts)
570
+ m = output_identifier_meth
571
+ metadata_dataset.from(:sqlite_master).server(opts[:server]).where(filter).map{|r| m.call(r[:name])}
572
+ end
573
+
574
+ # SQLite only supports AUTOINCREMENT on integer columns, not
575
+ # bigint columns, so use integer instead of bigint for those
576
+ # columns.
577
+ def type_literal_generic_bignum_symbol(column)
578
+ column[:auto_increment] ? :integer : super
579
+ end
580
+ end
581
+
582
+ module DatasetMethods
583
+ include Dataset::Replace
584
+ include UnmodifiedIdentifiers::DatasetMethods
585
+
586
+ # The allowed values for insert_conflict
587
+ INSERT_CONFLICT_RESOLUTIONS = %w'ROLLBACK ABORT FAIL IGNORE REPLACE'.each(&:freeze).freeze
588
+
589
+ CONSTANT_MAP = {:CURRENT_DATE=>"date(CURRENT_TIMESTAMP, 'localtime')".freeze, :CURRENT_TIMESTAMP=>"datetime(CURRENT_TIMESTAMP, 'localtime')".freeze, :CURRENT_TIME=>"time(CURRENT_TIMESTAMP, 'localtime')".freeze}.freeze
590
+ EXTRACT_MAP = {:year=>"'%Y'", :month=>"'%m'", :day=>"'%d'", :hour=>"'%H'", :minute=>"'%M'", :second=>"'%f'"}.freeze
591
+ EXTRACT_MAP.each_value(&:freeze)
592
+
593
+ Dataset.def_sql_method(self, :delete, [['if db.sqlite_version >= 33500', %w'with delete from where returning'], ['elsif db.sqlite_version >= 30803', %w'with delete from where'], ["else", %w'delete from where']])
594
+ Dataset.def_sql_method(self, :insert, [['if db.sqlite_version >= 33500', %w'with insert conflict into columns values on_conflict returning'], ['elsif db.sqlite_version >= 30803', %w'with insert conflict into columns values on_conflict'], ["else", %w'insert conflict into columns values']])
595
+ Dataset.def_sql_method(self, :select, [['if opts[:values]', %w'with values compounds'], ['else', %w'with select distinct columns from join where group having window compounds order limit lock']])
596
+ Dataset.def_sql_method(self, :update, [['if db.sqlite_version >= 33500', %w'with update table set from where returning'], ['elsif db.sqlite_version >= 33300', %w'with update table set from where'], ['elsif db.sqlite_version >= 30803', %w'with update table set where'], ["else", %w'update table set where']])
597
+
598
+ def cast_sql_append(sql, expr, type)
599
+ if type == Time or type == DateTime
600
+ sql << "datetime("
601
+ literal_append(sql, expr)
602
+ sql << ')'
603
+ elsif type == Date
604
+ sql << "date("
605
+ literal_append(sql, expr)
606
+ sql << ')'
607
+ else
608
+ super
609
+ end
610
+ end
611
+
612
+ # SQLite doesn't support a NOT LIKE b, you need to use NOT (a LIKE b).
613
+ # It doesn't support xor, power, or the extract function natively, so those have to be emulated.
614
+ def complex_expression_sql_append(sql, op, args)
615
+ case op
616
+ when :"NOT LIKE", :"NOT ILIKE"
617
+ sql << 'NOT '
618
+ complex_expression_sql_append(sql, (op == :"NOT ILIKE" ? :ILIKE : :LIKE), args)
619
+ when :^
620
+ complex_expression_arg_pairs_append(sql, args){|a, b| Sequel.lit(["((~(", " & ", ")) & (", " | ", "))"], a, b, a, b)}
621
+ when :**
622
+ unless (exp = args[1]).is_a?(Integer)
623
+ raise(Sequel::Error, "can only emulate exponentiation on SQLite if exponent is an integer, given #{exp.inspect}")
624
+ end
625
+ case exp
626
+ when 0
627
+ sql << '1'
628
+ else
629
+ sql << '('
630
+ arg = args[0]
631
+ if exp < 0
632
+ invert = true
633
+ exp = exp.abs
634
+ sql << '(1.0 / ('
635
+ end
636
+ (exp - 1).times do
637
+ literal_append(sql, arg)
638
+ sql << " * "
639
+ end
640
+ literal_append(sql, arg)
641
+ sql << ')'
642
+ if invert
643
+ sql << "))"
644
+ end
645
+ end
646
+ when :extract
647
+ part = args[0]
648
+ raise(Sequel::Error, "unsupported extract argument: #{part.inspect}") unless format = EXTRACT_MAP[part]
649
+ sql << "CAST(strftime(" << format << ', '
650
+ literal_append(sql, args[1])
651
+ sql << ') AS ' << (part == :second ? 'NUMERIC' : 'INTEGER') << ')'
652
+ else
653
+ super
654
+ end
655
+ end
656
+
657
+ # SQLite has CURRENT_TIMESTAMP and related constants in UTC instead
658
+ # of in localtime, so convert those constants to local time.
659
+ def constant_sql_append(sql, constant)
660
+ if (c = CONSTANT_MAP[constant]) && !db.current_timestamp_utc
661
+ sql << c
662
+ else
663
+ super
664
+ end
665
+ end
666
+
667
+ # SQLite performs a TRUNCATE style DELETE if no filter is specified.
668
+ # Since we want to always return the count of records, add a condition
669
+ # that is always true and then delete.
670
+ def delete(&block)
671
+ @opts[:where] ? super : where(1=>1).delete(&block)
672
+ end
673
+
674
+ # Always return false when using VALUES
675
+ def empty?
676
+ return false if @opts[:values]
677
+ super
678
+ end
679
+
680
+ # Return an array of strings specifying a query explanation for a SELECT of the
681
+ # current dataset. Currently, the options are ignored, but it accepts options
682
+ # to be compatible with other adapters.
683
+ def explain(opts=nil)
684
+ # Load the PrettyTable class, needed for explain output
685
+ Sequel.extension(:_pretty_table) unless defined?(Sequel::PrettyTable)
686
+
687
+ ds = db.send(:metadata_dataset).clone(:sql=>"EXPLAIN #{select_sql}")
688
+ rows = ds.all
689
+ Sequel::PrettyTable.string(rows, ds.columns)
690
+ end
691
+
692
+ # HAVING requires GROUP BY on SQLite
693
+ def having(*cond)
694
+ raise(InvalidOperation, "Can only specify a HAVING clause on a grouped dataset") if !@opts[:group] && db.sqlite_version < 33900
695
+ super
696
+ end
697
+
698
+ # Support insert select for associations, so that the model code can use
699
+ # returning instead of a separate query.
700
+ def insert_select(*values)
701
+ return unless supports_insert_select?
702
+ # Handle case where query does not return a row
703
+ server?(:default).with_sql_first(insert_select_sql(*values)) || false
704
+ end
705
+
706
+ # The SQL to use for an insert_select, adds a RETURNING clause to the insert
707
+ # unless the RETURNING clause is already present.
708
+ def insert_select_sql(*values)
709
+ ds = opts[:returning] ? self : returning
710
+ ds.insert_sql(*values)
711
+ end
712
+
713
+ # SQLite uses the nonstandard ` (backtick) for quoting identifiers.
714
+ def quoted_identifier_append(sql, c)
715
+ sql << '`' << c.to_s.gsub('`', '``') << '`'
716
+ end
717
+
718
+ # When a qualified column is selected on SQLite and the qualifier
719
+ # is a subselect, the column name used is the full qualified name
720
+ # (including the qualifier) instead of just the column name. To
721
+ # get correct column names, you must use an alias.
722
+ def select(*cols)
723
+ if ((f = @opts[:from]) && f.any?{|t| t.is_a?(Dataset) || (t.is_a?(SQL::AliasedExpression) && t.expression.is_a?(Dataset))}) || ((j = @opts[:join]) && j.any?{|t| t.table.is_a?(Dataset)})
724
+ super(*cols.map{|c| alias_qualified_column(c)})
725
+ else
726
+ super
727
+ end
728
+ end
729
+
730
+ # Handle uniqueness violations when inserting, by using a specified
731
+ # resolution algorithm. With no options, uses INSERT OR REPLACE. SQLite
732
+ # supports the following conflict resolution algoriths: ROLLBACK, ABORT,
733
+ # FAIL, IGNORE and REPLACE.
734
+ #
735
+ # On SQLite 3.24.0+, you can pass a hash to use an ON CONFLICT clause.
736
+ # With out :update option, uses ON CONFLICT DO NOTHING. Options:
737
+ #
738
+ # :conflict_where :: The index filter, when using a partial index to determine uniqueness.
739
+ # :target :: The column name or expression to handle uniqueness violations on.
740
+ # :update :: A hash of columns and values to set. Uses ON CONFLICT DO UPDATE.
741
+ # :update_where :: A WHERE condition to use for the update.
742
+ #
743
+ # Examples:
744
+ #
745
+ # DB[:table].insert_conflict.insert(a: 1, b: 2)
746
+ # # INSERT OR IGNORE INTO TABLE (a, b) VALUES (1, 2)
747
+ #
748
+ # DB[:table].insert_conflict(:replace).insert(a: 1, b: 2)
749
+ # # INSERT OR REPLACE INTO TABLE (a, b) VALUES (1, 2)
750
+ #
751
+ # DB[:table].insert_conflict({}).insert(a: 1, b: 2)
752
+ # # INSERT INTO TABLE (a, b) VALUES (1, 2)
753
+ # # ON CONFLICT DO NOTHING
754
+ #
755
+ # DB[:table].insert_conflict(target: :a).insert(a: 1, b: 2)
756
+ # # INSERT INTO TABLE (a, b) VALUES (1, 2)
757
+ # # ON CONFLICT (a) DO NOTHING
758
+ #
759
+ # DB[:table].insert_conflict(target: :a, conflict_where: {c: true}).insert(a: 1, b: 2)
760
+ # # INSERT INTO TABLE (a, b) VALUES (1, 2)
761
+ # # ON CONFLICT (a) WHERE (c IS TRUE) DO NOTHING
762
+ #
763
+ # DB[:table].insert_conflict(target: :a, update: {b: Sequel[:excluded][:b]}).insert(a: 1, b: 2)
764
+ # # INSERT INTO TABLE (a, b) VALUES (1, 2)
765
+ # # ON CONFLICT (a) DO UPDATE SET b = excluded.b
766
+ #
767
+ # DB[:table].insert_conflict(target: :a,
768
+ # update: {b: Sequel[:excluded][:b]}, update_where: {Sequel[:table][:status_id] => 1}).insert(a: 1, b: 2)
769
+ # # INSERT INTO TABLE (a, b) VALUES (1, 2)
770
+ # # ON CONFLICT (a) DO UPDATE SET b = excluded.b WHERE (table.status_id = 1)
771
+ def insert_conflict(opts = :ignore)
772
+ case opts
773
+ when Symbol, String
774
+ unless INSERT_CONFLICT_RESOLUTIONS.include?(opts.to_s.upcase)
775
+ raise Error, "Invalid symbol or string passed to Dataset#insert_conflict: #{opts.inspect}. The allowed values are: :rollback, :abort, :fail, :ignore, or :replace"
776
+ end
777
+ clone(:insert_conflict => opts)
778
+ when Hash
779
+ clone(:insert_on_conflict => opts)
780
+ else
781
+ raise Error, "Invalid value passed to Dataset#insert_conflict: #{opts.inspect}, should use a symbol or a hash"
782
+ end
783
+ end
784
+
785
+ # Ignore uniqueness/exclusion violations when inserting, using INSERT OR IGNORE.
786
+ # Exists mostly for compatibility to MySQL's insert_ignore. Example:
787
+ #
788
+ # DB[:table].insert_ignore.insert(a: 1, b: 2)
789
+ # # INSERT OR IGNORE INTO TABLE (a, b) VALUES (1, 2)
790
+ def insert_ignore
791
+ insert_conflict(:ignore)
792
+ end
793
+
794
+ # Automatically add aliases to RETURNING values to work around SQLite bug.
795
+ def returning(*values)
796
+ return super if values.empty?
797
+ raise Error, "RETURNING is not supported on #{db.database_type}" unless supports_returning?(:insert)
798
+ clone(:returning=>_returning_values(values).freeze)
799
+ end
800
+
801
+ # SQLite 3.8.3+ supports common table expressions.
802
+ def supports_cte?(type=:select)
803
+ db.sqlite_version >= 30803
804
+ end
805
+
806
+ # SQLite supports CTEs in subqueries if it supports CTEs.
807
+ def supports_cte_in_subqueries?
808
+ supports_cte?
809
+ end
810
+
811
+ # SQLite does not support table aliases with column aliases
812
+ def supports_derived_column_lists?
813
+ false
814
+ end
815
+
816
+ # SQLite does not support deleting from a joined dataset
817
+ def supports_deleting_joins?
818
+ false
819
+ end
820
+
821
+ # SQLite does not support INTERSECT ALL or EXCEPT ALL
822
+ def supports_intersect_except_all?
823
+ false
824
+ end
825
+
826
+ # SQLite does not support IS TRUE
827
+ def supports_is_true?
828
+ false
829
+ end
830
+
831
+ # SQLite 3.33.0 supports modifying joined datasets
832
+ def supports_modifying_joins?
833
+ db.sqlite_version >= 33300
834
+ end
835
+
836
+ # SQLite does not support multiple columns for the IN/NOT IN operators
837
+ def supports_multiple_column_in?
838
+ false
839
+ end
840
+
841
+ # SQLite 3.35.0 supports RETURNING on INSERT/UPDATE/DELETE.
842
+ def supports_returning?(_)
843
+ db.sqlite_version >= 33500
844
+ end
845
+
846
+ # SQLite supports timezones in literal timestamps, since it stores them
847
+ # as text. But using timezones in timestamps breaks SQLite datetime
848
+ # functions, so we allow the user to override the default per database.
849
+ def supports_timestamp_timezones?
850
+ db.use_timestamp_timezones?
851
+ end
852
+
853
+ # SQLite cannot use WHERE 't'.
854
+ def supports_where_true?
855
+ false
856
+ end
857
+
858
+ # SQLite 3.28+ supports the WINDOW clause.
859
+ def supports_window_clause?
860
+ db.sqlite_version >= 32800
861
+ end
862
+
863
+ # SQLite 3.25+ supports window functions. However, support is only enabled
864
+ # on SQLite 3.26.0+ because internal Sequel usage of window functions
865
+ # to implement eager loading of limited associations triggers
866
+ # an SQLite crash bug in versions 3.25.0-3.25.3.
867
+ def supports_window_functions?
868
+ db.sqlite_version >= 32600
869
+ end
870
+
871
+ # SQLite 3.28.0+ supports all window frame options that Sequel supports
872
+ def supports_window_function_frame_option?(option)
873
+ db.sqlite_version >= 32800 ? true : super
874
+ end
875
+
876
+ private
877
+
878
+ # Add aliases to symbols and identifiers to work around SQLite bug.
879
+ def _returning_values(values)
880
+ values.map do |v|
881
+ case v
882
+ when Symbol
883
+ _, c, a = split_symbol(v)
884
+ a ? v : Sequel.as(v, c)
885
+ when SQL::Identifier, SQL::QualifiedIdentifier
886
+ Sequel.as(v, unqualified_column_for(v))
887
+ else
888
+ v
889
+ end
890
+ end
891
+ end
892
+
893
+ # Use from_self for aggregate dataset using VALUES.
894
+ def aggreate_dataset_use_from_self?
895
+ super || @opts[:values]
896
+ end
897
+
898
+ # SQLite uses string literals instead of identifiers in AS clauses.
899
+ def as_sql_append(sql, aliaz, column_aliases=nil)
900
+ raise Error, "sqlite does not support derived column lists" if column_aliases
901
+ aliaz = aliaz.value if aliaz.is_a?(SQL::Identifier)
902
+ sql << ' AS '
903
+ literal_append(sql, aliaz.to_s)
904
+ end
905
+
906
+ # If col is a qualified column, alias it to the same as the column name
907
+ def alias_qualified_column(col)
908
+ case col
909
+ when Symbol
910
+ t, c, a = split_symbol(col)
911
+ if t && !a
912
+ alias_qualified_column(SQL::QualifiedIdentifier.new(t, c))
913
+ else
914
+ col
915
+ end
916
+ when SQL::QualifiedIdentifier
917
+ SQL::AliasedExpression.new(col, col.column)
918
+ else
919
+ col
920
+ end
921
+ end
922
+
923
+ # Raise an InvalidOperation exception if insert is not allowed for this dataset.
924
+ def check_insert_allowed!
925
+ raise(InvalidOperation, "Grouped datasets cannot be modified") if opts[:group]
926
+ raise(InvalidOperation, "Joined datasets cannot be modified") if joined_dataset?
927
+ end
928
+ alias check_delete_allowed! check_insert_allowed!
929
+
930
+ # SQLite supports a maximum of 500 rows in a VALUES clause.
931
+ def default_import_slice
932
+ 500
933
+ end
934
+
935
+ # The strftime format to use when literalizing the time.
936
+ def default_timestamp_format
937
+ db.use_timestamp_timezones? ? "'%Y-%m-%d %H:%M:%S.%6N%z'" : super
938
+ end
939
+
940
+ # SQL fragment specifying a list of identifiers
941
+ def identifier_list(columns)
942
+ columns.map{|i| quote_identifier(i)}.join(', ')
943
+ end
944
+
945
+ # Add OR clauses to SQLite INSERT statements
946
+ def insert_conflict_sql(sql)
947
+ if resolution = @opts[:insert_conflict]
948
+ sql << " OR " << resolution.to_s.upcase
949
+ end
950
+ end
951
+
952
+ # Add ON CONFLICT clause if it should be used
953
+ def insert_on_conflict_sql(sql)
954
+ if opts = @opts[:insert_on_conflict]
955
+ sql << " ON CONFLICT"
956
+
957
+ if target = opts[:constraint]
958
+ sql << " ON CONSTRAINT "
959
+ identifier_append(sql, target)
960
+ elsif target = opts[:target]
961
+ sql << ' '
962
+ identifier_append(sql, Array(target))
963
+ if conflict_where = opts[:conflict_where]
964
+ sql << " WHERE "
965
+ literal_append(sql, conflict_where)
966
+ end
967
+ end
968
+
969
+ if values = opts[:update]
970
+ sql << " DO UPDATE SET "
971
+ update_sql_values_hash(sql, values)
972
+ if update_where = opts[:update_where]
973
+ sql << " WHERE "
974
+ literal_append(sql, update_where)
975
+ end
976
+ else
977
+ sql << " DO NOTHING"
978
+ end
979
+ end
980
+ end
981
+
982
+ # SQLite uses a preceding X for hex escaping strings
983
+ def literal_blob_append(sql, v)
984
+ sql << "X'" << v.unpack("H*").first << "'"
985
+ end
986
+
987
+ # Respect the database integer_booleans setting, using 0 or 'f'.
988
+ def literal_false
989
+ @db.integer_booleans ? '0' : "'f'"
990
+ end
991
+
992
+ # Respect the database integer_booleans setting, using 1 or 't'.
993
+ def literal_true
994
+ @db.integer_booleans ? '1' : "'t'"
995
+ end
996
+
997
+ # SQLite only supporting multiple rows in the VALUES clause
998
+ # starting in 3.7.11. On older versions, fallback to using a UNION.
999
+ def multi_insert_sql_strategy
1000
+ db.sqlite_version >= 30711 ? :values : :union
1001
+ end
1002
+
1003
+ # Emulate the char_length function with length
1004
+ def native_function_name(emulated_function)
1005
+ if emulated_function == :char_length
1006
+ 'length'
1007
+ else
1008
+ super
1009
+ end
1010
+ end
1011
+
1012
+ # SQLite supports NULLS FIRST/LAST natively in 3.30+.
1013
+ def requires_emulating_nulls_first?
1014
+ db.sqlite_version < 33000
1015
+ end
1016
+
1017
+ # SQLite does not support FOR UPDATE, but silently ignore it
1018
+ # instead of raising an error for compatibility with other
1019
+ # databases.
1020
+ def select_lock_sql(sql)
1021
+ super unless @opts[:lock] == :update
1022
+ end
1023
+
1024
+ def select_only_offset_sql(sql)
1025
+ sql << " LIMIT -1 OFFSET "
1026
+ literal_append(sql, @opts[:offset])
1027
+ end
1028
+
1029
+ # Support VALUES clause instead of the SELECT clause to return rows.
1030
+ def select_values_sql(sql)
1031
+ sql << "VALUES "
1032
+ expression_list_append(sql, opts[:values])
1033
+ end
1034
+
1035
+ # SQLite does not support CTEs directly inside UNION/INTERSECT/EXCEPT.
1036
+ def supports_cte_in_compounds?
1037
+ false
1038
+ end
1039
+
1040
+ # SQLite 3.30 supports the FILTER clause for aggregate functions.
1041
+ def supports_filtered_aggregates?
1042
+ db.sqlite_version >= 33000
1043
+ end
1044
+
1045
+ # SQLite supports quoted function names.
1046
+ def supports_quoted_function_names?
1047
+ true
1048
+ end
1049
+
1050
+ # SQLite treats a DELETE with no WHERE clause as a TRUNCATE
1051
+ def _truncate_sql(table)
1052
+ "DELETE FROM #{table}"
1053
+ end
1054
+
1055
+ # Use FROM to specify additional tables in an update query
1056
+ def update_from_sql(sql)
1057
+ if(from = @opts[:from][1..-1]).empty?
1058
+ raise(Error, 'Need multiple FROM tables if updating/deleting a dataset with JOINs') if @opts[:join]
1059
+ else
1060
+ sql << ' FROM '
1061
+ source_list_append(sql, from)
1062
+ select_join_sql(sql)
1063
+ end
1064
+ end
1065
+
1066
+ # Only include the primary table in the main update clause
1067
+ def update_table_sql(sql)
1068
+ sql << ' '
1069
+ source_list_append(sql, @opts[:from][0..0])
1070
+ end
1071
+ end
1072
+ end
1073
+ end