X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fmemcached.hpp;h=d7086b4ce301ea11a876fdcb3a20f8b0831a009a;hb=a7a011c2ea4a63368b3a96a332da00820ed402cb;hp=a101da349073ce4910bdecacef4ed7188eb6c1b6;hpb=fa50444663754645f6c03c67a3d60cb928562086;p=m6w6%2Flibmemcached diff --git a/libmemcached/memcached.hpp b/libmemcached/memcached.hpp index a101da34..d7086b4c 100644 --- a/libmemcached/memcached.hpp +++ b/libmemcached/memcached.hpp @@ -55,6 +55,7 @@ public: { memcached_create(&memc); servers= memcached_servers_parse(servers_list.c_str()); + memcached_server_push(&memc, servers); } Memcache(const std::string &hostname, @@ -72,6 +73,7 @@ public: strsmt << port; servers_list.append(strsmt.str()); servers= memcached_servers_parse(servers_list.c_str()); + memcached_server_push(&memc, servers); } Memcache(memcached_st *clone) @@ -93,6 +95,7 @@ public: { memcached_clone(&memc, const_cast(&rhs.getImpl())); servers= memcached_servers_parse(servers_list.c_str()); + memcached_server_push(&memc, servers); } Memcache &operator=(const Memcache &rhs) @@ -101,6 +104,7 @@ public: { memcached_clone(&memc, const_cast(&rhs.getImpl())); servers= memcached_servers_parse(servers_list.c_str()); + memcached_server_push(&memc, servers); } return *this; } @@ -160,6 +164,7 @@ public: { servers_list.assign(in_servers_list); servers= memcached_servers_parse(in_servers_list.c_str()); + memcached_server_push(&memc, servers); return (servers == NULL); } @@ -167,7 +172,7 @@ public: * Add a server to the list of memcached servers to use. * * @param[in] server_name name of the server to add - * @param[in[ port port number of server to add + * @param[in] port port number of server to add * @return true on success; false otherwise */ bool addServer(const std::string &server_name, unsigned int port) @@ -183,6 +188,28 @@ public: server_name.c_str(), port, &rc); + memcached_server_push(&memc, servers); + return (rc == MEMCACHED_SUCCESS); + } + + /** + * Remove a server from the list of memcached servers to use. + * + * @param[in] server_name name of the server to remove + * @param[in] port port number of server to remove + * @return true on success; false otherwise + */ + bool removeServer(const std::string &server_name, size_t port) + { + std::string tmp_str; + std::ostringstream strstm; + tmp_str.append(","); + tmp_str.append(server_name); + tmp_str.append(":"); + strstm << port; + tmp_str.append(strstm.str()); + memcached_server_st *server= memcached_servers_parse(tmp_str.c_str()); + memcached_return rc= memcached_server_remove(server); return (rc == MEMCACHED_SUCCESS); } @@ -209,7 +236,13 @@ public: ret_val.reserve(value_length); ret_val.assign(value, value + value_length); key.assign(ret_key); + free(value); + } + else if (value) + { + free(value); } + return rc; } @@ -238,6 +271,7 @@ public: { ret_val.reserve(value_length); ret_val.assign(value, value + value_length); + free(value); return true; } return false; @@ -275,6 +309,7 @@ public: { ret_val.reserve(value_length); ret_val.assign(value, value + value_length); + free(value); return true; } return false; @@ -442,9 +477,8 @@ public: retval= set(it->first, it->second, expiration, flags); if (retval == false) { - char err_buff[64]; - sprintf(err_buff, "There was an error setting the key %s", - it->first.c_str()); + std::string err_buff("There was an error setting the key "); + err_buff.append(it->first); throw(Error(err_buff, false)); } ++it; @@ -891,6 +925,60 @@ public: return version; } + /** + * Retrieve memcached statistics. Populate a std::map with the retrieved + * stats. Each server will map to another std::map of the key:value stats. + * + * @param[out] stats_map a std::map to be populated with the memcached + * stats + * @return true on success; false otherwise + */ + bool getStats(std::map< std::string, std::map > + &stats_map) + { + memcached_return rc; + memcached_stat_st *stats= memcached_stat(&memc, NULL, &rc); + + if (rc != MEMCACHED_SUCCESS && + rc != MEMCACHED_SOME_ERRORS) + { + return false; + } + + uint32_t server_count= memcached_server_count(&memc); + + /* + * For each memcached server, construct a std::map for its stats and add + * it to the std::map of overall stats. + */ + for (uint32_t x= 0; x < server_count; x++) + { + std::ostringstream strstm; + std::string server_name(memcached_server_name(&memc, servers[x])); + server_name.append(":"); + strstm << memcached_server_port(&memc, servers[x]); + server_name.append(strstm.str()); + + std::map server_stats; + char **list= NULL; + char **ptr= NULL; + + list= memcached_stat_get_keys(&memc, &stats[x], &rc); + for (ptr= list; *ptr; ptr++) + { + char *value= memcached_stat_get_value(&memc, &stats[x], *ptr, &rc); + server_stats[*ptr]= value; + free(value); + } + + stats_map[server_name]= server_stats; + free(list); + } + + memcached_stat_free(&memc, stats); + return true; + } + private: std::string servers_list;