kea-custom-hooks
FeM custom hooks libraries for Kea DHCP
HiredisAdapter.cpp
Go to the documentation of this file.
1#include <stdexcept>
2
3#include "HiredisAdapter.hpp"
4
6{
7 if (is_connected()) {
9 }
10}
11
13{
14 if (is_connected()) {
15 return;
16 }
17
18 ctx = redisConnect(server_ip.c_str(), port);
19
20 if (ctx == nullptr) {
21 throw HiredisException("HiredisAdapter::connect(): Couldn't allocate redis context");
22 }
23
24 if (ctx->err) {
25 throw HiredisException(std::string("HiredisAdapter::connect(): Error: ") + ctx->errstr);
26 }
27}
28
30{
31 if (is_connected()) {
32 redisFree(ctx);
33 }
34
35 ctx = nullptr;
36}
37
38HiredisAdapter::set_reply_t HiredisAdapter::set(const std::string& key, const std::string& value,
39 const timeout_t expire_timeout)
40{
41 redisReply* reply = generic_set("SET", key, value);
42 expire(key, expire_timeout);
43
44 return set_reply_t{reply, freeReplyObject};
45}
46
47HiredisAdapter::sadd_reply_t HiredisAdapter::sadd(const std::string& key, const std::string& value,
48 const timeout_t expire_timeout)
49{
50 redisReply* reply = generic_set("SADD", key, value);
51 expire(key, expire_timeout);
52
53 return sadd_reply_t{reply, freeReplyObject};
54}
55
56void HiredisAdapter::expire(const std::string& key, const timeout_t expire)
57{
58 if (expire == 0) {
59 return;
60 }
61
62 assert_connected();
63
64 void* reply = redisCommand(ctx, "EXPIRE %s %lld", key.c_str(), expire);
65
66 last_expire_failed = (reply == nullptr);
67 freeReplyObject(reply);
68}
69
71{
72 redisReply* reply = generic_read("GET", key);
73
74 return get_reply_t{reply, freeReplyObject};
75}
76
78{
79 redisReply* reply = generic_read("SMEMBERS", key);
80
81 return get_reply_t{reply, freeReplyObject};
82}
83
84inline redisReply* HiredisAdapter::generic_set(const std::string& command, const std::string& key,
85 const std::string& value)
86{
87 assert_connected();
88
89 void* raw_reply = redisCommand(ctx, (command + " %s %s").c_str(), key.c_str(), value.c_str());
90 assert_valid_redis_reply(raw_reply, command);
91
92 return static_cast<redisReply*>(raw_reply);
93}
94
95inline redisReply* HiredisAdapter::generic_read(const std::string& command, const std::string& key)
96{
97 assert_connected();
98
99 void* raw_reply = redisCommand(ctx, (command + " %s").c_str(), key.c_str());
100 assert_valid_redis_reply(raw_reply, command);
101
102 return static_cast<redisReply*>(raw_reply);
103}
104
105inline void HiredisAdapter::assert_connected() const
106{
107 if (!is_connected()) {
108 throw HiredisException("HiredisAdapter::assert_connected(): Not connected");
109 }
110}
111
112inline void HiredisAdapter::assert_valid_redis_reply(const void* reply, const std::string& command)
113{
114 if (reply != nullptr) {
115 return;
116 }
117
118 std::string errstr = ctx->errstr;
119 disconnect();
120 throw HiredisException("HiredisAdapter::assert_valid_redis_reply(): " + command
121 + " failed due to error: " + errstr);
122}
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()
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)
virtual set_reply_t set(const std::string &key, const std::string &value, const timeout_t expire=0)
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.