mirror of
https://github.com/KingDuckZ/dindexer.git
synced 2025-07-02 14:04:22 +00:00
Add on_connect/on_disconnect hiredis callbacks.
This commit is contained in:
parent
29e2375e3b
commit
40e189cf4d
2 changed files with 35 additions and 5 deletions
|
@ -43,17 +43,34 @@ namespace redis {
|
||||||
#endif
|
#endif
|
||||||
} //unnamed namespace
|
} //unnamed namespace
|
||||||
|
|
||||||
|
void on_connect (const redisAsyncContext* parContext, int parStatus) {
|
||||||
|
assert(parContext and parContext->data);
|
||||||
|
Command& self = *static_cast<Command*>(parContext->data);
|
||||||
|
|
||||||
|
self.m_connection_lost = false;
|
||||||
|
self.m_connected = (parStatus == REDIS_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
void on_disconnect (const redisAsyncContext* parContext, int parStatus) {
|
||||||
|
assert(parContext and parContext->data);
|
||||||
|
Command& self = *static_cast<Command*>(parContext->data);
|
||||||
|
assert(self.m_connected);
|
||||||
|
|
||||||
|
self.m_connection_lost = (REDIS_ERR == parStatus);
|
||||||
|
self.m_connected = false;
|
||||||
|
};
|
||||||
|
|
||||||
Command::Command (std::string&& parAddress, uint16_t parPort) :
|
Command::Command (std::string&& parAddress, uint16_t parPort) :
|
||||||
m_conn(nullptr, &redisAsyncDisconnect),
|
m_conn(nullptr, &redisAsyncDisconnect),
|
||||||
m_address(std::move(parAddress)),
|
m_address(std::move(parAddress)),
|
||||||
m_port(parPort)
|
m_port(parPort),
|
||||||
|
m_connected(false),
|
||||||
|
m_connection_lost(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Command::Command (std::string&& parSocket) :
|
Command::Command (std::string&& parSocket) :
|
||||||
m_conn(nullptr, &redisAsyncDisconnect),
|
Command(std::move(parSocket), 0)
|
||||||
m_address(std::move(parSocket),
|
|
||||||
m_port(0)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,12 +92,19 @@ namespace redis {
|
||||||
oss << "Unable to connect to Redis server at " << m_address << ':' << m_port;
|
oss << "Unable to connect to Redis server at " << m_address << ':' << m_port;
|
||||||
throw std::runtime_error(oss.str());
|
throw std::runtime_error(oss.str());
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
conn->data = this;
|
||||||
|
}
|
||||||
if (conn->err) {
|
if (conn->err) {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << "Unable to connect to Redis server at " << m_address << ':' << m_port <<
|
oss << "Unable to connect to Redis server at " << m_address << ':' << m_port <<
|
||||||
": " << conn->errstr;
|
": " << conn->errstr;
|
||||||
throw std::runtime_error(oss.str());
|
throw std::runtime_error(oss.str());
|
||||||
}
|
}
|
||||||
|
if (REDIS_OK != redisAsyncSetConnectCallback(conn.get(), &on_connect))
|
||||||
|
throw std::runtime_error("Unable to set \"on_connect()\" callback");
|
||||||
|
if (REDIS_OK != redisAsyncSetDisconnectCallback(conn.get(), &on_disconnect))
|
||||||
|
throw std::runtime_error("Unable to set \"on_disconnect()\" callback");
|
||||||
std::swap(conn, m_conn);
|
std::swap(conn, m_conn);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -90,7 +114,9 @@ namespace redis {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Command::is_connected() const {
|
bool Command::is_connected() const {
|
||||||
return m_conn and not m_conn->err;
|
const bool connected = m_conn and not m_conn->err and m_connected;
|
||||||
|
assert(not m_connection_lost or connected);
|
||||||
|
return connected;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Command::scan() -> scan_range {
|
auto Command::scan() -> scan_range {
|
||||||
|
|
|
@ -44,6 +44,8 @@ struct redisAsyncContext;
|
||||||
|
|
||||||
namespace redis {
|
namespace redis {
|
||||||
class Command {
|
class Command {
|
||||||
|
friend void on_connect ( const redisAsyncContext*, int );
|
||||||
|
friend void on_disconnect ( const redisAsyncContext*, int );
|
||||||
public:
|
public:
|
||||||
typedef ScanIterator<ScanSingleValues<std::string>> scan_iterator;
|
typedef ScanIterator<ScanSingleValues<std::string>> scan_iterator;
|
||||||
typedef boost::iterator_range<scan_iterator> scan_range;
|
typedef boost::iterator_range<scan_iterator> scan_range;
|
||||||
|
@ -91,6 +93,8 @@ namespace redis {
|
||||||
#endif
|
#endif
|
||||||
std::string m_address;
|
std::string m_address;
|
||||||
uint16_t m_port;
|
uint16_t m_port;
|
||||||
|
bool m_connected;
|
||||||
|
bool m_connection_lost;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename... Args>
|
template <typename... Args>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue