Updating the mget function in the C++ interface to take a std::vector of
authorPadraig O'Sullivan <osullivan.padraig@gmail.com>
Sat, 11 Jul 2009 17:38:57 +0000 (13:38 -0400)
committerPadraig O'Sullivan <osullivan.padraig@gmail.com>
Sat, 11 Jul 2009 17:38:57 +0000 (13:38 -0400)
keys as input instead of an array of char *.

libmemcached/memcached.hh

index d777e1392ef71001cfeabfb32fdbe8879c618257..08aa8442134ee4d0444895e0b85ff5bf166545b8 100644 (file)
@@ -1,6 +1,7 @@
 #include <libmemcached/memcached.h>
 
 #include <string>
+#include <vector>
 
 class Memcached
 {
@@ -75,12 +76,41 @@ public:
     return ret_val;
   }
 
-  bool mget(char **keys, size_t *key_length, 
-            unsigned int number_of_keys)
+  bool mget(std::vector<std::string> &keys)
   {
+    /*
+     * Construct an array which will contain the length
+     * of each of the strings in the input vector. Also, to
+     * interface with the memcached C API, we need to convert
+     * the vector of std::string's to a vector of char *.
+     */
+    size_t *key_len= static_cast<size_t *>(malloc(keys.size() * sizeof(size_t)));
+    if (key_len == NULL)
+    {
+      return false;
+    }
+    std::vector<char *> real_keys;
+    std::vector<std::string>::iterator it= keys.begin();
+    int i= 0;
+    while (it != keys.end())
+    {
+      real_keys.push_back(const_cast<char *>((*it).c_str()));
+      key_len[i++]= (*it).length();
+      ++it;
+    }
 
-    memcached_return rc= memcached_mget(&memc, keys, key_length, number_of_keys);
-    return (rc == MEMCACHED_SUCCESS);
+    /*
+     * If the std::vector of keys is empty then we cannot 
+     * call memcached_mget as we will get undefined behavior.
+     */
+    if (!real_keys.empty())
+    {
+      memcached_return rc= memcached_mget(&memc, &real_keys[0], key_len, 
+                                          static_cast<unsigned int>(real_keys.size()));
+      return (rc == MEMCACHED_SUCCESS);
+    }
+
+    return false;
   }
 
   bool set(const std::string &key, const std::string &value)