query/source/core/net/connector.cpp

84 lines
1.7 KiB
C++

#include "matador/logger/log_manager.hpp"
#include "matador/net/connector.hpp"
#include "matador/net/reactor.hpp"
#include "matador/utils/os.hpp"
#include <utility>
namespace matador {
connector::connector()
: log_(matador::create_logger("Connector"))
{}
connector::connector(t_connect_handler on_new_connection)
: connect_handler_(std::move(on_new_connection))
, log_(matador::create_logger("Connector"))
{}
void connector::connect(reactor &r, const std::vector<tcp::peer> &endpoints)
{
endpoints_ = endpoints;
r.schedule_timer(shared_from_this(), 0, 3);
}
void connector::connect(reactor &r, const std::vector<tcp::peer> &endpoints, t_connect_handler on_new_connection)
{
connect_handler_ = std::move(on_new_connection);
connect(r, endpoints);
}
socket_type connector::handle() const
{
return 0;
}
void connector::on_timeout()
{
tcp::socket stream;
for (const auto &ep : endpoints_) {
if (!ep.addr().is_v4()) {
continue;
}
auto ret = matador::connect(stream, ep);
if (ret != 0) {
char error_buffer[1024];
log_.error("couldn't establish connection to: %s", ep.to_string().c_str(), os::strerror(errno, error_buffer, 1024));
continue;
} else {
log_.info("connection established to %s (fd: %d)", ep.to_string().c_str(), stream.id());
}
stream.non_blocking(true);
auto h = connect_handler_(stream, ep, this);
get_reactor()->register_handler(h, event_type::READ_WRITE_MASK);
get_reactor()->cancel_timer(shared_from_this());
break;
}
endpoints_.clear();
}
bool connector::is_ready_write() const
{
return false;
}
bool connector::is_ready_read() const
{
return false;
}
void connector::notify_close(handler *)
{
}
std::string connector::name() const
{
return "connector";
}
}