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,1238 @@
|
|
|
1
|
+
# frozen-string-literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../utils/emulate_offset_with_row_number'
|
|
4
|
+
require_relative '../utils/split_alter_table'
|
|
5
|
+
|
|
6
|
+
module Sequel
|
|
7
|
+
module MSSQL
|
|
8
|
+
Sequel::Database.set_shared_adapter_scheme(:mssql, self)
|
|
9
|
+
|
|
10
|
+
def self.mock_adapter_setup(db)
|
|
11
|
+
db.instance_exec do
|
|
12
|
+
@server_version = 11000000
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
module DatabaseMethods
|
|
17
|
+
FOREIGN_KEY_ACTION_MAP = {0 => :no_action, 1 => :cascade, 2 => :set_null, 3 => :set_default}.freeze
|
|
18
|
+
|
|
19
|
+
include Sequel::Database::SplitAlterTable
|
|
20
|
+
|
|
21
|
+
# Whether to use N'' to quote strings, which allows unicode characters inside the
|
|
22
|
+
# strings. True by default for compatibility, can be set to false for a possible
|
|
23
|
+
# performance increase. This sets the default for all datasets created from this
|
|
24
|
+
# Database object.
|
|
25
|
+
attr_accessor :mssql_unicode_strings
|
|
26
|
+
|
|
27
|
+
# Whether to use LIKE without COLLATE Latin1_General_CS_AS. Skipping the COLLATE
|
|
28
|
+
# can significantly increase performance in some cases.
|
|
29
|
+
attr_accessor :like_without_collate
|
|
30
|
+
|
|
31
|
+
# Execute the given stored procedure with the given name.
|
|
32
|
+
#
|
|
33
|
+
# Options:
|
|
34
|
+
# :args :: Arguments to stored procedure. For named arguments, this should be a
|
|
35
|
+
# hash keyed by argument name. For unnamed arguments, this should be an
|
|
36
|
+
# array. Output parameters to the function are specified using :output.
|
|
37
|
+
# You can also name output parameters and provide a type by using an
|
|
38
|
+
# array containing :output, the type name, and the parameter name.
|
|
39
|
+
# :server :: The server/shard on which to execute the procedure.
|
|
40
|
+
#
|
|
41
|
+
# This method returns a single hash with the following keys:
|
|
42
|
+
#
|
|
43
|
+
# :result :: The result code of the stored procedure
|
|
44
|
+
# :numrows :: The number of rows affected by the stored procedure
|
|
45
|
+
# output params :: Values for any output paramters, using the name given for the output parameter
|
|
46
|
+
#
|
|
47
|
+
# Because Sequel datasets only support a single result set per query, and retrieving
|
|
48
|
+
# the result code and number of rows requires a query, this does not support
|
|
49
|
+
# stored procedures which also return result sets. To handle such stored procedures,
|
|
50
|
+
# you should drop down to the connection/driver level by using Sequel::Database#synchronize
|
|
51
|
+
# to get access to the underlying connection object.
|
|
52
|
+
#
|
|
53
|
+
# Examples:
|
|
54
|
+
#
|
|
55
|
+
# DB.call_mssql_sproc(:SequelTest, {args: ['input arg', :output]})
|
|
56
|
+
# DB.call_mssql_sproc(:SequelTest, {args: ['input arg', [:output, 'int', 'varname']]})
|
|
57
|
+
#
|
|
58
|
+
# named params:
|
|
59
|
+
# DB.call_mssql_sproc(:SequelTest, args: {
|
|
60
|
+
# 'input_arg1_name' => 'input arg1 value',
|
|
61
|
+
# 'input_arg2_name' => 'input arg2 value',
|
|
62
|
+
# 'output_arg_name' => [:output, 'int', 'varname']
|
|
63
|
+
# })
|
|
64
|
+
def call_mssql_sproc(name, opts=OPTS)
|
|
65
|
+
args = opts[:args] || []
|
|
66
|
+
names = ['@RC AS RESULT', '@@ROWCOUNT AS NUMROWS']
|
|
67
|
+
declarations = ['@RC int']
|
|
68
|
+
values = []
|
|
69
|
+
|
|
70
|
+
if args.is_a?(Hash)
|
|
71
|
+
named_args = true
|
|
72
|
+
args = args.to_a
|
|
73
|
+
method = :each
|
|
74
|
+
else
|
|
75
|
+
method = :each_with_index
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
args.public_send(method) do |v, i|
|
|
79
|
+
if named_args
|
|
80
|
+
k = v
|
|
81
|
+
v, type, select = i
|
|
82
|
+
raise Error, "must provide output parameter name when using output parameters with named arguments" if v == :output && !select
|
|
83
|
+
else
|
|
84
|
+
v, type, select = v
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
if v == :output
|
|
88
|
+
type ||= "nvarchar(max)"
|
|
89
|
+
if named_args
|
|
90
|
+
varname = select
|
|
91
|
+
else
|
|
92
|
+
varname = "var#{i}"
|
|
93
|
+
select ||= varname
|
|
94
|
+
end
|
|
95
|
+
names << "@#{varname} AS #{quote_identifier(select)}"
|
|
96
|
+
declarations << "@#{varname} #{type}"
|
|
97
|
+
value = "@#{varname} OUTPUT"
|
|
98
|
+
else
|
|
99
|
+
value = literal(v)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
if named_args
|
|
103
|
+
value = "@#{k}=#{value}"
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
values << value
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
sql = "DECLARE #{declarations.join(', ')}; EXECUTE @RC = #{name} #{values.join(', ')}; SELECT #{names.join(', ')}"
|
|
110
|
+
|
|
111
|
+
ds = dataset.with_sql(sql)
|
|
112
|
+
ds = ds.server(opts[:server]) if opts[:server]
|
|
113
|
+
ds.first
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def database_type
|
|
117
|
+
:mssql
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Microsoft SQL Server namespaces indexes per table.
|
|
121
|
+
def global_index_namespace?
|
|
122
|
+
false
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Return foreign key information using the system views, including
|
|
126
|
+
# :name, :on_delete, and :on_update entries in the hashes.
|
|
127
|
+
def foreign_key_list(table, opts=OPTS)
|
|
128
|
+
m = output_identifier_meth
|
|
129
|
+
im = input_identifier_meth
|
|
130
|
+
schema, table = schema_and_table(table)
|
|
131
|
+
current_schema = m.call(get(Sequel.function('schema_name')))
|
|
132
|
+
fk_action_map = FOREIGN_KEY_ACTION_MAP
|
|
133
|
+
fk = Sequel[:fk]
|
|
134
|
+
fkc = Sequel[:fkc]
|
|
135
|
+
ds = metadata_dataset.from(Sequel.lit('[sys].[foreign_keys]').as(:fk)).
|
|
136
|
+
join(Sequel.lit('[sys].[foreign_key_columns]').as(:fkc), :constraint_object_id => :object_id).
|
|
137
|
+
join(Sequel.lit('[sys].[all_columns]').as(:pc), :object_id => fkc[:parent_object_id], :column_id => fkc[:parent_column_id]).
|
|
138
|
+
join(Sequel.lit('[sys].[all_columns]').as(:rc), :object_id => fkc[:referenced_object_id], :column_id => fkc[:referenced_column_id]).
|
|
139
|
+
where{{object_schema_name(fk[:parent_object_id]) => im.call(schema || current_schema)}}.
|
|
140
|
+
where{{object_name(fk[:parent_object_id]) => im.call(table)}}.
|
|
141
|
+
select{[fk[:name],
|
|
142
|
+
fk[:delete_referential_action],
|
|
143
|
+
fk[:update_referential_action],
|
|
144
|
+
pc[:name].as(:column),
|
|
145
|
+
rc[:name].as(:referenced_column),
|
|
146
|
+
object_schema_name(fk[:referenced_object_id]).as(:schema),
|
|
147
|
+
object_name(fk[:referenced_object_id]).as(:table)]}.
|
|
148
|
+
order(fk[:name], fkc[:constraint_column_id])
|
|
149
|
+
h = {}
|
|
150
|
+
ds.each do |row|
|
|
151
|
+
if r = h[row[:name]]
|
|
152
|
+
r[:columns] << m.call(row[:column])
|
|
153
|
+
r[:key] << m.call(row[:referenced_column])
|
|
154
|
+
else
|
|
155
|
+
referenced_schema = m.call(row[:schema])
|
|
156
|
+
referenced_table = m.call(row[:table])
|
|
157
|
+
h[row[:name]] = { :name => m.call(row[:name]),
|
|
158
|
+
:table => (referenced_schema == current_schema) ? referenced_table : Sequel.qualify(referenced_schema, referenced_table),
|
|
159
|
+
:columns => [m.call(row[:column])],
|
|
160
|
+
:key => [m.call(row[:referenced_column])],
|
|
161
|
+
:on_update => fk_action_map[row[:update_referential_action]],
|
|
162
|
+
:on_delete => fk_action_map[row[:delete_referential_action]] }
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
h.values
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def freeze
|
|
169
|
+
server_version
|
|
170
|
+
super
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
# Use the system tables to get index information
|
|
174
|
+
def indexes(table, opts=OPTS)
|
|
175
|
+
m = output_identifier_meth
|
|
176
|
+
im = input_identifier_meth
|
|
177
|
+
indexes = {}
|
|
178
|
+
table = table.value if table.is_a?(Sequel::SQL::Identifier)
|
|
179
|
+
i = Sequel[:i]
|
|
180
|
+
ds = metadata_dataset.from(Sequel.lit('[sys].[tables]').as(:t)).
|
|
181
|
+
join(Sequel.lit('[sys].[indexes]').as(:i), :object_id=>:object_id).
|
|
182
|
+
join(Sequel.lit('[sys].[index_columns]').as(:ic), :object_id=>:object_id, :index_id=>:index_id).
|
|
183
|
+
join(Sequel.lit('[sys].[columns]').as(:c), :object_id=>:object_id, :column_id=>:column_id).
|
|
184
|
+
select(i[:name], i[:is_unique], Sequel[:c][:name].as(:column)).
|
|
185
|
+
where{{t[:name]=>im.call(table)}}.
|
|
186
|
+
where(i[:is_primary_key]=>0, i[:is_disabled]=>0).
|
|
187
|
+
order(i[:name], Sequel[:ic][:index_column_id])
|
|
188
|
+
|
|
189
|
+
if supports_partial_indexes?
|
|
190
|
+
ds = ds.where(i[:has_filter]=>0)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
ds.each do |r|
|
|
194
|
+
index = indexes[m.call(r[:name])] ||= {:columns=>[], :unique=>(r[:is_unique] && r[:is_unique]!=0)}
|
|
195
|
+
index[:columns] << m.call(r[:column])
|
|
196
|
+
end
|
|
197
|
+
indexes
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# The version of the MSSQL server, as an integer (e.g. 10001600 for
|
|
201
|
+
# SQL Server 2008 Express).
|
|
202
|
+
def server_version(server=nil)
|
|
203
|
+
return @server_version if @server_version
|
|
204
|
+
if @opts[:server_version]
|
|
205
|
+
return @server_version = Integer(@opts[:server_version])
|
|
206
|
+
end
|
|
207
|
+
@server_version = synchronize(server) do |conn|
|
|
208
|
+
(conn.server_version rescue nil) if conn.respond_to?(:server_version)
|
|
209
|
+
end
|
|
210
|
+
unless @server_version
|
|
211
|
+
m = /^(\d+)\.(\d+)\.(\d+)/.match(fetch("SELECT CAST(SERVERPROPERTY('ProductVersion') AS varchar)").single_value.to_s)
|
|
212
|
+
@server_version = (m[1].to_i * 1000000) + (m[2].to_i * 10000) + m[3].to_i
|
|
213
|
+
end
|
|
214
|
+
@server_version
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
# MSSQL 2008+ supports partial indexes.
|
|
218
|
+
def supports_partial_indexes?
|
|
219
|
+
dataset.send(:is_2008_or_later?)
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
# MSSQL supports savepoints, though it doesn't support releasing them
|
|
223
|
+
def supports_savepoints?
|
|
224
|
+
true
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
# MSSQL supports transaction isolation levels
|
|
228
|
+
def supports_transaction_isolation_levels?
|
|
229
|
+
true
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
# MSSQL supports transaction DDL statements.
|
|
233
|
+
def supports_transactional_ddl?
|
|
234
|
+
true
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
# Microsoft SQL Server supports using the INFORMATION_SCHEMA to get
|
|
238
|
+
# information on tables.
|
|
239
|
+
def tables(opts=OPTS)
|
|
240
|
+
information_schema_tables('BASE TABLE', opts)
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
# Microsoft SQL Server supports using the INFORMATION_SCHEMA to get
|
|
244
|
+
# information on views.
|
|
245
|
+
def views(opts=OPTS)
|
|
246
|
+
information_schema_tables('VIEW', opts)
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
# Attempt to acquire an exclusive advisory lock with the given lock_id (which will
|
|
250
|
+
# be converted to a string). If successful, yield to the block, then release the advisory lock
|
|
251
|
+
# when the block exits. If unsuccessful, raise a Sequel::AdvisoryLockError.
|
|
252
|
+
#
|
|
253
|
+
# Options:
|
|
254
|
+
# :wait :: Do not raise an error, instead, wait until the advisory lock can be acquired.
|
|
255
|
+
def with_advisory_lock(lock_id, opts=OPTS)
|
|
256
|
+
lock_id = lock_id.to_s
|
|
257
|
+
timeout = opts[:wait] ? -1 : 0
|
|
258
|
+
server = opts[:server]
|
|
259
|
+
|
|
260
|
+
synchronize(server) do
|
|
261
|
+
begin
|
|
262
|
+
res = call_mssql_sproc(:sp_getapplock, :server=>server, :args=>{'Resource'=>lock_id, 'LockTimeout'=>timeout, 'LockMode'=>'Exclusive', 'LockOwner'=>'Session'})
|
|
263
|
+
|
|
264
|
+
unless locked = res[:result] >= 0
|
|
265
|
+
raise AdvisoryLockError, "unable to acquire advisory lock #{lock_id.inspect}"
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
yield
|
|
269
|
+
ensure
|
|
270
|
+
if locked
|
|
271
|
+
call_mssql_sproc(:sp_releaseapplock, :server=>server, :args=>{'Resource'=>lock_id, 'LockOwner'=>'Session'})
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
private
|
|
278
|
+
|
|
279
|
+
# Add CLUSTERED or NONCLUSTERED as needed
|
|
280
|
+
def add_clustered_sql_fragment(sql, opts)
|
|
281
|
+
clustered = opts[:clustered]
|
|
282
|
+
unless clustered.nil?
|
|
283
|
+
sql += " #{'NON' unless clustered}CLUSTERED"
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
sql
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
# Add dropping of the default constraint to the list of SQL queries.
|
|
290
|
+
# This is necessary before dropping the column or changing its type.
|
|
291
|
+
def add_drop_default_constraint_sql(sqls, table, column)
|
|
292
|
+
if constraint = default_constraint_name(table, column)
|
|
293
|
+
sqls << "ALTER TABLE #{quote_schema_table(table)} DROP CONSTRAINT #{constraint}"
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
# MSSQL uses the IDENTITY(1,1) column for autoincrementing columns.
|
|
298
|
+
def auto_increment_sql
|
|
299
|
+
'IDENTITY(1,1)'
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
def alter_table_sql(table, op)
|
|
303
|
+
case op[:op]
|
|
304
|
+
when :add_column
|
|
305
|
+
"ALTER TABLE #{quote_schema_table(table)} ADD #{column_definition_sql(op)}"
|
|
306
|
+
when :drop_column
|
|
307
|
+
sqls = []
|
|
308
|
+
add_drop_default_constraint_sql(sqls, table, op[:name])
|
|
309
|
+
sqls << super
|
|
310
|
+
when :rename_column
|
|
311
|
+
"sp_rename #{literal("#{quote_schema_table(table)}.#{quote_identifier(op[:name])}")}, #{literal(metadata_dataset.with_quote_identifiers(false).quote_identifier(op[:new_name]))}, 'COLUMN'"
|
|
312
|
+
when :set_column_type
|
|
313
|
+
sqls = []
|
|
314
|
+
if sch = schema(table)
|
|
315
|
+
if cs = sch.each{|k, v| break v if k == op[:name]; nil}
|
|
316
|
+
cs = cs.dup
|
|
317
|
+
add_drop_default_constraint_sql(sqls, table, op[:name])
|
|
318
|
+
cs[:default] = cs[:ruby_default]
|
|
319
|
+
op = cs.merge!(op)
|
|
320
|
+
default = op.delete(:default)
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
sqls << "ALTER TABLE #{quote_schema_table(table)} ALTER COLUMN #{column_definition_sql(op)}"
|
|
324
|
+
sqls << alter_table_sql(table, op.merge(:op=>:set_column_default, :default=>default, :skip_drop_default=>true)) if default
|
|
325
|
+
sqls
|
|
326
|
+
when :set_column_null
|
|
327
|
+
sch = schema(table).find{|k,v| k.to_s == op[:name].to_s}.last
|
|
328
|
+
type = sch[:db_type]
|
|
329
|
+
if [:string, :decimal, :blob].include?(sch[:type]) && !["text", "ntext"].include?(type) && (size = (sch[:max_chars] || sch[:column_size]))
|
|
330
|
+
size = "MAX" if size == -1
|
|
331
|
+
type += "(#{size}#{", #{sch[:scale]}" if sch[:scale] && sch[:scale].to_i > 0})"
|
|
332
|
+
end
|
|
333
|
+
"ALTER TABLE #{quote_schema_table(table)} ALTER COLUMN #{quote_identifier(op[:name])} #{type_literal(:type=>type)} #{'NOT ' unless op[:null]}NULL"
|
|
334
|
+
when :set_column_default
|
|
335
|
+
sqls = []
|
|
336
|
+
add_drop_default_constraint_sql(sqls, table, op[:name]) unless op[:skip_drop_default]
|
|
337
|
+
sqls << "ALTER TABLE #{quote_schema_table(table)} ADD CONSTRAINT #{quote_identifier("sequel_#{table}_#{op[:name]}_def")} DEFAULT #{literal(op[:default])} FOR #{quote_identifier(op[:name])}"
|
|
338
|
+
else
|
|
339
|
+
super(table, op)
|
|
340
|
+
end
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
def begin_savepoint_sql(depth)
|
|
344
|
+
"SAVE TRANSACTION autopoint_#{depth}"
|
|
345
|
+
end
|
|
346
|
+
|
|
347
|
+
def begin_transaction_sql
|
|
348
|
+
"BEGIN TRANSACTION"
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
# MSSQL does not allow adding primary key constraints to NULLable columns.
|
|
352
|
+
def can_add_primary_key_constraint_on_nullable_columns?
|
|
353
|
+
false
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
# MSSQL tinyint types are unsigned.
|
|
357
|
+
def column_schema_tinyint_type_is_unsigned?
|
|
358
|
+
true
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
# Handle MSSQL specific default format.
|
|
362
|
+
def column_schema_normalize_default(default, type)
|
|
363
|
+
if m = /\A(?:\(N?('.*')\)|\(\((-?\d+(?:\.\d+)?)\)\))\z/.match(default)
|
|
364
|
+
default = m[1] || m[2]
|
|
365
|
+
end
|
|
366
|
+
super(default, type)
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
# Commit the active transaction on the connection, does not release savepoints.
|
|
370
|
+
def commit_transaction(conn, opts=OPTS)
|
|
371
|
+
log_connection_execute(conn, commit_transaction_sql) unless savepoint_level(conn) > 1
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
def commit_transaction_sql
|
|
375
|
+
"COMMIT TRANSACTION"
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
# MSSQL uses the name of the table to decide the difference between
|
|
379
|
+
# a regular and temporary table, with temporary table names starting with
|
|
380
|
+
# a #.
|
|
381
|
+
def create_table_prefix_sql(name, options)
|
|
382
|
+
"CREATE TABLE #{create_table_table_name_sql(name, options)}"
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
# The SQL to use for the table name for a temporary table.
|
|
386
|
+
def create_table_temp_table_name_sql(name, _options)
|
|
387
|
+
case name
|
|
388
|
+
when String, Symbol
|
|
389
|
+
"##{name}"
|
|
390
|
+
when SQL::Identifier
|
|
391
|
+
"##{name.value}"
|
|
392
|
+
else
|
|
393
|
+
raise Error, "temporary table names must be strings, symbols, or Sequel::SQL::Identifier instances on Microsoft SQL Server"
|
|
394
|
+
end
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
# MSSQL doesn't support CREATE TABLE AS, it only supports SELECT INTO.
|
|
398
|
+
# Emulating CREATE TABLE AS using SELECT INTO is only possible if a dataset
|
|
399
|
+
# is given as the argument, it can't work with a string, so raise an
|
|
400
|
+
# Error if a string is given.
|
|
401
|
+
def create_table_as(name, ds, options)
|
|
402
|
+
raise(Error, "must provide dataset instance as value of create_table :as option on MSSQL") unless ds.is_a?(Sequel::Dataset)
|
|
403
|
+
run(ds.into(name).sql)
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
DATABASE_ERROR_REGEXPS = {
|
|
407
|
+
/Violation of UNIQUE KEY constraint|(Violation of PRIMARY KEY constraint.+)?Cannot insert duplicate key/ => UniqueConstraintViolation,
|
|
408
|
+
/conflicted with the (FOREIGN KEY.*|REFERENCE) constraint/ => ForeignKeyConstraintViolation,
|
|
409
|
+
/conflicted with the CHECK constraint/ => CheckConstraintViolation,
|
|
410
|
+
/column does not allow nulls/ => NotNullConstraintViolation,
|
|
411
|
+
/was deadlocked on lock resources with another process and has been chosen as the deadlock victim/ => SerializationFailure,
|
|
412
|
+
/Lock request time out period exceeded\./ => DatabaseLockTimeout,
|
|
413
|
+
}.freeze
|
|
414
|
+
def database_error_regexps
|
|
415
|
+
DATABASE_ERROR_REGEXPS
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
# The name of the constraint for setting the default value on the table and column.
|
|
419
|
+
# The SQL used to select default constraints utilizes MSSQL catalog views which were introduced in 2005.
|
|
420
|
+
# This method intentionally does not support MSSQL 2000.
|
|
421
|
+
def default_constraint_name(table, column_name)
|
|
422
|
+
if server_version >= 9000000
|
|
423
|
+
table_name = schema_and_table(table).compact.join('.')
|
|
424
|
+
self[Sequel[:sys][:default_constraints]].
|
|
425
|
+
where{{:parent_object_id => Sequel::SQL::Function.new(:object_id, table_name), col_name(:parent_object_id, :parent_column_id) => column_name.to_s}}.
|
|
426
|
+
get(:name)
|
|
427
|
+
end
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
def drop_index_sql(table, op)
|
|
431
|
+
"DROP INDEX #{quote_identifier(op[:name] || default_index_name(table, op[:columns]))} ON #{quote_schema_table(table)}"
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
def index_definition_sql(table_name, index)
|
|
435
|
+
index_name = index[:name] || default_index_name(table_name, index[:columns])
|
|
436
|
+
raise Error, "Partial indexes are not supported for this database" if index[:where] && !supports_partial_indexes?
|
|
437
|
+
if index[:type] == :full_text
|
|
438
|
+
"CREATE FULLTEXT INDEX ON #{quote_schema_table(table_name)} #{literal(index[:columns])} KEY INDEX #{literal(index[:key_index])}"
|
|
439
|
+
else
|
|
440
|
+
"CREATE #{'UNIQUE ' if index[:unique]}#{'CLUSTERED ' if index[:type] == :clustered}INDEX #{quote_identifier(index_name)} ON #{quote_schema_table(table_name)} #{literal(index[:columns])}#{" INCLUDE #{literal(index[:include])}" if index[:include]}#{" WHERE #{filter_expr(index[:where])}" if index[:where]}"
|
|
441
|
+
end
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
# Backbone of the tables and views support.
|
|
445
|
+
def information_schema_tables(type, opts)
|
|
446
|
+
m = output_identifier_meth
|
|
447
|
+
schema = opts[:schema]||'dbo'
|
|
448
|
+
tables = metadata_dataset.from(Sequel[:information_schema][:tables].as(:t)).
|
|
449
|
+
select(:table_name).
|
|
450
|
+
where(:table_type=>type, :table_schema=>schema.to_s).
|
|
451
|
+
map{|x| m.call(x[:table_name])}
|
|
452
|
+
|
|
453
|
+
tables.map!{|t| Sequel.qualify(m.call(schema).to_s, m.call(t).to_s)} if opts[:qualify]
|
|
454
|
+
|
|
455
|
+
tables
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
# Always quote identifiers in the metadata_dataset, so schema parsing works.
|
|
459
|
+
def _metadata_dataset
|
|
460
|
+
super.with_quote_identifiers(true)
|
|
461
|
+
end
|
|
462
|
+
|
|
463
|
+
# Handle clustered and nonclustered primary keys
|
|
464
|
+
def primary_key_constraint_sql_fragment(opts)
|
|
465
|
+
add_clustered_sql_fragment(super, opts)
|
|
466
|
+
end
|
|
467
|
+
|
|
468
|
+
# Use sp_rename to rename the table
|
|
469
|
+
def rename_table_sql(name, new_name)
|
|
470
|
+
"sp_rename #{literal(quote_schema_table(name))}, #{quote_identifier(schema_and_table(new_name).pop)}"
|
|
471
|
+
end
|
|
472
|
+
|
|
473
|
+
def rollback_savepoint_sql(depth)
|
|
474
|
+
"IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION autopoint_#{depth}"
|
|
475
|
+
end
|
|
476
|
+
|
|
477
|
+
def rollback_transaction_sql
|
|
478
|
+
"IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION"
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
def schema_column_type(db_type)
|
|
482
|
+
case db_type
|
|
483
|
+
when /\A(?:bit)\z/i
|
|
484
|
+
:boolean
|
|
485
|
+
when /\A(?:(?:small)?money)\z/i
|
|
486
|
+
:decimal
|
|
487
|
+
when /\A(timestamp|rowversion)\z/i
|
|
488
|
+
:blob
|
|
489
|
+
else
|
|
490
|
+
super
|
|
491
|
+
end
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
# MSSQL uses the INFORMATION_SCHEMA to hold column information, and
|
|
495
|
+
# parses primary key information from the sysindexes, sysindexkeys,
|
|
496
|
+
# and syscolumns system tables.
|
|
497
|
+
def schema_parse_table(table_name, opts)
|
|
498
|
+
m = output_identifier_meth(opts[:dataset])
|
|
499
|
+
m2 = input_identifier_meth(opts[:dataset])
|
|
500
|
+
tn = m2.call(table_name.to_s)
|
|
501
|
+
info_sch_sch = opts[:information_schema_schema]
|
|
502
|
+
inf_sch_qual = lambda{|s| info_sch_sch ? Sequel.qualify(info_sch_sch, s) : Sequel[s]}
|
|
503
|
+
table_id = metadata_dataset.from(inf_sch_qual.call(Sequel[:sys][:objects])).where(:name => tn).select_map(:object_id).first
|
|
504
|
+
|
|
505
|
+
identity_cols = metadata_dataset.from(inf_sch_qual.call(Sequel[:sys][:columns])).
|
|
506
|
+
where(:object_id=>table_id, :is_identity=>true).
|
|
507
|
+
select_map(:name)
|
|
508
|
+
|
|
509
|
+
pk_index_id = metadata_dataset.from(inf_sch_qual.call(Sequel[:sys][:sysindexes])).
|
|
510
|
+
where(:id=>table_id, :indid=>1..254){{(status & 2048)=>2048}}.
|
|
511
|
+
get(:indid)
|
|
512
|
+
pk_cols = metadata_dataset.from(inf_sch_qual.call(Sequel[:sys][:sysindexkeys]).as(:sik)).
|
|
513
|
+
join(inf_sch_qual.call(Sequel[:sys][:syscolumns]).as(:sc), :id=>:id, :colid=>:colid).
|
|
514
|
+
where{{sik[:id]=>table_id, sik[:indid]=>pk_index_id}}.
|
|
515
|
+
select_order_map{sc[:name]}
|
|
516
|
+
|
|
517
|
+
ds = metadata_dataset.from(inf_sch_qual.call(Sequel[:information_schema][:tables]).as(:t)).
|
|
518
|
+
join(inf_sch_qual.call(Sequel[:information_schema][:columns]).as(:c), :table_catalog=>:table_catalog,
|
|
519
|
+
:table_schema => :table_schema, :table_name => :table_name).
|
|
520
|
+
select{[column_name.as(:column), data_type.as(:db_type), character_maximum_length.as(:max_chars), column_default.as(:default), is_nullable.as(:allow_null), numeric_precision.as(:column_size), numeric_scale.as(:scale)]}.
|
|
521
|
+
where{{c[:table_name]=>tn}}
|
|
522
|
+
|
|
523
|
+
if schema = opts[:schema]
|
|
524
|
+
ds = ds.where{{c[:table_schema]=>schema}}
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
ds.map do |row|
|
|
528
|
+
if row[:primary_key] = pk_cols.include?(row[:column])
|
|
529
|
+
row[:auto_increment] = identity_cols.include?(row[:column])
|
|
530
|
+
end
|
|
531
|
+
row[:allow_null] = row[:allow_null] == 'YES' ? true : false
|
|
532
|
+
row[:default] = nil if blank_object?(row[:default])
|
|
533
|
+
row[:type] = if row[:db_type] =~ /number|numeric|decimal/i && row[:scale] == 0
|
|
534
|
+
:integer
|
|
535
|
+
else
|
|
536
|
+
schema_column_type(row[:db_type])
|
|
537
|
+
end
|
|
538
|
+
row[:max_length] = row[:max_chars] if row[:type] == :string && row[:max_chars] >= 0
|
|
539
|
+
[m.call(row.delete(:column)), row]
|
|
540
|
+
end
|
|
541
|
+
end
|
|
542
|
+
|
|
543
|
+
# Set the mssql_unicode_strings settings from the given options.
|
|
544
|
+
def set_mssql_unicode_strings
|
|
545
|
+
@mssql_unicode_strings = typecast_value_boolean(@opts.fetch(:mssql_unicode_strings, true))
|
|
546
|
+
end
|
|
547
|
+
|
|
548
|
+
# MSSQL has both datetime and timestamp classes, most people are going
|
|
549
|
+
# to want datetime
|
|
550
|
+
def type_literal_generic_datetime(column)
|
|
551
|
+
:datetime
|
|
552
|
+
end
|
|
553
|
+
|
|
554
|
+
# MSSQL doesn't have a true boolean class, so it uses bit
|
|
555
|
+
def type_literal_generic_trueclass(column)
|
|
556
|
+
:bit
|
|
557
|
+
end
|
|
558
|
+
|
|
559
|
+
# MSSQL uses varbinary(max) type for blobs
|
|
560
|
+
def type_literal_generic_file(column)
|
|
561
|
+
:'varbinary(max)'
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
# Handle clustered and nonclustered unique constraints
|
|
565
|
+
def unique_constraint_sql_fragment(opts)
|
|
566
|
+
add_clustered_sql_fragment(super, opts)
|
|
567
|
+
end
|
|
568
|
+
|
|
569
|
+
# MSSQL supports views with check option, but not local.
|
|
570
|
+
def view_with_check_option_support
|
|
571
|
+
true
|
|
572
|
+
end
|
|
573
|
+
end
|
|
574
|
+
|
|
575
|
+
module DatasetMethods
|
|
576
|
+
include(Module.new do
|
|
577
|
+
Sequel.set_temp_name(self){"Sequel::MSSQL::DatasetMethods::_SQLMethods"}
|
|
578
|
+
Dataset.def_sql_method(self, :select, %w'with select distinct limit columns into from lock join where group having compounds order')
|
|
579
|
+
end)
|
|
580
|
+
include EmulateOffsetWithRowNumber
|
|
581
|
+
|
|
582
|
+
CONSTANT_MAP = {:CURRENT_DATE=>'CAST(CURRENT_TIMESTAMP AS DATE)'.freeze, :CURRENT_TIME=>'CAST(CURRENT_TIMESTAMP AS TIME)'.freeze}.freeze
|
|
583
|
+
EXTRACT_MAP = {:year=>"yy", :month=>"m", :day=>"d", :hour=>"hh", :minute=>"n", :second=>"s"}.freeze
|
|
584
|
+
EXTRACT_MAP.each_value(&:freeze)
|
|
585
|
+
LIMIT_ALL = Object.new.freeze
|
|
586
|
+
|
|
587
|
+
Dataset.def_sql_method(self, :delete, %w'with delete limit from output from2 where')
|
|
588
|
+
Dataset.def_sql_method(self, :insert, %w'with insert into columns output values')
|
|
589
|
+
Dataset.def_sql_method(self, :update, [['if is_2005_or_later?', %w'with update limit table set output from where'], ['else', %w'update table set output from where']])
|
|
590
|
+
|
|
591
|
+
# Use the database's mssql_unicode_strings setting if the dataset hasn't overridden it.
|
|
592
|
+
def mssql_unicode_strings
|
|
593
|
+
opts.has_key?(:mssql_unicode_strings) ? opts[:mssql_unicode_strings] : db.mssql_unicode_strings
|
|
594
|
+
end
|
|
595
|
+
|
|
596
|
+
# Return a cloned dataset with the mssql_unicode_strings option set.
|
|
597
|
+
def with_mssql_unicode_strings(v)
|
|
598
|
+
clone(:mssql_unicode_strings=>v)
|
|
599
|
+
end
|
|
600
|
+
|
|
601
|
+
def complex_expression_sql_append(sql, op, args)
|
|
602
|
+
case op
|
|
603
|
+
when :'||'
|
|
604
|
+
super(sql, :+, args)
|
|
605
|
+
when :LIKE, :"NOT LIKE"
|
|
606
|
+
super(sql, op, complex_expression_sql_like_args(args, " COLLATE Latin1_General_CS_AS)"))
|
|
607
|
+
when :ILIKE, :"NOT ILIKE"
|
|
608
|
+
super(sql, (op == :ILIKE ? :LIKE : :"NOT LIKE"), complex_expression_sql_like_args(args, " COLLATE Latin1_General_CI_AS)"))
|
|
609
|
+
when :<<, :>>
|
|
610
|
+
complex_expression_emulate_append(sql, op, args)
|
|
611
|
+
when :extract
|
|
612
|
+
part = args[0]
|
|
613
|
+
raise(Sequel::Error, "unsupported extract argument: #{part.inspect}") unless format = EXTRACT_MAP[part]
|
|
614
|
+
if part == :second
|
|
615
|
+
expr = args[1]
|
|
616
|
+
sql << "CAST((datepart(" << format.to_s << ', '
|
|
617
|
+
literal_append(sql, expr)
|
|
618
|
+
sql << ') + datepart(ns, '
|
|
619
|
+
literal_append(sql, expr)
|
|
620
|
+
sql << ")/1000000000.0) AS double precision)"
|
|
621
|
+
else
|
|
622
|
+
sql << "datepart(" << format.to_s << ', '
|
|
623
|
+
literal_append(sql, args[1])
|
|
624
|
+
sql << ')'
|
|
625
|
+
end
|
|
626
|
+
else
|
|
627
|
+
super
|
|
628
|
+
end
|
|
629
|
+
end
|
|
630
|
+
|
|
631
|
+
# MSSQL doesn't support the SQL standard CURRENT_DATE or CURRENT_TIME
|
|
632
|
+
def constant_sql_append(sql, constant)
|
|
633
|
+
if c = CONSTANT_MAP[constant]
|
|
634
|
+
sql << c
|
|
635
|
+
else
|
|
636
|
+
super
|
|
637
|
+
end
|
|
638
|
+
end
|
|
639
|
+
|
|
640
|
+
# For a dataset with custom SQL, since it may include ORDER BY, you
|
|
641
|
+
# cannot wrap it in a subquery. Load entire query in this case to get
|
|
642
|
+
# the number of rows. In general, you should avoid calling this method
|
|
643
|
+
# on datasets with custom SQL.
|
|
644
|
+
def count(*a, &block)
|
|
645
|
+
if (@opts[:sql] && a.empty? && !block)
|
|
646
|
+
naked.to_a.length
|
|
647
|
+
else
|
|
648
|
+
super
|
|
649
|
+
end
|
|
650
|
+
end
|
|
651
|
+
|
|
652
|
+
# Uses CROSS APPLY to join the given table into the current dataset.
|
|
653
|
+
def cross_apply(table)
|
|
654
|
+
join_table(:cross_apply, table)
|
|
655
|
+
end
|
|
656
|
+
|
|
657
|
+
# Disable the use of INSERT OUTPUT
|
|
658
|
+
def disable_insert_output
|
|
659
|
+
clone(:disable_insert_output=>true)
|
|
660
|
+
end
|
|
661
|
+
|
|
662
|
+
# For a dataset with custom SQL, since it may include ORDER BY, you
|
|
663
|
+
# cannot wrap it in a subquery. Run query, and if it returns any
|
|
664
|
+
# records, return true. In general, you should avoid calling this method
|
|
665
|
+
# on datasets with custom SQL.
|
|
666
|
+
def empty?
|
|
667
|
+
if @opts[:sql]
|
|
668
|
+
naked.each{return false}
|
|
669
|
+
true
|
|
670
|
+
else
|
|
671
|
+
super
|
|
672
|
+
end
|
|
673
|
+
end
|
|
674
|
+
|
|
675
|
+
# MSSQL treats [] as a metacharacter in LIKE expresions.
|
|
676
|
+
def escape_like(string)
|
|
677
|
+
string.gsub(/[\\%_\[\]]/){|m| "\\#{m}"}
|
|
678
|
+
end
|
|
679
|
+
|
|
680
|
+
# MSSQL uses the CONTAINS keyword for full text search
|
|
681
|
+
def full_text_search(cols, terms, opts = OPTS)
|
|
682
|
+
terms = "\"#{Sequel.array_or_set_join(terms, '" OR "')}\"" if terms.is_a?(Array) || terms.is_a?(Set)
|
|
683
|
+
where(Sequel.lit("CONTAINS (?, ?)", cols, terms))
|
|
684
|
+
end
|
|
685
|
+
|
|
686
|
+
# Insert a record, returning the record inserted, using OUTPUT. Always returns nil without
|
|
687
|
+
# running an INSERT statement if disable_insert_output is used. If the query runs
|
|
688
|
+
# but returns no values, returns false.
|
|
689
|
+
def insert_select(*values)
|
|
690
|
+
return unless supports_insert_select?
|
|
691
|
+
with_sql_first(insert_select_sql(*values)) || false
|
|
692
|
+
end
|
|
693
|
+
|
|
694
|
+
# Add OUTPUT clause unless there is already an existing output clause, then return
|
|
695
|
+
# the SQL to insert.
|
|
696
|
+
def insert_select_sql(*values)
|
|
697
|
+
ds = (opts[:output] || opts[:returning]) ? self : output(nil, [SQL::ColumnAll.new(:inserted)])
|
|
698
|
+
ds.insert_sql(*values)
|
|
699
|
+
end
|
|
700
|
+
|
|
701
|
+
# Specify a table for a SELECT ... INTO query.
|
|
702
|
+
def into(table)
|
|
703
|
+
clone(:into => table)
|
|
704
|
+
end
|
|
705
|
+
|
|
706
|
+
# Allows you to do a dirty read of uncommitted data using WITH (NOLOCK).
|
|
707
|
+
def nolock
|
|
708
|
+
cached_lock_style_dataset(:_nolock_ds, :dirty)
|
|
709
|
+
end
|
|
710
|
+
|
|
711
|
+
# Uses OUTER APPLY to join the given table into the current dataset.
|
|
712
|
+
def outer_apply(table)
|
|
713
|
+
join_table(:outer_apply, table)
|
|
714
|
+
end
|
|
715
|
+
|
|
716
|
+
# Include an OUTPUT clause in the eventual INSERT, UPDATE, or DELETE query.
|
|
717
|
+
#
|
|
718
|
+
# The first argument is the table to output into, and the second argument
|
|
719
|
+
# is either an Array of column values to select, or a Hash which maps output
|
|
720
|
+
# column names to selected values, in the style of #insert or #update.
|
|
721
|
+
#
|
|
722
|
+
# Output into a returned result set is not currently supported.
|
|
723
|
+
#
|
|
724
|
+
# Examples:
|
|
725
|
+
#
|
|
726
|
+
# dataset.output(:output_table, [Sequel[:deleted][:id], Sequel[:deleted][:name]])
|
|
727
|
+
# dataset.output(:output_table, id: Sequel[:inserted][:id], name: Sequel[:inserted][:name])
|
|
728
|
+
def output(into, values)
|
|
729
|
+
raise(Error, "SQL Server versions 2000 and earlier do not support the OUTPUT clause") unless supports_output_clause?
|
|
730
|
+
output = {}
|
|
731
|
+
case values
|
|
732
|
+
when Hash
|
|
733
|
+
output[:column_list], output[:select_list] = values.keys, values.values
|
|
734
|
+
when Array
|
|
735
|
+
output[:select_list] = values
|
|
736
|
+
end
|
|
737
|
+
output[:into] = into
|
|
738
|
+
clone(:output => output)
|
|
739
|
+
end
|
|
740
|
+
|
|
741
|
+
# MSSQL uses [] to quote identifiers.
|
|
742
|
+
def quoted_identifier_append(sql, name)
|
|
743
|
+
sql << '[' << name.to_s.gsub(/\]/, ']]') << ']'
|
|
744
|
+
end
|
|
745
|
+
|
|
746
|
+
# Emulate RETURNING using the output clause. This only handles values that are simple column references.
|
|
747
|
+
def returning(*values)
|
|
748
|
+
values = values.map do |v|
|
|
749
|
+
unless r = unqualified_column_for(v)
|
|
750
|
+
raise(Error, "cannot emulate RETURNING via OUTPUT for value: #{v.inspect}")
|
|
751
|
+
end
|
|
752
|
+
r
|
|
753
|
+
end
|
|
754
|
+
clone(:returning=>values)
|
|
755
|
+
end
|
|
756
|
+
|
|
757
|
+
# On MSSQL 2012+ add a default order to the current dataset if an offset is used.
|
|
758
|
+
# The default offset emulation using a subquery would be used in the unordered
|
|
759
|
+
# case by default, and that also adds a default order, so it's better to just
|
|
760
|
+
# avoid the subquery.
|
|
761
|
+
def select_sql
|
|
762
|
+
if @opts[:offset]
|
|
763
|
+
raise(Error, "Using with_ties is not supported with an offset on Microsoft SQL Server") if @opts[:limit_with_ties]
|
|
764
|
+
return order(1).select_sql if is_2012_or_later? && !@opts[:order]
|
|
765
|
+
end
|
|
766
|
+
super
|
|
767
|
+
end
|
|
768
|
+
|
|
769
|
+
# The version of the database server.
|
|
770
|
+
def server_version
|
|
771
|
+
db.server_version(@opts[:server])
|
|
772
|
+
end
|
|
773
|
+
|
|
774
|
+
def supports_cte?(type=:select)
|
|
775
|
+
is_2005_or_later?
|
|
776
|
+
end
|
|
777
|
+
|
|
778
|
+
# MSSQL 2005+ supports GROUP BY CUBE.
|
|
779
|
+
def supports_group_cube?
|
|
780
|
+
is_2005_or_later?
|
|
781
|
+
end
|
|
782
|
+
|
|
783
|
+
# MSSQL 2005+ supports GROUP BY ROLLUP
|
|
784
|
+
def supports_group_rollup?
|
|
785
|
+
is_2005_or_later?
|
|
786
|
+
end
|
|
787
|
+
|
|
788
|
+
# MSSQL 2008+ supports GROUPING SETS
|
|
789
|
+
def supports_grouping_sets?
|
|
790
|
+
is_2008_or_later?
|
|
791
|
+
end
|
|
792
|
+
|
|
793
|
+
# MSSQL supports insert_select via the OUTPUT clause.
|
|
794
|
+
def supports_insert_select?
|
|
795
|
+
supports_output_clause? && !opts[:disable_insert_output]
|
|
796
|
+
end
|
|
797
|
+
|
|
798
|
+
# MSSQL 2005+ supports INTERSECT and EXCEPT
|
|
799
|
+
def supports_intersect_except?
|
|
800
|
+
is_2005_or_later?
|
|
801
|
+
end
|
|
802
|
+
|
|
803
|
+
# MSSQL does not support IS TRUE
|
|
804
|
+
def supports_is_true?
|
|
805
|
+
false
|
|
806
|
+
end
|
|
807
|
+
|
|
808
|
+
# MSSQL doesn't support JOIN USING
|
|
809
|
+
def supports_join_using?
|
|
810
|
+
false
|
|
811
|
+
end
|
|
812
|
+
|
|
813
|
+
# MSSQL 2008+ supports MERGE
|
|
814
|
+
def supports_merge?
|
|
815
|
+
is_2008_or_later?
|
|
816
|
+
end
|
|
817
|
+
|
|
818
|
+
# MSSQL 2005+ supports modifying joined datasets
|
|
819
|
+
def supports_modifying_joins?
|
|
820
|
+
is_2005_or_later?
|
|
821
|
+
end
|
|
822
|
+
|
|
823
|
+
# MSSQL does not support multiple columns for the IN/NOT IN operators
|
|
824
|
+
def supports_multiple_column_in?
|
|
825
|
+
false
|
|
826
|
+
end
|
|
827
|
+
|
|
828
|
+
# MSSQL supports NOWAIT.
|
|
829
|
+
def supports_nowait?
|
|
830
|
+
true
|
|
831
|
+
end
|
|
832
|
+
|
|
833
|
+
# MSSQL 2012+ supports offsets in correlated subqueries.
|
|
834
|
+
def supports_offsets_in_correlated_subqueries?
|
|
835
|
+
is_2012_or_later?
|
|
836
|
+
end
|
|
837
|
+
|
|
838
|
+
# MSSQL 2005+ supports the OUTPUT clause.
|
|
839
|
+
def supports_output_clause?
|
|
840
|
+
is_2005_or_later?
|
|
841
|
+
end
|
|
842
|
+
|
|
843
|
+
# MSSQL 2005+ can emulate RETURNING via the OUTPUT clause.
|
|
844
|
+
def supports_returning?(type)
|
|
845
|
+
supports_insert_select?
|
|
846
|
+
end
|
|
847
|
+
|
|
848
|
+
# MSSQL uses READPAST to skip locked rows.
|
|
849
|
+
def supports_skip_locked?
|
|
850
|
+
true
|
|
851
|
+
end
|
|
852
|
+
|
|
853
|
+
# MSSQL 2005+ supports window functions
|
|
854
|
+
def supports_window_functions?
|
|
855
|
+
true
|
|
856
|
+
end
|
|
857
|
+
|
|
858
|
+
# MSSQL cannot use WHERE 1.
|
|
859
|
+
def supports_where_true?
|
|
860
|
+
false
|
|
861
|
+
end
|
|
862
|
+
|
|
863
|
+
# Use WITH TIES when limiting the result set to also include additional
|
|
864
|
+
# rows matching the last row.
|
|
865
|
+
def with_ties
|
|
866
|
+
clone(:limit_with_ties=>true)
|
|
867
|
+
end
|
|
868
|
+
|
|
869
|
+
protected
|
|
870
|
+
|
|
871
|
+
# If returned primary keys are requested, use OUTPUT unless already set on the
|
|
872
|
+
# dataset. If OUTPUT is already set, use existing returning values. If OUTPUT
|
|
873
|
+
# is only set to return a single columns, return an array of just that column.
|
|
874
|
+
# Otherwise, return an array of hashes.
|
|
875
|
+
def _import(columns, values, opts=OPTS)
|
|
876
|
+
if opts[:return] == :primary_key && !@opts[:output]
|
|
877
|
+
output(nil, [SQL::QualifiedIdentifier.new(:inserted, first_primary_key)])._import(columns, values, opts)
|
|
878
|
+
elsif @opts[:output]
|
|
879
|
+
# no transaction: our multi_insert_sql_strategy should guarantee
|
|
880
|
+
# that there's only ever a single statement.
|
|
881
|
+
sql = multi_insert_sql(columns, values)[0]
|
|
882
|
+
naked.with_sql(sql).map{|v| v.length == 1 ? v.values.first : v}
|
|
883
|
+
else
|
|
884
|
+
super
|
|
885
|
+
end
|
|
886
|
+
end
|
|
887
|
+
|
|
888
|
+
# If the dataset using a order without a limit or offset or custom SQL,
|
|
889
|
+
# remove the order. Compounds on Microsoft SQL Server have undefined
|
|
890
|
+
# order unless the result is specifically ordered. Applying the current
|
|
891
|
+
# order before the compound doesn't work in all cases, such as when
|
|
892
|
+
# qualified identifiers are used. If you want to ensure a order
|
|
893
|
+
# for a compound dataset, apply the order after all compounds have been
|
|
894
|
+
# added.
|
|
895
|
+
def compound_from_self
|
|
896
|
+
if @opts[:offset] && !@opts[:limit] && !is_2012_or_later?
|
|
897
|
+
clone(:limit=>LIMIT_ALL).from_self
|
|
898
|
+
elsif @opts[:order] && !(@opts[:sql] || @opts[:limit] || @opts[:offset])
|
|
899
|
+
unordered
|
|
900
|
+
else
|
|
901
|
+
super
|
|
902
|
+
end
|
|
903
|
+
end
|
|
904
|
+
|
|
905
|
+
private
|
|
906
|
+
|
|
907
|
+
# Normalize conditions for MERGE WHEN.
|
|
908
|
+
def _merge_when_conditions_sql(sql, data)
|
|
909
|
+
if data.has_key?(:conditions)
|
|
910
|
+
sql << " AND "
|
|
911
|
+
literal_append(sql, _normalize_merge_when_conditions(data[:conditions]))
|
|
912
|
+
end
|
|
913
|
+
end
|
|
914
|
+
|
|
915
|
+
# Handle nil, false, and true MERGE WHEN conditions to avoid non-boolean
|
|
916
|
+
# type error.
|
|
917
|
+
def _normalize_merge_when_conditions(conditions)
|
|
918
|
+
case conditions
|
|
919
|
+
when nil, false
|
|
920
|
+
{1=>0}
|
|
921
|
+
when true
|
|
922
|
+
{1=>1}
|
|
923
|
+
when Sequel::SQL::DelayedEvaluation
|
|
924
|
+
Sequel.delay{_normalize_merge_when_conditions(conditions.call(self))}
|
|
925
|
+
else
|
|
926
|
+
conditions
|
|
927
|
+
end
|
|
928
|
+
end
|
|
929
|
+
|
|
930
|
+
# MSSQL requires a semicolon at the end of MERGE.
|
|
931
|
+
def _merge_when_sql(sql)
|
|
932
|
+
super
|
|
933
|
+
sql << ';'
|
|
934
|
+
end
|
|
935
|
+
|
|
936
|
+
# MSSQL does not allow ordering in sub-clauses unless TOP (limit) is specified
|
|
937
|
+
def aggregate_dataset
|
|
938
|
+
(options_overlap(Sequel::Dataset::COUNT_FROM_SELF_OPTS) && !options_overlap([:limit])) ? unordered.from_self : super
|
|
939
|
+
end
|
|
940
|
+
|
|
941
|
+
# Allow update and delete for unordered, limited datasets only.
|
|
942
|
+
def check_not_limited!(type)
|
|
943
|
+
return if @opts[:skip_limit_check] && type != :truncate
|
|
944
|
+
raise Sequel::InvalidOperation, "Dataset##{type} not suppored on ordered, limited datasets" if opts[:order] && opts[:limit]
|
|
945
|
+
super if type == :truncate || @opts[:offset]
|
|
946
|
+
end
|
|
947
|
+
|
|
948
|
+
# Whether we are using SQL Server 2005 or later.
|
|
949
|
+
def is_2005_or_later?
|
|
950
|
+
server_version >= 9000000
|
|
951
|
+
end
|
|
952
|
+
|
|
953
|
+
# Whether we are using SQL Server 2008 or later.
|
|
954
|
+
def is_2008_or_later?
|
|
955
|
+
server_version >= 10000000
|
|
956
|
+
end
|
|
957
|
+
|
|
958
|
+
# Whether we are using SQL Server 2012 or later.
|
|
959
|
+
def is_2012_or_later?
|
|
960
|
+
server_version >= 11000000
|
|
961
|
+
end
|
|
962
|
+
|
|
963
|
+
# Determine whether to add the COLLATE for LIKE arguments, based on the Database setting.
|
|
964
|
+
def complex_expression_sql_like_args(args, collation)
|
|
965
|
+
if db.like_without_collate
|
|
966
|
+
args
|
|
967
|
+
else
|
|
968
|
+
args.map{|a| Sequel.lit(["(", collation], a)}
|
|
969
|
+
end
|
|
970
|
+
end
|
|
971
|
+
|
|
972
|
+
# Use strict ISO-8601 format with T between date and time,
|
|
973
|
+
# since that is the format that is multilanguage and not
|
|
974
|
+
# DATEFORMAT dependent.
|
|
975
|
+
def default_timestamp_format
|
|
976
|
+
"'%Y-%m-%dT%H:%M:%S.%3N'"
|
|
977
|
+
end
|
|
978
|
+
|
|
979
|
+
# Only include the primary table in the main delete clause
|
|
980
|
+
def delete_from_sql(sql)
|
|
981
|
+
sql << ' FROM '
|
|
982
|
+
source_list_append(sql, @opts[:from][0..0])
|
|
983
|
+
end
|
|
984
|
+
|
|
985
|
+
# MSSQL supports FROM clauses in DELETE and UPDATE statements.
|
|
986
|
+
def delete_from2_sql(sql)
|
|
987
|
+
if joined_dataset?
|
|
988
|
+
select_from_sql(sql)
|
|
989
|
+
select_join_sql(sql)
|
|
990
|
+
end
|
|
991
|
+
end
|
|
992
|
+
alias update_from_sql delete_from2_sql
|
|
993
|
+
|
|
994
|
+
def delete_output_sql(sql)
|
|
995
|
+
output_sql(sql, :DELETED)
|
|
996
|
+
end
|
|
997
|
+
|
|
998
|
+
# There is no function on Microsoft SQL Server that does character length
|
|
999
|
+
# and respects trailing spaces (datalength respects trailing spaces, but
|
|
1000
|
+
# counts bytes instead of characters). Use a hack to work around the
|
|
1001
|
+
# trailing spaces issue.
|
|
1002
|
+
def emulate_function?(name)
|
|
1003
|
+
name == :char_length || name == :trim
|
|
1004
|
+
end
|
|
1005
|
+
|
|
1006
|
+
def emulate_function_sql_append(sql, f)
|
|
1007
|
+
case f.name
|
|
1008
|
+
when :char_length
|
|
1009
|
+
literal_append(sql, SQL::Function.new(:len, Sequel.join([f.args.first, 'x'])) - 1)
|
|
1010
|
+
when :trim
|
|
1011
|
+
literal_append(sql, SQL::Function.new(:ltrim, SQL::Function.new(:rtrim, f.args.first)))
|
|
1012
|
+
end
|
|
1013
|
+
end
|
|
1014
|
+
|
|
1015
|
+
# Microsoft SQL Server 2012+ has native support for offsets, but only for ordered datasets.
|
|
1016
|
+
def emulate_offset_with_row_number?
|
|
1017
|
+
super && !(is_2012_or_later? && @opts[:order])
|
|
1018
|
+
end
|
|
1019
|
+
|
|
1020
|
+
# Return the first primary key for the current table. If this table has
|
|
1021
|
+
# multiple primary keys, this will only return one of them. Used by #_import.
|
|
1022
|
+
def first_primary_key
|
|
1023
|
+
@db.schema(self).map{|k, v| k if v[:primary_key] == true}.compact.first
|
|
1024
|
+
end
|
|
1025
|
+
|
|
1026
|
+
def insert_output_sql(sql)
|
|
1027
|
+
output_sql(sql, :INSERTED)
|
|
1028
|
+
end
|
|
1029
|
+
alias update_output_sql insert_output_sql
|
|
1030
|
+
|
|
1031
|
+
# Handle CROSS APPLY and OUTER APPLY JOIN types
|
|
1032
|
+
def join_type_sql(join_type)
|
|
1033
|
+
case join_type
|
|
1034
|
+
when :cross_apply
|
|
1035
|
+
'CROSS APPLY'
|
|
1036
|
+
when :outer_apply
|
|
1037
|
+
'OUTER APPLY'
|
|
1038
|
+
else
|
|
1039
|
+
super
|
|
1040
|
+
end
|
|
1041
|
+
end
|
|
1042
|
+
|
|
1043
|
+
# MSSQL uses a literal hexidecimal number for blob strings
|
|
1044
|
+
def literal_blob_append(sql, v)
|
|
1045
|
+
sql << '0x' << v.unpack("H*").first
|
|
1046
|
+
end
|
|
1047
|
+
|
|
1048
|
+
# Use YYYYmmdd format, since that's the only format that is
|
|
1049
|
+
# multilanguage and not DATEFORMAT dependent.
|
|
1050
|
+
def literal_date(v)
|
|
1051
|
+
v.strftime("'%Y%m%d'")
|
|
1052
|
+
end
|
|
1053
|
+
|
|
1054
|
+
# Use 0 for false on MSSQL
|
|
1055
|
+
def literal_false
|
|
1056
|
+
'0'
|
|
1057
|
+
end
|
|
1058
|
+
|
|
1059
|
+
# Optionally use unicode string syntax for all strings. Don't double
|
|
1060
|
+
# backslashes.
|
|
1061
|
+
def literal_string_append(sql, v)
|
|
1062
|
+
sql << (mssql_unicode_strings ? "N'" : "'")
|
|
1063
|
+
sql << v.gsub("'", "''").gsub(/\\((?:\r\n)|\n)/, '\\\\\\\\\\1\\1') << "'"
|
|
1064
|
+
end
|
|
1065
|
+
|
|
1066
|
+
# Use 1 for true on MSSQL
|
|
1067
|
+
def literal_true
|
|
1068
|
+
'1'
|
|
1069
|
+
end
|
|
1070
|
+
|
|
1071
|
+
# MSSQL 2008+ supports multiple rows in the VALUES clause, older versions
|
|
1072
|
+
# can use UNION.
|
|
1073
|
+
def multi_insert_sql_strategy
|
|
1074
|
+
is_2008_or_later? ? :values : :union
|
|
1075
|
+
end
|
|
1076
|
+
|
|
1077
|
+
def non_sql_option?(key)
|
|
1078
|
+
super || key == :disable_insert_output || key == :mssql_unicode_strings
|
|
1079
|
+
end
|
|
1080
|
+
|
|
1081
|
+
def select_into_sql(sql)
|
|
1082
|
+
if i = @opts[:into]
|
|
1083
|
+
sql << " INTO "
|
|
1084
|
+
identifier_append(sql, i)
|
|
1085
|
+
end
|
|
1086
|
+
end
|
|
1087
|
+
|
|
1088
|
+
# MSSQL 2000 uses TOP N for limit. For MSSQL 2005+ TOP (N) is used
|
|
1089
|
+
# to allow the limit to be a bound variable.
|
|
1090
|
+
def select_limit_sql(sql)
|
|
1091
|
+
if l = @opts[:limit]
|
|
1092
|
+
return if is_2012_or_later? && @opts[:order] && @opts[:offset]
|
|
1093
|
+
shared_limit_sql(sql, l)
|
|
1094
|
+
end
|
|
1095
|
+
end
|
|
1096
|
+
|
|
1097
|
+
def shared_limit_sql(sql, l)
|
|
1098
|
+
if is_2005_or_later?
|
|
1099
|
+
if l == LIMIT_ALL
|
|
1100
|
+
sql << " TOP (100) PERCENT"
|
|
1101
|
+
else
|
|
1102
|
+
sql << " TOP ("
|
|
1103
|
+
literal_append(sql, l)
|
|
1104
|
+
sql << ')'
|
|
1105
|
+
end
|
|
1106
|
+
else
|
|
1107
|
+
sql << " TOP "
|
|
1108
|
+
literal_append(sql, l)
|
|
1109
|
+
end
|
|
1110
|
+
|
|
1111
|
+
if @opts[:limit_with_ties]
|
|
1112
|
+
sql << " WITH TIES"
|
|
1113
|
+
end
|
|
1114
|
+
end
|
|
1115
|
+
|
|
1116
|
+
def update_limit_sql(sql)
|
|
1117
|
+
if l = @opts[:limit]
|
|
1118
|
+
shared_limit_sql(sql, l)
|
|
1119
|
+
end
|
|
1120
|
+
end
|
|
1121
|
+
alias delete_limit_sql update_limit_sql
|
|
1122
|
+
|
|
1123
|
+
# Handle dirty, skip locked, and for update locking
|
|
1124
|
+
def select_lock_sql(sql)
|
|
1125
|
+
lock = @opts[:lock]
|
|
1126
|
+
skip_locked = @opts[:skip_locked]
|
|
1127
|
+
nowait = @opts[:nowait]
|
|
1128
|
+
for_update = lock == :update
|
|
1129
|
+
dirty = lock == :dirty
|
|
1130
|
+
lock_hint = for_update || dirty
|
|
1131
|
+
|
|
1132
|
+
if lock_hint || skip_locked
|
|
1133
|
+
sql << " WITH ("
|
|
1134
|
+
|
|
1135
|
+
if lock_hint
|
|
1136
|
+
sql << (for_update ? 'UPDLOCK' : 'NOLOCK')
|
|
1137
|
+
end
|
|
1138
|
+
|
|
1139
|
+
if skip_locked || nowait
|
|
1140
|
+
sql << ', ' if lock_hint
|
|
1141
|
+
sql << (skip_locked ? "READPAST" : "NOWAIT")
|
|
1142
|
+
end
|
|
1143
|
+
|
|
1144
|
+
sql << ')'
|
|
1145
|
+
else
|
|
1146
|
+
super
|
|
1147
|
+
end
|
|
1148
|
+
end
|
|
1149
|
+
|
|
1150
|
+
# On 2012+ when there is an order with an offset, append the offset (and possible
|
|
1151
|
+
# limit) at the end of the order clause.
|
|
1152
|
+
def select_order_sql(sql)
|
|
1153
|
+
super
|
|
1154
|
+
if is_2012_or_later? && @opts[:order]
|
|
1155
|
+
if o = @opts[:offset]
|
|
1156
|
+
sql << " OFFSET "
|
|
1157
|
+
literal_append(sql, o)
|
|
1158
|
+
sql << " ROWS"
|
|
1159
|
+
|
|
1160
|
+
if l = @opts[:limit]
|
|
1161
|
+
sql << " FETCH NEXT "
|
|
1162
|
+
literal_append(sql, l)
|
|
1163
|
+
sql << " ROWS ONLY"
|
|
1164
|
+
end
|
|
1165
|
+
end
|
|
1166
|
+
end
|
|
1167
|
+
end
|
|
1168
|
+
|
|
1169
|
+
def output_sql(sql, type)
|
|
1170
|
+
return unless supports_output_clause?
|
|
1171
|
+
if output = @opts[:output]
|
|
1172
|
+
output_list_sql(sql, output)
|
|
1173
|
+
elsif values = @opts[:returning]
|
|
1174
|
+
output_returning_sql(sql, type, values)
|
|
1175
|
+
end
|
|
1176
|
+
end
|
|
1177
|
+
|
|
1178
|
+
def output_list_sql(sql, output)
|
|
1179
|
+
sql << " OUTPUT "
|
|
1180
|
+
column_list_append(sql, output[:select_list])
|
|
1181
|
+
if into = output[:into]
|
|
1182
|
+
sql << " INTO "
|
|
1183
|
+
identifier_append(sql, into)
|
|
1184
|
+
if column_list = output[:column_list]
|
|
1185
|
+
sql << ' ('
|
|
1186
|
+
source_list_append(sql, column_list)
|
|
1187
|
+
sql << ')'
|
|
1188
|
+
end
|
|
1189
|
+
end
|
|
1190
|
+
end
|
|
1191
|
+
|
|
1192
|
+
def output_returning_sql(sql, type, values)
|
|
1193
|
+
sql << " OUTPUT "
|
|
1194
|
+
if values.empty?
|
|
1195
|
+
literal_append(sql, SQL::ColumnAll.new(type))
|
|
1196
|
+
else
|
|
1197
|
+
values = values.map do |v|
|
|
1198
|
+
case v
|
|
1199
|
+
when SQL::AliasedExpression
|
|
1200
|
+
Sequel.qualify(type, v.expression).as(v.alias)
|
|
1201
|
+
else
|
|
1202
|
+
Sequel.qualify(type, v)
|
|
1203
|
+
end
|
|
1204
|
+
end
|
|
1205
|
+
column_list_append(sql, values)
|
|
1206
|
+
end
|
|
1207
|
+
end
|
|
1208
|
+
|
|
1209
|
+
# MSSQL does not natively support NULLS FIRST/LAST.
|
|
1210
|
+
def requires_emulating_nulls_first?
|
|
1211
|
+
true
|
|
1212
|
+
end
|
|
1213
|
+
|
|
1214
|
+
# MSSQL supports 100-nsec precision for time columns, but ruby by
|
|
1215
|
+
# default only supports usec precision.
|
|
1216
|
+
def sqltime_precision
|
|
1217
|
+
6
|
|
1218
|
+
end
|
|
1219
|
+
|
|
1220
|
+
# MSSQL supports millisecond timestamp precision for datetime columns.
|
|
1221
|
+
# 100-nsec precision is supported for datetime2 columns, but Sequel does
|
|
1222
|
+
# not know what the column type is when formatting values.
|
|
1223
|
+
def timestamp_precision
|
|
1224
|
+
3
|
|
1225
|
+
end
|
|
1226
|
+
|
|
1227
|
+
# Only include the primary table in the main update clause
|
|
1228
|
+
def update_table_sql(sql)
|
|
1229
|
+
sql << ' '
|
|
1230
|
+
source_list_append(sql, @opts[:from][0..0])
|
|
1231
|
+
end
|
|
1232
|
+
|
|
1233
|
+
def uses_with_rollup?
|
|
1234
|
+
!is_2008_or_later?
|
|
1235
|
+
end
|
|
1236
|
+
end
|
|
1237
|
+
end
|
|
1238
|
+
end
|