/* Copyright (c) 2018-2022 Marcelo Zimbres Silva (mzimbres@gmail.com) * * Distributed under the Boost Software License, Version 1.0. (See * accompanying file LICENSE.txt) */ #include #if defined(BOOST_ASIO_HAS_CO_AWAIT) #include #include #include #include #include "common/common.hpp" namespace net = boost::asio; namespace redis = boost::redis; namespace resp3 = redis::resp3; using namespace net::experimental::awaitable_operators; using redis::adapt; void print(std::map const& cont) { for (auto const& e: cont) std::cout << e.first << ": " << e.second << "\n"; } void print(std::vector const& cont) { for (auto const& e: cont) std::cout << e << " "; std::cout << "\n"; } auto run(std::shared_ptr conn, std::string host, std::string port) -> net::awaitable { co_await connect(conn, host, port); co_await conn->async_run(); } // Stores the content of some STL containers in Redis. auto store(std::shared_ptr conn) -> net::awaitable { std::vector vec {1, 2, 3, 4, 5, 6}; std::map map {{"key1", "value1"}, {"key2", "value2"}, {"key3", "value3"}}; resp3::request req; req.push("HELLO", 3); req.push_range("RPUSH", "rpush-key", vec); req.push_range("HSET", "hset-key", map); co_await conn->async_exec(req); } auto hgetall(std::shared_ptr conn) -> net::awaitable { // A request contains multiple commands. resp3::request req; req.push("HELLO", 3); req.push("HGETALL", "hset-key"); // Responses as tuple elements. std::tuple> resp; // Executes the request and reads the response. co_await conn->async_exec(req, adapt(resp)); print(std::get<1>(resp)); } // Retrieves in a transaction. auto transaction(std::shared_ptr conn) -> net::awaitable { resp3::request req; req.push("HELLO", 3); req.push("MULTI"); req.push("LRANGE", "rpush-key", 0, -1); // Retrieves req.push("HGETALL", "hset-key"); // Retrieves req.push("EXEC"); std::tuple< redis::ignore, // hello redis::ignore, // multi redis::ignore, // lrange redis::ignore, // hgetall std::tuple>, std::optional>> // exec > resp; co_await conn->async_exec(req, adapt(resp)); print(std::get<0>(std::get<4>(resp)).value()); print(std::get<1>(std::get<4>(resp)).value()); } auto quit(std::shared_ptr conn) -> net::awaitable { resp3::request req; req.push("QUIT"); co_await conn->async_exec(req); } // Called from the main function (see main.cpp) net::awaitable co_main(std::string host, std::string port) { auto ex = co_await net::this_coro::executor; auto conn = std::make_shared(ex); net::co_spawn(ex, run(conn, host, port), net::detached); co_await store(conn); co_await transaction(conn); co_await hgetall(conn); co_await quit(conn); } #endif // defined(BOOST_ASIO_HAS_CO_AWAIT)