1 #include "MemcachedCluster.hpp"
4 const memcached_st
MemcachedCluster::empty_memc
{};
6 void MemcachedCluster::init() {
7 REQUIRE(cluster
.start());
9 REQUIRE(memcached_create(&memc
));
10 for (const auto &server
: cluster
.getServers()) {
11 auto target
= server
.getSocketOrPort();
12 if (holds_alternative
<string
>(target
)) {
13 REQUIRE(MEMCACHED_SUCCESS
== memcached_server_add_unix_socket(&memc
, get
<string
>(target
).c_str()));
15 REQUIRE(MEMCACHED_SUCCESS
== memcached_server_add(&memc
, "localhost", get
<int>(target
)));
19 Retry
cluster_is_listening([this]() {
20 return cluster
.isListening();
22 REQUIRE(cluster_is_listening());
25 MemcachedCluster::~MemcachedCluster() {
26 if (memcmp(&memc
, &empty_memc
, sizeof(memc
))) {
27 memcached_free(&memc
);
31 void MemcachedCluster::flush() {
32 REQUIRE(MEMCACHED_SUCCESS
== memcached_flush(&memc
, 0));
35 MemcachedCluster::MemcachedCluster()
37 getenv_else("MEMCACHED_BINARY", "memcached"),
38 {random_socket_or_port_arg()}
44 MemcachedCluster::MemcachedCluster(Cluster
&&cluster_
)
45 : cluster
{forward
<Cluster
>(cluster_
)}
50 MemcachedCluster
MemcachedCluster::mixed() {
51 return MemcachedCluster
{};
54 MemcachedCluster
MemcachedCluster::network() {
55 return MemcachedCluster
{Cluster
{Server
{
56 getenv_else("MEMCACHED_BINARY", "memcached"),
57 {"-p", random_socket_or_port_string
}
61 MemcachedCluster
MemcachedCluster::socket() {
62 return MemcachedCluster
{Cluster
{Server
{
63 getenv_else("MEMCACHED_BINARY", "memcached"),
64 {"-s", random_socket_or_port_string
}
68 void MemcachedCluster::enableBinaryProto(bool enable
) {
69 REQUIRE(MEMCACHED_SUCCESS
== memcached_behavior_set(&memc
,
70 MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
, enable
));
73 MemcachedCluster::MemcachedCluster(MemcachedCluster
&&mc
)
79 MemcachedCluster
&MemcachedCluster::operator=(MemcachedCluster
&&mc
) {
80 cluster
= move(mc
.cluster
);
81 memcached_clone(&memc
, &mc
.memc
);
82 returns
= ReturnMatcher
{&memc
};
86 ReturnMatcher
&ReturnMatcher::operator=(ReturnMatcher
&&rm
) {
87 memc
= exchange(rm
.memc
, nullptr);
88 expected
= rm
.expected
;
92 bool ReturnMatcher::match(const memcached_return_t
&arg
) const {
93 return arg
== expected
;
96 ReturnMatcher
ReturnMatcher::success() {
97 return ReturnMatcher
{memc
};
100 ReturnMatcher
ReturnMatcher::operator()(memcached_return_t expected_
) {
101 return ReturnMatcher
{memc
, expected_
};
104 string
ReturnMatcher::describe() const {
105 return "is " + to_string(expected
)
106 + "\n actual: " + memcached_last_error_message(memc
);
109 ReturnMatcher::ReturnMatcher(ReturnMatcher
&&rm
) {