// // Copyright (c) 2019-2022 Ruben Perez Hidalgo (rubenperez038 at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "er_network_variant.hpp" #include "er_connection.hpp" #include "er_resultset.hpp" #include "er_statement.hpp" #include "network_result.hpp" #include "streams.hpp" #include "er_impl_common.hpp" #include "get_endpoint.hpp" #include "handler_call_tracker.hpp" #include "boost/mysql/connection_params.hpp" #include "boost/mysql/errc.hpp" #include "boost/mysql/error.hpp" #include "boost/mysql/execute_params.hpp" #include "boost/mysql/prepared_statement.hpp" #include "boost/mysql/row.hpp" #include #include #include using namespace boost::mysql::test; using boost::mysql::row; using boost::mysql::error_code; using boost::mysql::error_info; using boost::mysql::field_view; using boost::mysql::connection_params; namespace { template struct handler { std::promise>& prom_; handler_call_tracker& call_tracker_; // For operations with a return type void operator()(error_code code, R retval) { call_tracker_.register_call(); prom_.set_value(network_result(code, std::move(retval))); } // For operations without a return type (R=no_result) void operator()(error_code code) { call_tracker_.register_call(); prom_.set_value(network_result(code)); } }; template network_result impl(Callable&& cb) { handler_call_tracker call_tracker; std::promise> prom; cb(handler{prom, call_tracker}); return prom.get_future().get(); } template class async_callback_noerrinfo_resultset : public er_resultset_base { public: using er_resultset_base::er_resultset_base; network_result read_one(row& output) override { return impl([&](handler h) { return this->r_.async_read_one(output, std::move(h)); }); } network_result> read_many(std::size_t count) override { return impl>([&](handler> h) { return this->r_.async_read_many(count, std::move(h)); }); } network_result> read_all() override { return impl>([&](handler> h) { return this->r_.async_read_all(std::move(h)); }); } }; template network_result erase_network_result(network_result>&& r) { return network_result ( r.err, erase_resultset(std::move(r.value)) ); } template class async_callback_noerrinfo_statement : public er_statement_base { public: using er_statement_base::er_statement_base; using resultset_type = boost::mysql::resultset; network_result execute_params( const boost::mysql::execute_params& params ) override { return erase_network_result(impl([&](handler h) { return this->stmt_.async_execute(params, std::move(h)); })); } network_result execute_container( const std::vector& values ) override { return erase_network_result(impl([&](handler h) { return this->stmt_.async_execute(values, std::move(h)); })); } network_result close() override { return impl([&](handler h) { return this->stmt_.async_close(std::move(h)); }); } }; template network_result erase_network_result(network_result>&& r) { return network_result ( r.err, erase_statement(std::move(r.value)) ); } template class async_callback_noerrinfo_connection : public er_connection_base { public: using er_connection_base::er_connection_base; using statement_type = boost::mysql::prepared_statement; using resultset_type = boost::mysql::resultset; network_result physical_connect(er_endpoint kind) override { return impl([&](handler h) { return this->conn_.next_layer().lowest_layer().async_connect(get_endpoint(kind), std::move(h)); }); } network_result connect( er_endpoint kind, const boost::mysql::connection_params& params ) override { return impl([&](handler h) { return this->conn_.async_connect(get_endpoint(kind), params, std::move(h)); }); } network_result handshake(const connection_params& params) override { return impl([&](handler h) { return this->conn_.async_handshake(params, std::move(h)); }); } network_result query(boost::string_view query) override { return erase_network_result(impl([&](handler h) { return this->conn_.async_query(query, std::move(h)); })); } network_result prepare_statement(boost::string_view statement) override { return erase_network_result(impl([&](handler h) { return this->conn_.async_prepare_statement(statement, std::move(h)); })); } network_result quit() override { return impl([&](handler h) { return this->conn_.async_quit(std::move(h)); }); } network_result close() override { return impl([&](handler h) { return this->conn_.async_close(std::move(h)); }); } }; template class async_callback_noerrinfo_variant : public er_network_variant_base { public: const char* variant_name() const override { return "async_callback_noerrinfo"; } }; async_callback_noerrinfo_variant tcp; async_callback_noerrinfo_variant tcp_ssl; } // anon namespace void boost::mysql::test::add_async_callback_noerrinfo( std::vector& output ) { output.push_back(&tcp); output.push_back(&tcp_ssl); }