From 963b228e024368a7092a7ce60b33856bb13d5885 Mon Sep 17 00:00:00 2001 From: Marcelo Zimbres Date: Sun, 26 Jun 2022 18:24:36 +0200 Subject: [PATCH] Adds serialization example. --- Makefile.am | 5 +- benchmarks/cpp/echo_server_over_redis.cpp | 60 ----------------------- examples/containers.cpp | 60 ++++++++--------------- examples/intro.cpp | 1 + examples/mystruct.hpp | 54 -------------------- examples/print.hpp | 6 +-- 6 files changed, 27 insertions(+), 159 deletions(-) delete mode 100644 benchmarks/cpp/echo_server_over_redis.cpp diff --git a/Makefile.am b/Makefile.am index cc7a3995..dc8b945e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -15,6 +15,7 @@ check_PROGRAMS = check_PROGRAMS += intro_sync check_PROGRAMS += intro check_PROGRAMS += containers +check_PROGRAMS += serialization check_PROGRAMS += adapter check_PROGRAMS += test_low_level if HAVE_CXX20 @@ -27,7 +28,6 @@ EXTRA_PROGRAMS += commands if HAVE_CXX20 EXTRA_PROGRAMS += echo_server EXTRA_PROGRAMS += echo_server_direct -EXTRA_PROGRAMS += echo_server_over_redis EXTRA_PROGRAMS += chat_room EXTRA_PROGRAMS += echo_server_client endif @@ -44,12 +44,12 @@ subscriber_SOURCES = $(top_srcdir)/examples/subscriber.cpp test_low_level_SOURCES = $(top_srcdir)/tests/low_level.cpp intro_SOURCES = $(top_srcdir)/examples/intro.cpp containers_SOURCES = $(top_srcdir)/examples/containers.cpp +serialization_SOURCES = $(top_srcdir)/examples/serialization.cpp adapter_SOURCES = $(top_srcdir)/examples/adapter.cpp if HAVE_CXX20 test_high_level_SOURCES = $(top_srcdir)/tests/high_level.cpp chat_room_SOURCES = $(top_srcdir)/examples/chat_room.cpp echo_server_SOURCES = $(top_srcdir)/examples/echo_server.cpp -echo_server_over_redis_SOURCES = $(top_srcdir)/benchmarks/cpp/echo_server_over_redis.cpp echo_server_direct_SOURCES = $(top_srcdir)/benchmarks/cpp/echo_server_direct.cpp echo_server_client_SOURCES = $(top_srcdir)/benchmarks/cpp/echo_server_client.cpp endif @@ -82,7 +82,6 @@ nobase_include_HEADERS =\ nobase_noinst_HEADERS =\ $(top_srcdir)/examples/print.hpp\ - $(top_srcdir)/examples/mystruct.hpp\ $(top_srcdir)/tests/check.hpp TESTS = $(check_PROGRAMS) diff --git a/benchmarks/cpp/echo_server_over_redis.cpp b/benchmarks/cpp/echo_server_over_redis.cpp deleted file mode 100644 index 103ca2a4..00000000 --- a/benchmarks/cpp/echo_server_over_redis.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* 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 -#include -#include -#include -#include - -namespace net = boost::asio; -using aedis::adapt; -using aedis::command; -using aedis::resp3::request; -using tcp_socket = net::use_awaitable_t<>::as_default_on_t; -using tcp_acceptor = net::use_awaitable_t<>::as_default_on_t; -using connection = aedis::connection; - -net::awaitable echo_loop(tcp_socket socket, std::shared_ptr db) -{ - try { - for (std::string buffer;;) { - auto n = co_await net::async_read_until(socket, net::dynamic_buffer(buffer, 1024), "\n"); - request req; - req.push(command::ping, buffer); - std::tuple resp; - co_await db->async_exec(req, adapt(resp)); - co_await net::async_write(socket, net::buffer(std::get<0>(resp))); - buffer.erase(0, n); - } - } catch (std::exception const& e) { - std::cout << e.what() << std::endl; - } -} - -net::awaitable listener(bool coalesce_requests) -{ - auto ex = co_await net::this_coro::executor; - connection::config cfg; - cfg.coalesce_requests = coalesce_requests; - auto db = std::make_shared(ex, cfg); - db->async_run("127.0.0.1", "6379", net::detached); - - tcp_acceptor acc(ex, {net::ip::tcp::v4(), 55555}); - for (;;) - net::co_spawn(ex, echo_loop(co_await acc.async_accept(), db), net::detached); -} - -int main(int argc, char* argv[]) -{ - try { - net::io_context ioc; - co_spawn(ioc, listener(argc == 1), net::detached); - ioc.run(); - } catch (std::exception const& e) { - std::cerr << e.what() << std::endl; - } -} diff --git a/examples/containers.cpp b/examples/containers.cpp index df65ba80..c3f6e47c 100644 --- a/examples/containers.cpp +++ b/examples/containers.cpp @@ -5,14 +5,11 @@ */ #include -#include #include #include -#include #include #include #include "print.hpp" -#include "mystruct.hpp" namespace net = boost::asio; using boost::optional; @@ -21,54 +18,39 @@ using aedis::command; using aedis::resp3::request; using connection = aedis::connection<>; -// Response used in this example. -using C1 = std::vector; -using C2 = std::set; -using C3 = std::map; - -auto handler =[](auto ec, auto...) - { std::cout << ec.message() << std::endl; }; - int main() { - net::io_context ioc; - connection db{ioc}; + std::vector vec + {1, 2, 3, 4, 5, 6}; - // Request that sends the containers. - C1 vec {1, 2, 3, 4, 5, 6}; - C2 set {{1, "one"}, {2, "two"}, {3, "three"}, {4, "four"}}; - C3 map {{"key1", "value1"}, {"key2", "value2"}, {"key3", "value3"}}; + std::map map + {{"key1", 10}, {"key2", 20}, {"key3", 30}}; - request req1; - req1.push_range(command::rpush, "rpush-key", vec); - req1.push_range(command::sadd, "sadd-key", set); - req1.push_range(command::hset, "hset-key", map); - - // Request that retrieves the containers. - request req2; - req2.push(command::multi); - req2.push(command::lrange, "rpush-key", 0, -1); - req2.push(command::smembers, "sadd-key"); - req2.push(command::hgetall, "hset-key"); - req2.push(command::exec); - req2.push(command::quit); + request req; + req.push_range(command::rpush, "rpush-key", vec); + req.push_range(command::hset, "hset-key", map); + req.push(command::multi); + req.push(command::lrange, "rpush-key", 0, -1); + req.push(command::hgetall, "hset-key"); + req.push(command::exec); + req.push(command::quit); std::tuple< + std::string, // rpush + std::string, // hset std::string, // multi std::string, // lrange - std::string, // smembers std::string, // hgetall - std::tuple, optional, optional>, // exec + std::tuple>, optional>>, // exec std::string // quit > resp; - db.async_exec(req1, aedis::adapt(), handler); - db.async_exec(req2, aedis::adapt(resp), handler); - db.async_run("127.0.0.1", "6379", handler); + net::io_context ioc; + connection db{ioc}; + db.async_exec("127.0.0.1", "6379", req, aedis::adapt(resp), + [](auto ec, auto) { std::cout << ec.message() << std::endl; }); ioc.run(); - auto const& r = std::get<4>(resp); - print(std::get<0>(r).value()); - print(std::get<1>(r).value()); - print(std::get<2>(r).value()); + print(std::get<0>(std::get<5>(resp)).value()); + print(std::get<1>(std::get<5>(resp)).value()); } diff --git a/examples/intro.cpp b/examples/intro.cpp index b85be526..dd54615b 100644 --- a/examples/intro.cpp +++ b/examples/intro.cpp @@ -32,6 +32,7 @@ int main() ioc.run(); + // Print std::cout << std::get<0>(resp) << std::endl; std::cout << std::get<1>(resp) << std::endl; } diff --git a/examples/mystruct.hpp b/examples/mystruct.hpp index 8b99aec9..e69de29b 100644 --- a/examples/mystruct.hpp +++ b/examples/mystruct.hpp @@ -1,54 +0,0 @@ -/* 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 -#include -#include -#include -#include - -#include - -// Arbitrary struct to de/serialize. -struct mystruct { - std::int32_t x; - std::string y; -}; - -// TODO: Use json instead. -// Serializes mystruct -void to_bulk(std::string& to, mystruct const& obj) -{ - using aedis::resp3::type; - using aedis::resp3::add_header; - using aedis::resp3::add_separator; - - auto const size = sizeof obj.x + obj.y.size(); - add_header(to, type::blob_string, size); - auto const* p = reinterpret_cast(&obj.x); - std::copy(p, p + sizeof obj.x, std::back_inserter(to)); - std::copy(std::cbegin(obj.y), std::cend(obj.y), std::back_inserter(to)); - add_separator(to); -} - -// Deserialize the struct. -void from_string(mystruct& obj, boost::string_view sv, boost::system::error_code& ec) -{ - char* p = reinterpret_cast(&obj.x); - std::copy(std::cbegin(sv), std::cbegin(sv) + sizeof obj.x, p); - std::copy(std::cbegin(sv) + sizeof obj.x, std::cend(sv), std::back_inserter(obj.y)); -} - -std::ostream& operator<<(std::ostream& os, mystruct const& obj) -{ - os << "x: " << obj.x << ", y: " << obj.y; - return os; -} - -bool operator<(mystruct const& a, mystruct const& b) -{ - return std::tie(a.x, a.y) < std::tie(b.x, b.y); -} diff --git a/examples/print.hpp b/examples/print.hpp index 806da7aa..542cbf13 100644 --- a/examples/print.hpp +++ b/examples/print.hpp @@ -39,11 +39,11 @@ void print(std::vector const& cont) template void print(std::set const& cont) { - for (auto const& e: cont) std::cout << e << " "; - std::cout << "\n"; + for (auto const& e: cont) std::cout << e << "\n"; } -void print(std::map const& cont) +template +void print(std::map const& cont) { for (auto const& e: cont) std::cout << e.first << ": " << e.second << "\n";