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