11#include " ../includes/async_redis/connection.hpp"
22
3- #include < queue>
4- #include < functional>
5- #include < memory>
6- #include < tuple>
73
84#include < async_redis/parser/base_resp_parser.h>
9- #include < libevpp/network/tcp_socket.hpp>
10- #include < libevpp/network/unix_socket.hpp>
11-
125
136namespace async_redis
147{
158
16- using tcp_socket = network::tcp_socket;
17- using unix_socket = network::unix_socket;
18-
19- connection::connection (event_loop::event_loop_ev& event_loop)
20- : event_loop_(event_loop) {
21- }
9+ connection::connection (asio::io_context& io)
10+ : socket_(io)
11+ { }
2212
23- void connection::connect (async_socket:: connect_handler_t handler, const std::string& ip, int port)
13+ void connection::connect (connect_handler_t handler, const std::string& ip, int port)
2414{
25- if (!socket_ || !socket_->is_valid ())
26- socket_ = std::make_unique<tcp_socket>(event_loop_);
15+ asio::ip::tcp::endpoint endpoint (asio::ip::address::from_string (ip), port);
2716
28- static_cast <tcp_socket*>(socket_.get ())->async_connect (ip, port, handler);
29- }
30-
31- void connection::connect (async_socket::connect_handler_t handler, const std::string& path)
32- {
33- if (!socket_ || !socket_->is_valid ())
34- socket_ = std::make_unique<unix_socket>(event_loop_);
35-
36- static_cast <unix_socket*>(socket_.get ())->async_connect (path, handler);
17+ socket_.async_connect (endpoint, [handler, this ](const asio::error_code &ec) {
18+ is_connected_ = !ec;
19+ handler (!ec);
20+ });
3721}
3822
3923bool connection::is_connected () const
4024{
41- return socket_ && socket_-> is_connected () ;
25+ return is_connected_ ;
4226}
4327
4428void connection::disconnect ()
4529{
46- socket_-> close ();
30+ socket_. close ();
4731 // TODO: check the policy! Should we free queue or retry again?
4832 decltype (req_queue_) free_me;
4933 free_me.swap (req_queue_);
34+ is_connected_ = false ;
5035}
5136
5237bool connection::pipelined_send (std::string&& pipelined_cmds, std::vector<reply_cb_t >&& callbacks)
5338{
5439 if (!is_connected ())
5540 return false ;
5641
57- return
58- socket_->async_write (pipelined_cmds, [this , cbs = std::move (callbacks)](ssize_t sent_chunk_len) {
59- if (sent_chunk_len == 0 )
42+ socket_.async_send (asio::buffer (pipelined_cmds.data (), pipelined_cmds.length ()),
43+ [this , cbs = std::move (callbacks)](const asio::error_code &ec, size_t len)
44+ {
45+ if (ec)
6046 return disconnect ();
6147
6248 if (!req_queue_.size () && cbs.size ())
6349 do_read ();
6450
6551 for (auto &&cb : cbs)
6652 req_queue_.emplace (std::move (cb), nullptr );
67- });
53+ }
54+ );
55+
56+ return true ;
6857}
6958
7059bool connection::send (const std::string&& command, const reply_cb_t & reply_cb)
@@ -75,24 +64,36 @@ bool connection::send(const std::string&& command, const reply_cb_t& reply_cb)
7564 bool read_it = !req_queue_.size ();
7665 req_queue_.emplace (reply_cb, nullptr );
7766
78- return
79- socket_->async_write (std::move (command), [this , read_it](ssize_t sent_chunk_len) {
80- if (sent_chunk_len == 0 )
67+ socket_.async_send (asio::buffer (command.data (), command.length ()),
68+ [this , read_it](const asio::error_code &ec, size_t len)
69+ {
70+ // std::cout << ec << std::endl;
71+ if (ec)
8172 return disconnect ();
8273
83- if (read_it)
84- do_read ();
85- });
74+ if (read_it)
75+ do_read ();
76+ }
77+ );
78+ return true ;
8679}
8780
8881void connection::do_read ()
8982{
90- socket_->async_read (data_, max_data_size, std::bind (&connection::reply_received, this , std::placeholders::_1));
83+ socket_.async_read_some (
84+ asio::buffer (data_, max_data_size),
85+ std::bind (
86+ &connection::reply_received,
87+ this ,
88+ std::placeholders::_1,
89+ std::placeholders::_2
90+ )
91+ );
9192}
9293
93- void connection::reply_received (ssize_t len)
94+ void connection::reply_received (const asio::error_code& ec, size_t len)
9495{
95- if (len == 0 )
96+ if (ec )
9697 return disconnect ();
9798
9899 ssize_t acc = 0 ;
0 commit comments