123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436 |
- #ifndef BOOST_MYSQL_PIPELINE_HPP
- #define BOOST_MYSQL_PIPELINE_HPP
- #include <boost/mysql/character_set.hpp>
- #include <boost/mysql/diagnostics.hpp>
- #include <boost/mysql/error_code.hpp>
- #include <boost/mysql/field_view.hpp>
- #include <boost/mysql/results.hpp>
- #include <boost/mysql/statement.hpp>
- #include <boost/mysql/string_view.hpp>
- #include <boost/mysql/detail/access.hpp>
- #include <boost/mysql/detail/config.hpp>
- #include <boost/mysql/detail/execution_processor/execution_processor.hpp>
- #include <boost/mysql/detail/pipeline.hpp>
- #include <boost/mysql/detail/writable_field_traits.hpp>
- #include <boost/assert.hpp>
- #include <boost/core/span.hpp>
- #include <boost/variant2/variant.hpp>
- #include <array>
- #include <cstdint>
- #include <utility>
- #include <vector>
- namespace boost {
- namespace mysql {
- class stage_response
- {
- #ifndef BOOST_MYSQL_DOXYGEN
- struct errcode_with_diagnostics
- {
- error_code ec;
- diagnostics diag;
- };
- struct
- {
- variant2::variant<errcode_with_diagnostics, statement, results> value;
- void emplace_results() { value.emplace<results>(); }
- void emplace_error() { value.emplace<errcode_with_diagnostics>(); }
- detail::execution_processor& get_processor()
- {
- return detail::access::get_impl(variant2::unsafe_get<2>(value));
- }
- void set_result(statement s) { value = s; }
- void set_error(error_code ec, diagnostics&& diag)
- {
- value.emplace<0>(errcode_with_diagnostics{ec, std::move(diag)});
- }
- } impl_;
- friend struct detail::access;
- #endif
- bool has_error() const { return impl_.value.index() == 0u; }
- BOOST_MYSQL_DECL
- void check_has_results() const;
- public:
-
- stage_response() = default;
-
- bool has_statement() const noexcept { return impl_.value.index() == 1u; }
-
- bool has_results() const noexcept { return impl_.value.index() == 2u; }
-
- error_code error() const noexcept
- {
- return has_error() ? variant2::unsafe_get<0>(impl_.value).ec : error_code();
- }
-
- diagnostics diag() const&
- {
- return has_error() ? variant2::unsafe_get<0>(impl_.value).diag : diagnostics();
- }
-
- diagnostics diag() && noexcept
- {
- return has_error() ? variant2::unsafe_get<0>(std::move(impl_.value)).diag : diagnostics();
- }
-
- BOOST_MYSQL_DECL
- statement as_statement() const;
-
- statement get_statement() const noexcept
- {
- BOOST_ASSERT(has_statement());
- return variant2::unsafe_get<1>(impl_.value);
- }
-
- const results& as_results() const&
- {
- check_has_results();
- return variant2::unsafe_get<2>(impl_.value);
- }
-
- results&& as_results() &&
- {
- check_has_results();
- return variant2::unsafe_get<2>(std::move(impl_.value));
- }
-
- const results& get_results() const& noexcept
- {
- BOOST_ASSERT(has_results());
- return variant2::unsafe_get<2>(impl_.value);
- }
-
- results&& get_results() && noexcept
- {
- BOOST_ASSERT(has_results());
- return variant2::unsafe_get<2>(std::move(impl_.value));
- }
- };
- class pipeline_request
- {
- #ifndef BOOST_MYSQL_DOXYGEN
- struct impl_t
- {
- std::vector<std::uint8_t> buffer_;
- std::vector<detail::pipeline_request_stage> stages_;
- } impl_;
- friend struct detail::access;
- #endif
- public:
-
- pipeline_request() = default;
-
- BOOST_MYSQL_DECL
- pipeline_request& add_execute(string_view query);
-
- template <BOOST_MYSQL_WRITABLE_FIELD... WritableField>
- pipeline_request& add_execute(statement stmt, const WritableField&... params)
- {
- std::array<field_view, sizeof...(WritableField)> params_arr{{detail::to_field(params)...}};
- return add_execute_range(stmt, params_arr);
- }
-
- BOOST_MYSQL_DECL
- pipeline_request& add_execute_range(statement stmt, span<const field_view> params);
-
- BOOST_MYSQL_DECL
- pipeline_request& add_prepare_statement(string_view stmt_sql);
-
- BOOST_MYSQL_DECL pipeline_request& add_close_statement(statement stmt);
-
- BOOST_MYSQL_DECL pipeline_request& add_reset_connection();
-
- BOOST_MYSQL_DECL pipeline_request& add_set_character_set(character_set charset);
-
- void clear() noexcept
- {
- impl_.buffer_.clear();
- impl_.stages_.clear();
- }
- };
- }
- }
- #ifdef BOOST_MYSQL_HEADER_ONLY
- #include <boost/mysql/impl/pipeline.ipp>
- #endif
- #endif
|