kea-custom-hooks
FeM custom hooks libraries for Kea DHCP
HiredisAdapter.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4#include <exception>
5#include <functional>
6#include <memory>
7#include <string>
8
9#include <hiredis/hiredis.h>
10
22{
23public:
24 using set_reply_t = std::unique_ptr<redisReply, std::function<void(redisReply*)>>;
28 using timeout_t = size_t;
29
30 constexpr static int REDIS_DEFAULT_PORT{6379};
31
37 inline HiredisAdapter(const std::string& srv_ip = "127.0.0.1", int port = REDIS_DEFAULT_PORT)
38 : server_ip(srv_ip), port(port){};
41 virtual ~HiredisAdapter();
42
56 virtual void connect();
57 virtual void disconnect();
58
59 virtual inline bool is_connected() const noexcept
60 {
61 return ctx != nullptr;
62 }
64
75 virtual set_reply_t set(const std::string& key, const std::string& value,
76 const timeout_t expire = 0);
77 virtual sadd_reply_t sadd(const std::string& key, const std::string& value,
78 const timeout_t expire = 0);
79
80 virtual void expire(const std::string& key, timeout_t expire);
81
82 virtual get_reply_t get(const std::string& key);
83 virtual smembers_reply_t smembers(const std::string& key);
85
86 virtual inline bool last_expire_has_failed() const noexcept
87 {
88 return last_expire_failed;
89 }
90
91private:
92 inline redisReply* generic_set(const std::string& command, const std::string& key,
93 const std::string& value);
94 inline redisReply* generic_read(const std::string& command, const std::string& key);
95
97 inline void assert_connected() const;
99 inline void assert_valid_redis_reply(const void* reply, const std::string& command = "");
100
101 std::string server_ip;
102 int port;
103
104 redisContext* ctx{nullptr};
105
106 bool last_expire_failed{false};
107};
108
110class HiredisException : public std::exception
111{
112public:
113 inline HiredisException(const std::string& msg) : msg(msg)
114 {}
115
116 inline const char* what() const noexcept
117 {
118 return msg.c_str();
119 }
120
121private:
122 std::string msg;
123};
A wrapper for the hiredis C interface with multi-client support.
HiredisAdapter(const std::string &srv_ip="127.0.0.1", int port=REDIS_DEFAULT_PORT)
Initialize the adapter.
virtual bool last_expire_has_failed() const noexcept
virtual void disconnect()
virtual void expire(const std::string &key, timeout_t expire)
set_reply_t get_reply_t
virtual sadd_reply_t sadd(const std::string &key, const std::string &value, const timeout_t expire=0)
virtual ~HiredisAdapter()
HiredisAdapter(const HiredisAdapter &)=delete
virtual smembers_reply_t smembers(const std::string &key)
set_reply_t smembers_reply_t
set_reply_t sadd_reply_t
virtual void connect()
Connect to the Redis server.
virtual get_reply_t get(const std::string &key)
static constexpr int REDIS_DEFAULT_PORT
virtual set_reply_t set(const std::string &key, const std::string &value, const timeout_t expire=0)
HiredisAdapter(HiredisAdapter &&)=default
virtual bool is_connected() const noexcept
std::unique_ptr< redisReply, std::function< void(redisReply *)> > set_reply_t
A problem has occured whilst interacting with Redis.
const char * what() const noexcept
HiredisException(const std::string &msg)