Merge in Adam's bug case.
[awesomized/libmemcached] / libmemcached / memcached.hpp
index d093192db138bc2176cdf128a408977e01b0636c..46573f4959b2aab0a874da0eae407965fb2360a3 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <string.h>
 
+#include <sstream>
 #include <string>
 #include <vector>
 #include <map>
@@ -37,15 +38,49 @@ public:
 
   Memcache() 
     : 
+      servers_list(),
       memc(),
+      servers(NULL),
       result()
   {
     memcached_create(&memc);
   }
 
+  Memcache(const std::string &in_servers_list)
+    :
+      servers_list(in_servers_list),
+      memc(),
+      servers(NULL),
+      result()
+  {
+    memcached_create(&memc);
+    servers= memcached_servers_parse(servers_list.c_str());
+    memcached_server_push(&memc, servers);
+  }
+
+  Memcache(const std::string &hostname,
+           unsigned int port)
+    :
+      servers_list(),
+      memc(),
+      servers(NULL),
+      result()
+  {
+    memcached_create(&memc);
+    servers_list.append(hostname);
+    servers_list.append(":");
+    std::ostringstream strsmt;
+    strsmt << port;
+    servers_list.append(strsmt.str());
+    servers= memcached_servers_parse(servers_list.c_str());
+    memcached_server_push(&memc, servers);
+  }
+
   Memcache(memcached_st *clone) 
     : 
+      servers_list(),
       memc(),
+      servers(NULL),
       result()
   {
     memcached_clone(&memc, clone);
@@ -53,15 +88,31 @@ public:
 
   Memcache(const Memcache &rhs)
     :
+      servers_list(rhs.servers_list),
       memc(),
+      servers(NULL),
       result()
   {
     memcached_clone(&memc, const_cast<memcached_st *>(&rhs.getImpl()));
+    servers= memcached_servers_parse(servers_list.c_str());
+    memcached_server_push(&memc, servers);
+  }
+
+  Memcache &operator=(const Memcache &rhs)
+  {
+    if (this != &rhs)
+    {
+      memcached_clone(&memc, const_cast<memcached_st *>(&rhs.getImpl()));
+      servers= memcached_servers_parse(servers_list.c_str());
+      memcached_server_push(&memc, servers);
+    }
+    return *this;
   }
 
   ~Memcache()
   {
     memcached_free(&memc);
+    memcached_server_list_free(servers);
   }
 
   /**
@@ -92,6 +143,76 @@ public:
     return memcached_strerror(NULL, rc);
   }
 
+  /**
+   * Return the string which contains the list of memcached servers being
+   * used.
+   *
+   * @return a std::string containing the list of memcached servers
+   */
+  const std::string getServersList() const
+  {
+    return servers_list;
+  }
+
+  /**
+   * Set the list of memcached servers to use.
+   *
+   * @param[in] in_servers_list list of servers
+   * @return true on success; false otherwise
+   */
+  bool setServers(const std::string &in_servers_list)
+  {
+    servers_list.assign(in_servers_list);
+    servers= memcached_servers_parse(in_servers_list.c_str());
+    memcached_server_push(&memc, servers);
+    return (servers == NULL);
+  }
+
+  /**
+   * 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
+   * @return true on success; false otherwise
+   */
+  bool addServer(const std::string &server_name, unsigned int port)
+  {
+    memcached_return rc;
+    std::ostringstream strstm;
+    servers_list.append(",");
+    servers_list.append(server_name);
+    servers_list.append(":");
+    strstm << port;
+    servers_list.append(strstm.str());
+    servers= memcached_server_list_append(servers,
+                                          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);
+  }
+
   /**
    * Fetches an individual value from the server. mget() must always
    * be called before using this method.
@@ -348,9 +469,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;
@@ -799,7 +919,9 @@ public:
 
 private:
 
+  std::string servers_list;
   memcached_st memc;
+  memcached_server_st *servers;
   memcached_result_st result;
 };