2 * Summary: C++ interface for memcached server
4 * Copy: See Copyright for the status of this software.
6 * Authors: Padraig O'Sullivan <osullivan.padraig@gmail.com>
7 * Patrick Galbraith <patg@patg.net>
12 * @brief Libmemcached C++ interface
15 #ifndef LIBMEMCACHEDPP_H
16 #define LIBMEMCACHEDPP_H
18 #include <libmemcached/memcached.h>
19 #include <libmemcached/exception.hpp>
32 * This is the core memcached library (if later, other objects
33 * are needed, they will be created from this class).
46 memcached_create(&memc);
49 Memcache(const std::string &in_servers_list)
51 servers_list(in_servers_list),
56 memcached_create(&memc);
57 servers= memcached_servers_parse(servers_list.c_str());
58 memcached_server_push(&memc, servers);
61 Memcache(const std::string &hostname,
69 memcached_create(&memc);
70 servers_list.append(hostname);
71 servers_list.append(":");
72 std::ostringstream strsmt;
74 servers_list.append(strsmt.str());
75 servers= memcached_servers_parse(servers_list.c_str());
76 memcached_server_push(&memc, servers);
79 Memcache(memcached_st *clone)
86 memcached_clone(&memc, clone);
89 Memcache(const Memcache &rhs)
91 servers_list(rhs.servers_list),
96 memcached_clone(&memc, const_cast<memcached_st *>(&rhs.getImpl()));
97 servers= memcached_servers_parse(servers_list.c_str());
98 memcached_server_push(&memc, servers);
101 Memcache &operator=(const Memcache &rhs)
105 memcached_clone(&memc, const_cast<memcached_st *>(&rhs.getImpl()));
106 servers= memcached_servers_parse(servers_list.c_str());
107 memcached_server_push(&memc, servers);
114 memcached_free(&memc);
115 memcached_server_list_free(servers);
119 * Get the internal memcached_st *
121 memcached_st &getImpl()
127 * Get the internal memcached_st *
129 const memcached_st &getImpl() const
135 * Return an error string for the given return structure.
137 * @param[in] rc a memcached_return structure
138 * @return error string corresponding to given return code in the library.
140 const std::string getError(memcached_return rc) const
142 /* first parameter to strerror is unused */
143 return memcached_strerror(NULL, rc);
147 * Return the string which contains the list of memcached servers being
150 * @return a std::string containing the list of memcached servers
152 const std::string getServersList() const
158 * Set the list of memcached servers to use.
160 * @param[in] in_servers_list list of servers
161 * @return true on success; false otherwise
163 bool setServers(const std::string &in_servers_list)
165 servers_list.assign(in_servers_list);
166 servers= memcached_servers_parse(in_servers_list.c_str());
167 return (servers == NULL);
171 * Add a server to the list of memcached servers to use.
173 * @param[in] server_name name of the server to add
174 * @param[in[ port port number of server to add
175 * @return true on success; false otherwise
177 bool addServer(const std::string &server_name, unsigned int port)
180 std::ostringstream strstm;
181 servers_list.append(",");
182 servers_list.append(server_name);
183 servers_list.append(":");
185 servers_list.append(strstm.str());
186 servers= memcached_server_list_append(servers,
190 return (rc == MEMCACHED_SUCCESS);
194 * Fetches an individual value from the server. mget() must always
195 * be called before using this method.
197 * @param[in] key key of object to fetch
198 * @param[out] ret_val store returned object in this vector
199 * @return a memcached return structure
201 memcached_return fetch(std::string &key,
202 std::vector<char> &ret_val)
204 char ret_key[MEMCACHED_MAX_KEY];
205 size_t value_length= 0;
206 size_t key_length= 0;
209 char *value= memcached_fetch(&memc, ret_key, &key_length,
210 &value_length, &flags, &rc);
211 if (value && ret_val.empty())
213 ret_val.reserve(value_length);
214 ret_val.assign(value, value + value_length);
221 * Fetches an individual value from the server.
223 * @param[in] key key of object whose value to get
224 * @param[out] ret_val object that is retrieved is stored in
226 * @return true on success; false otherwise
228 bool get(const std::string &key,
229 std::vector<char> &ret_val) throw (Error)
233 size_t value_length= 0;
237 throw(Error("the key supplied is empty!", false));
239 char *value= memcached_get(&memc, key.c_str(), key.length(),
240 &value_length, &flags, &rc);
241 if (value != NULL && ret_val.empty())
243 ret_val.reserve(value_length);
244 ret_val.assign(value, value + value_length);
251 * Fetches an individual from a server which is specified by
252 * the master_key parameter that is used for determining which
253 * server an object was stored in if key partitioning was
256 * @param[in] master_key key that specifies server object is stored on
257 * @param[in] key key of object whose value to get
258 * @param[out] ret_val object that is retrieved is stored in
260 * @return true on success; false otherwise
262 bool getByKey(const std::string &master_key,
263 const std::string &key,
264 std::vector<char> &ret_val) throw(Error)
268 size_t value_length= 0;
270 if (master_key.empty() || key.empty())
272 throw(Error("the master key or key supplied is empty!", false));
274 char *value= memcached_get_by_key(&memc,
275 master_key.c_str(), master_key.length(),
276 key.c_str(), key.length(),
277 &value_length, &flags, &rc);
280 ret_val.reserve(value_length);
281 ret_val.assign(value, value + value_length);
288 * Selects multiple keys at once. This method always
289 * works asynchronously.
291 * @param[in] keys vector of keys to select
292 * @return true if all keys are found
294 bool mget(std::vector<std::string> &keys)
296 std::vector<const char *> real_keys;
297 std::vector<size_t> key_len;
299 * Construct an array which will contain the length
300 * of each of the strings in the input vector. Also, to
301 * interface with the memcached C API, we need to convert
302 * the vector of std::string's to a vector of char *.
304 real_keys.reserve(keys.size());
305 key_len.reserve(keys.size());
307 std::vector<std::string>::iterator it= keys.begin();
309 while (it != keys.end())
311 real_keys.push_back(const_cast<char *>((*it).c_str()));
312 key_len.push_back((*it).length());
317 * If the std::vector of keys is empty then we cannot
318 * call memcached_mget as we will get undefined behavior.
320 if (! real_keys.empty())
322 memcached_return rc= memcached_mget(&memc, &real_keys[0], &key_len[0],
324 return (rc == MEMCACHED_SUCCESS);
331 * Writes an object to the server. If the object already exists, it will
332 * overwrite the existing object. This method always returns true
333 * when using non-blocking mode unless a network error occurs.
335 * @param[in] key key of object to write to server
336 * @param[in] value value of object to write to server
337 * @param[in] expiration time to keep the object stored in the server for
338 * @param[in] flags flags to store with the object
339 * @return true on succcess; false otherwise
341 bool set(const std::string &key,
342 const std::vector<char> &value,
344 uint32_t flags) throw(Error)
346 if (key.empty() || value.empty())
348 throw(Error("the key or value supplied is empty!", false));
350 memcached_return rc= memcached_set(&memc,
351 key.c_str(), key.length(),
352 &value[0], value.size(),
354 return (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_BUFFERED);
358 * Writes an object to a server specified by the master_key parameter.
359 * If the object already exists, it will overwrite the existing object.
361 * @param[in] master_key key that specifies server to write to
362 * @param[in] key key of object to write to server
363 * @param[in] value value of object to write to server
364 * @param[in] expiration time to keep the object stored in the server for
365 * @param[in] flags flags to store with the object
366 * @return true on succcess; false otherwise
368 bool setByKey(const std::string &master_key,
369 const std::string &key,
370 const std::vector<char> &value,
372 uint32_t flags) throw(Error)
374 if (master_key.empty() ||
378 throw(Error("the key or value supplied is empty!", false));
380 memcached_return rc= memcached_set_by_key(&memc, master_key.c_str(),
382 key.c_str(), key.length(),
383 &value[0], value.size(),
386 return (rc == MEMCACHED_SUCCESS);
390 * Writes a list of objects to the server. Objects are specified by
391 * 2 vectors - 1 vector of keys and 1 vector of values.
393 * @param[in] keys vector of keys of objects to write to server
394 * @param[in] values vector of values of objects to write to server
395 * @param[in] expiration time to keep the objects stored in server for
396 * @param[in] flags flags to store with the objects
397 * @return true on success; false otherwise
399 bool setAll(std::vector<std::string> &keys,
400 std::vector< std::vector<char> *> &values,
402 uint32_t flags) throw(Error)
404 if (keys.size() != values.size())
406 throw(Error("The number of keys and values do not match!", false));
409 std::vector<std::string>::iterator key_it= keys.begin();
410 std::vector< std::vector<char> *>::iterator val_it= values.begin();
411 while (key_it != keys.end())
413 retval= set((*key_it), *(*val_it), expiration, flags);
425 * Writes a list of objects to the server. Objects are specified by
426 * a map of keys to values.
428 * @param[in] key_value_map map of keys and values to store in server
429 * @param[in] expiration time to keep the objects stored in server for
430 * @param[in] flags flags to store with the objects
431 * @return true on success; false otherwise
433 bool setAll(std::map<const std::string, std::vector<char> > &key_value_map,
435 uint32_t flags) throw(Error)
437 if (key_value_map.empty())
439 throw(Error("The key/values are not properly set!", false));
442 std::map<const std::string, std::vector<char> >::iterator it=
443 key_value_map.begin();
444 while (it != key_value_map.end())
446 retval= set(it->first, it->second, expiration, flags);
449 std::string err_buff("There was an error setting the key ");
450 err_buff.append(it->first);
451 throw(Error(err_buff, false));
459 * Increment the value of the object associated with the specified
460 * key by the offset given. The resulting value is saved in the value
463 * @param[in] key key of object in server whose value to increment
464 * @param[in] offset amount to increment object's value by
465 * @param[out] value store the result of the increment here
466 * @return true on success; false otherwise
468 bool increment(const std::string &key, uint32_t offset, uint64_t *value) throw(Error)
472 throw(Error("the key supplied is empty!", false));
474 memcached_return rc= memcached_increment(&memc, key.c_str(), key.length(),
476 return (rc == MEMCACHED_SUCCESS);
480 * Decrement the value of the object associated with the specified
481 * key by the offset given. The resulting value is saved in the value
484 * @param[in] key key of object in server whose value to decrement
485 * @param[in] offset amount to increment object's value by
486 * @param[out] value store the result of the decrement here
487 * @return true on success; false otherwise
489 bool decrement(const std::string &key, uint32_t offset, uint64_t *value)
494 throw(Error("the key supplied is empty!", false));
496 memcached_return rc= memcached_decrement(&memc, key.c_str(),
499 return (rc == MEMCACHED_SUCCESS);
504 * Add an object with the specified key and value to the server. This
505 * function returns false if the object already exists on the server.
507 * @param[in] key key of object to add
508 * @param[in] value of object to add
509 * @return true on success; false otherwise
511 bool add(const std::string &key, const std::vector<char> &value)
514 if (key.empty() || value.empty())
516 throw(Error("the key or value supplied is empty!", false));
518 memcached_return rc= memcached_add(&memc, key.c_str(), key.length(),
519 &value[0], value.size(), 0, 0);
520 return (rc == MEMCACHED_SUCCESS);
524 * Add an object with the specified key and value to the server. This
525 * function returns false if the object already exists on the server. The
526 * server to add the object to is specified by the master_key parameter.
528 * @param[in[ master_key key of server to add object to
529 * @param[in] key key of object to add
530 * @param[in] value of object to add
531 * @return true on success; false otherwise
533 bool addByKey(const std::string &master_key,
534 const std::string &key,
535 const std::vector<char> &value) throw(Error)
537 if (master_key.empty() ||
541 throw(Error("the master key or key supplied is empty!", false));
543 memcached_return rc= memcached_add_by_key(&memc,
551 return (rc == MEMCACHED_SUCCESS);
555 * Replaces an object on the server. This method only succeeds
556 * if the object is already present on the server.
558 * @param[in] key key of object to replace
559 * @param[in[ value value to replace object with
560 * @return true on success; false otherwise
562 bool replace(const std::string &key, const std::vector<char> &value) throw(Error)
567 throw(Error("the key or value supplied is empty!", false));
569 memcached_return rc= memcached_replace(&memc, key.c_str(), key.length(),
570 &value[0], value.size(),
572 return (rc == MEMCACHED_SUCCESS);
576 * Replaces an object on the server. This method only succeeds
577 * if the object is already present on the server. The server
578 * to replace the object on is specified by the master_key param.
580 * @param[in] master_key key of server to replace object on
581 * @param[in] key key of object to replace
582 * @param[in[ value value to replace object with
583 * @return true on success; false otherwise
585 bool replaceByKey(const std::string &master_key,
586 const std::string &key,
587 const std::vector<char> &value)
589 if (master_key.empty() ||
593 throw(Error("the master key or key supplied is empty!", false));
595 memcached_return rc= memcached_replace_by_key(&memc,
603 return (rc == MEMCACHED_SUCCESS);
607 * Places a segment of data before the last piece of data stored.
609 * @param[in] key key of object whose value we will prepend data to
610 * @param[in] value data to prepend to object's value
611 * @return true on success; false otherwise
613 bool prepend(const std::string &key, const std::vector<char> &value)
616 if (key.empty() || value.empty())
618 throw(Error("the key or value supplied is empty!", false));
620 memcached_return rc= memcached_prepend(&memc, key.c_str(), key.length(),
621 &value[0], value.size(), 0, 0);
622 return (rc == MEMCACHED_SUCCESS);
626 * Places a segment of data before the last piece of data stored. The
627 * server on which the object where we will be prepending data is stored
628 * on is specified by the master_key parameter.
630 * @param[in] master_key key of server where object is stored
631 * @param[in] key key of object whose value we will prepend data to
632 * @param[in] value data to prepend to object's value
633 * @return true on success; false otherwise
635 bool prependByKey(const std::string &master_key,
636 const std::string &key,
637 const std::vector<char> &value)
640 if (master_key.empty() ||
644 throw(Error("the master key or key supplied is empty!", false));
646 memcached_return rc= memcached_prepend_by_key(&memc,
655 return (rc == MEMCACHED_SUCCESS);
659 * Places a segment of data at the end of the last piece of data stored.
661 * @param[in] key key of object whose value we will append data to
662 * @param[in] value data to append to object's value
663 * @return true on success; false otherwise
665 bool append(const std::string &key, const std::vector<char> &value)
668 if (key.empty() || value.empty())
670 throw(Error("the key or value supplied is empty!", false));
672 memcached_return rc= memcached_append(&memc,
678 return (rc == MEMCACHED_SUCCESS);
682 * Places a segment of data at the end of the last piece of data stored. The
683 * server on which the object where we will be appending data is stored
684 * on is specified by the master_key parameter.
686 * @param[in] master_key key of server where object is stored
687 * @param[in] key key of object whose value we will append data to
688 * @param[in] value data to append to object's value
689 * @return true on success; false otherwise
691 bool appendByKey(const std::string &master_key,
692 const std::string &key,
693 const std::vector<char> &value)
696 if (master_key.empty() ||
700 throw(Error("the master key or key supplied is empty!", false));
702 memcached_return rc= memcached_append_by_key(&memc,
710 return (rc == MEMCACHED_SUCCESS);
714 * Overwrite data in the server as long as the cas_arg value
715 * is still the same in the server.
717 * @param[in] key key of object in server
718 * @param[in] value value to store for object in server
719 * @param[in] cas_arg "cas" value
721 bool cas(const std::string &key,
722 const std::vector<char> &value,
723 uint64_t cas_arg) throw(Error)
725 if (key.empty() || value.empty())
727 throw(Error("the key or value supplied is empty!", false));
729 memcached_return rc= memcached_cas(&memc, key.c_str(), key.length(),
730 &value[0], value.size(),
732 return (rc == MEMCACHED_SUCCESS);
736 * Overwrite data in the server as long as the cas_arg value
737 * is still the same in the server. The server to use is
738 * specified by the master_key parameter.
740 * @param[in] master_key specifies server to operate on
741 * @param[in] key key of object in server
742 * @param[in] value value to store for object in server
743 * @param[in] cas_arg "cas" value
745 bool casByKey(const std::string &master_key,
746 const std::string &key,
747 const std::vector<char> &value,
748 uint64_t cas_arg) throw(Error)
750 if (master_key.empty() ||
754 throw(Error("the master key, key or value supplied is empty!", false));
756 memcached_return rc= memcached_cas_by_key(&memc,
764 return (rc == MEMCACHED_SUCCESS);
768 * Delete an object from the server specified by the key given.
770 * @param[in] key key of object to delete
771 * @return true on success; false otherwise
773 bool remove(const std::string &key) throw(Error)
777 throw(Error("the key supplied is empty!", false));
779 memcached_return rc= memcached_delete(&memc, key.c_str(), key.length(), 0);
780 return (rc == MEMCACHED_SUCCESS);
784 * Delete an object from the server specified by the key given.
786 * @param[in] key key of object to delete
787 * @param[in] expiration time to delete the object after
788 * @return true on success; false otherwise
790 bool remove(const std::string &key,
791 time_t expiration) throw(Error)
795 throw(Error("the key supplied is empty!", false));
797 memcached_return rc= memcached_delete(&memc,
801 return (rc == MEMCACHED_SUCCESS);
805 * Delete an object from the server specified by the key given.
807 * @param[in] master_key specifies server to remove object from
808 * @param[in] key key of object to delete
809 * @return true on success; false otherwise
811 bool removeByKey(const std::string &master_key,
812 const std::string &key) throw(Error)
814 if (master_key.empty() || key.empty())
816 throw(Error("the master key or key supplied is empty!", false));
818 memcached_return rc= memcached_delete_by_key(&memc,
824 return (rc == MEMCACHED_SUCCESS);
828 * Delete an object from the server specified by the key given.
830 * @param[in] master_key specifies server to remove object from
831 * @param[in] key key of object to delete
832 * @param[in] expiration time to delete the object after
833 * @return true on success; false otherwise
835 bool removeByKey(const std::string &master_key,
836 const std::string &key,
837 time_t expiration) throw(Error)
839 if (master_key.empty() || key.empty())
841 throw(Error("the master key or key supplied is empty!", false));
843 memcached_return rc= memcached_delete_by_key(&memc,
849 return (rc == MEMCACHED_SUCCESS);
853 * Wipe the contents of memcached servers.
855 * @param[in] expiration time to wait until wiping contents of
857 * @return true on success; false otherwise
859 bool flush(time_t expiration)
861 memcached_return rc= memcached_flush(&memc, expiration);
862 return (rc == MEMCACHED_SUCCESS);
866 * Callback function for result sets. It passes the result
867 * sets to the list of functions provided.
869 * @param[in] callback list of callback functions
870 * @param[in] context pointer to memory reference that is
871 * supplied to the calling function
872 * @param[in] num_of_callbacks number of callback functions
873 * @return true on success; false otherwise
875 bool fetchExecute(memcached_execute_function *callback,
877 unsigned int num_of_callbacks)
879 memcached_return rc= memcached_fetch_execute(&memc,
883 return (rc == MEMCACHED_SUCCESS);
887 * Get the library version string.
888 * @return std::string containing a copy of the library version string.
890 const std::string libVersion() const
892 const char *ver= memcached_lib_version();
893 const std::string version(ver);
899 std::string servers_list;
901 memcached_server_st *servers;
902 memcached_result_st result;
907 #endif /* LIBMEMCACHEDPP_H */