92 lines
2.5 KiB
C
Raw Permalink Normal View History

2024-03-08 14:03:37 +08:00
#ifndef MUDUO_CONTRIB_HIREDIS_HIREDIS_H
#define MUDUO_CONTRIB_HIREDIS_HIREDIS_H
#include "muduo/base/noncopyable.h"
#include "muduo/base/StringPiece.h"
#include "muduo/base/Types.h"
#include "muduo/net/Callbacks.h"
#include "muduo/net/InetAddress.h"
#include <hiredis/hiredis.h>
struct redisAsyncContext;
namespace muduo
{
namespace net
{
class Channel;
class EventLoop;
}
}
namespace hiredis
{
class Hiredis : public std::enable_shared_from_this<Hiredis>,
muduo::noncopyable
{
public:
typedef std::function<void(Hiredis*, int)> ConnectCallback;
typedef std::function<void(Hiredis*, int)> DisconnectCallback;
typedef std::function<void(Hiredis*, redisReply*)> CommandCallback;
Hiredis(muduo::net::EventLoop* loop, const muduo::net::InetAddress& serverAddr);
~Hiredis();
const muduo::net::InetAddress& serverAddress() const { return serverAddr_; }
// redisAsyncContext* context() { return context_; }
bool connected() const;
const char* errstr() const;
void setConnectCallback(const ConnectCallback& cb) { connectCb_ = cb; }
void setDisconnectCallback(const DisconnectCallback& cb) { disconnectCb_ = cb; }
void connect();
void disconnect(); // FIXME: implement this with redisAsyncDisconnect
int command(const CommandCallback& cb, muduo::StringArg cmd, ...);
int ping();
private:
void handleRead(muduo::Timestamp receiveTime);
void handleWrite();
int fd() const;
void logConnection(bool up) const;
void setChannel();
void removeChannel();
void connectCallback(int status);
void disconnectCallback(int status);
void commandCallback(redisReply* reply, CommandCallback* privdata);
static Hiredis* getHiredis(const redisAsyncContext* ac);
static void connectCallback(const redisAsyncContext* ac, int status);
static void disconnectCallback(const redisAsyncContext* ac, int status);
// command callback
static void commandCallback(redisAsyncContext* ac, void*, void*);
static void addRead(void* privdata);
static void delRead(void* privdata);
static void addWrite(void* privdata);
static void delWrite(void* privdata);
static void cleanup(void* privdata);
void pingCallback(Hiredis* me, redisReply* reply);
private:
muduo::net::EventLoop* loop_;
const muduo::net::InetAddress serverAddr_;
redisAsyncContext* context_;
std::shared_ptr<muduo::net::Channel> channel_;
ConnectCallback connectCb_;
DisconnectCallback disconnectCb_;
};
} // namespace hiredis
#endif // MUDUO_CONTRIB_HIREDIS_HIREDIS_H