| memcached.h | | memcached.h | |
| /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: | | /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: | |
| * | | * | |
| * Libmemcached library | | * Libmemcached library | |
| * | | * | |
| * Copyright (C) 2011 Data Differential, http://datadifferential.com/ | | * Copyright (C) 2011 Data Differential, http://datadifferential.com/ | |
|
| * Copyright (C) 2006-2009 Brian Aker All rights reserved. | | | |
| * | | * | |
| * Redistribution and use in source and binary forms, with or without | | * Redistribution and use in source and binary forms, with or without | |
| * modification, are permitted provided that the following conditions are | | * modification, are permitted provided that the following conditions are | |
| * met: | | * met: | |
| * | | * | |
| * * Redistributions of source code must retain the above copyright | | * * Redistributions of source code must retain the above copyright | |
| * notice, this list of conditions and the following disclaimer. | | * notice, this list of conditions and the following disclaimer. | |
| * | | * | |
| * * Redistributions in binary form must reproduce the above | | * * Redistributions in binary form must reproduce the above | |
| * copyright notice, this list of conditions and the following disclaimer | | * copyright notice, this list of conditions and the following disclaimer | |
| | | | |
| skipping to change at line 40 | | skipping to change at line 39 | |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| * | | * | |
| */ | | */ | |
| | | | |
| #pragma once | | #pragma once | |
| | | | |
|
| #include <inttypes.h> | | #include <libmemcached-1.0/memcached.h> | |
| #include <stdlib.h> | | | |
| #include <sys/types.h> | | | |
| | | | |
| #if !defined(__cplusplus) | | | |
| # include <stdbool.h> | | | |
| #endif | | | |
| | | | |
| #include <libmemcached/visibility.h> | | | |
| #include <libmemcached/configure.h> | | | |
| #include <libmemcached/platform.h> | | | |
| #include <libmemcached/constants.h> | | | |
| #include <libmemcached/return.h> | | | |
| #include <libmemcached/types.h> | | | |
| #include <libmemcached/string.h> | | | |
| #include <libmemcached/array.h> | | | |
| #include <libmemcached/error.h> | | | |
| #include <libmemcached/stats.h> | | | |
| #include <libhashkit/hashkit.h> | | | |
| | | | |
| // Everything above this line must be in the order specified. | | | |
| #include <libmemcached/allocators.h> | | | |
| #include <libmemcached/analyze.h> | | | |
| #include <libmemcached/auto.h> | | | |
| #include <libmemcached/behavior.h> | | | |
| #include <libmemcached/callback.h> | | | |
| #include <libmemcached/delete.h> | | | |
| #include <libmemcached/dump.h> | | | |
| #include <libmemcached/exist.h> | | | |
| #include <libmemcached/fetch.h> | | | |
| #include <libmemcached/flush.h> | | | |
| #include <libmemcached/flush_buffers.h> | | | |
| #include <libmemcached/get.h> | | | |
| #include <libmemcached/hash.h> | | | |
| #include <libmemcached/namespace.h> | | | |
| #include <libmemcached/options.h> | | | |
| #include <libmemcached/parse.h> | | | |
| #include <libmemcached/quit.h> | | | |
| #include <libmemcached/result.h> | | | |
| #include <libmemcached/server.h> | | | |
| #include <libmemcached/server_list.h> | | | |
| #include <libmemcached/storage.h> | | | |
| #include <libmemcached/strerror.h> | | | |
| #include <libmemcached/verbosity.h> | | | |
| #include <libmemcached/version.h> | | | |
| #include <libmemcached/sasl.h> | | | |
| | | | |
| struct memcached_st { | | | |
| /** | | | |
| @note these are static and should not change without a call to behavior | | | |
| . | | | |
| */ | | | |
| struct { | | | |
| bool is_purging:1; | | | |
| bool is_processing_input:1; | | | |
| bool is_time_for_rebuild:1; | | | |
| } state; | | | |
| | | | |
| struct { | | | |
| // Everything below here is pretty static. | | | |
| bool auto_eject_hosts:1; | | | |
| bool binary_protocol:1; | | | |
| bool buffer_requests:1; | | | |
| bool hash_with_namespace:1; | | | |
| bool no_block:1; // Don't block | | | |
| bool no_reply:1; | | | |
| bool randomize_replica_read:1; | | | |
| bool support_cas:1; | | | |
| bool tcp_nodelay:1; | | | |
| bool use_sort_hosts:1; | | | |
| bool use_udp:1; | | | |
| bool verify_key:1; | | | |
| bool tcp_keepalive:1; | | | |
| } flags; | | | |
| | | | |
| memcached_server_distribution_t distribution; | | | |
| hashkit_st hashkit; | | | |
| struct { | | | |
| unsigned int version; | | | |
| } server_info; | | | |
| uint32_t number_of_hosts; | | | |
| memcached_server_st *servers; | | | |
| memcached_server_st *last_disconnected_server; | | | |
| int32_t snd_timeout; | | | |
| int32_t rcv_timeout; | | | |
| uint32_t server_failure_limit; | | | |
| uint32_t io_msg_watermark; | | | |
| uint32_t io_bytes_watermark; | | | |
| uint32_t io_key_prefetch; | | | |
| uint32_t tcp_keepidle; | | | |
| int32_t poll_timeout; | | | |
| int32_t connect_timeout; // How long we will wait on connect() before we | | | |
| will timeout | | | |
| int32_t retry_timeout; | | | |
| int send_size; | | | |
| int recv_size; | | | |
| void *user_data; | | | |
| uint64_t query_id; | | | |
| uint32_t number_of_replicas; | | | |
| memcached_result_st result; | | | |
| | | | |
| struct { | | | |
| bool weighted; | | | |
| uint32_t continuum_count; // Ketama | | | |
| uint32_t continuum_points_counter; // Ketama | | | |
| time_t next_distribution_rebuild; // Ketama | | | |
| memcached_continuum_item_st *continuum; // Ketama | | | |
| } ketama; | | | |
| | | | |
| struct memcached_virtual_bucket_t *virtual_bucket; | | | |
| | | | |
| struct memcached_allocator_t allocators; | | | |
| | | | |
| memcached_clone_fn on_clone; | | | |
| memcached_cleanup_fn on_cleanup; | | | |
| memcached_trigger_key_fn get_key_failure; | | | |
| memcached_trigger_delete_key_fn delete_trigger; | | | |
| memcached_callback_st *callbacks; | | | |
| struct memcached_sasl_st sasl; | | | |
| struct memcached_error_t *error_messages; | | | |
| struct memcached_array_st *_namespace; | | | |
| struct { | | | |
| uint32_t initial_pool_size; | | | |
| uint32_t max_pool_size; | | | |
| int32_t version; // This is used by pool and others to determine if the | | | |
| memcached_st is out of date. | | | |
| struct memcached_array_st *filename; | | | |
| } configure; | | | |
| struct { | | | |
| bool is_allocated:1; | | | |
| } options; | | | |
| | | | |
| }; | | | |
| | | | |
| #ifdef __cplusplus | | | |
| extern "C" { | | | |
| #endif | | | |
| | | | |
| LIBMEMCACHED_API | | | |
| void memcached_servers_reset(memcached_st *ptr); | | | |
| | | | |
| LIBMEMCACHED_API | | | |
| memcached_st *memcached_create(memcached_st *ptr); | | | |
| | | | |
| LIBMEMCACHED_API | | | |
| memcached_st *memcached(const char *string, size_t string_length); | | | |
| | | | |
| LIBMEMCACHED_API | | | |
| void memcached_free(memcached_st *ptr); | | | |
| | | | |
| LIBMEMCACHED_API | | | |
| memcached_return_t memcached_reset(memcached_st *ptr); | | | |
| | | | |
| LIBMEMCACHED_API | | | |
| void memcached_reset_last_disconnected_server(memcached_st *ptr); | | | |
| | | | |
| LIBMEMCACHED_API | | | |
| memcached_st *memcached_clone(memcached_st *clone, const memcached_st *ptr) | | | |
| ; | | | |
| | | | |
| LIBMEMCACHED_API | | | |
| void *memcached_get_user_data(const memcached_st *ptr); | | | |
| | | | |
| LIBMEMCACHED_API | | | |
| void *memcached_set_user_data(memcached_st *ptr, void *data); | | | |
| | | | |
| LIBMEMCACHED_API | | | |
| memcached_return_t memcached_push(memcached_st *destination, const memcache | | | |
| d_st *source); | | | |
| | | | |
| LIBMEMCACHED_API | | | |
| memcached_server_instance_st memcached_server_instance_by_position(const me | | | |
| mcached_st *ptr, uint32_t server_key); | | | |
| | | | |
| LIBMEMCACHED_API | | | |
| uint32_t memcached_server_count(const memcached_st *); | | | |
| | | | |
| LIBMEMCACHED_API | | | |
| uint64_t memcached_query_id(const memcached_st *); | | | |
| | | | |
| #ifdef __cplusplus | | | |
| } // extern "C" | | | |
| #endif | | | |
| | | | |
End of changes. 2 change blocks. |
| 1 lines changed or deleted | | 0 lines changed or added | |
|
| memcached.hpp | | memcached.hpp | |
|
| /* | | /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: | |
| * Summary: C++ interface for memcached server | | | |
| * | | * | |
|
| * Copy: See Copyright for the status of this software. | | * Libmemcached library | |
| | | * | |
| | | * Copyright (C) 2011 Data Differential, http://datadifferential.com/ | |
| | | * | |
| | | * Redistribution and use in source and binary forms, with or without | |
| | | * modification, are permitted provided that the following conditions are | |
| | | * met: | |
| | | * | |
| | | * * Redistributions of source code must retain the above copyright | |
| | | * notice, this list of conditions and the following disclaimer. | |
| | | * | |
| | | * * Redistributions in binary form must reproduce the above | |
| | | * copyright notice, this list of conditions and the following disclaimer | |
| | | * in the documentation and/or other materials provided with the | |
| | | * distribution. | |
| | | * | |
| | | * * The names of its contributors may not be used to endorse or | |
| | | * promote products derived from this software without specific prior | |
| | | * written permission. | |
| | | * | |
| | | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| | | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| | | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| | | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| | | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| | | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| | | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| | | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| | | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| | | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| | | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| * | | * | |
|
| * Authors: Padraig O'Sullivan <osullivan.padraig@gmail.com> | | | |
| * Patrick Galbraith <patg@patg.net> | | | |
| */ | | | |
| | | | |
| /** | | | |
| * @file memcached.hpp | | | |
| * @brief Libmemcached C++ interface | | | |
| */ | | */ | |
| | | | |
| #pragma once | | #pragma once | |
| | | | |
|
| #include <libmemcached/memcached.h> | | #include <libmemcached-1.0/memcached.hpp> | |
| #include <libmemcached/exception.hpp> | | | |
| | | | |
| #include <string.h> | | | |
| | | | |
| #include <sstream> | | | |
| #include <string> | | | |
| #include <vector> | | | |
| #include <map> | | | |
| | | | |
| namespace memcache | | | |
| { | | | |
| | | | |
| /** | | | |
| * This is the core memcached library (if later, other objects | | | |
| * are needed, they will be created from this class). | | | |
| */ | | | |
| class Memcache | | | |
| { | | | |
| public: | | | |
| | | | |
| Memcache() | | | |
| { | | | |
| memc= memcached("", 0); | | | |
| } | | | |
| | | | |
| Memcache(const std::string &config) | | | |
| { | | | |
| memc= memcached(config.c_str(), config.size()); | | | |
| } | | | |
| | | | |
| Memcache(const std::string &hostname, in_port_t port) | | | |
| { | | | |
| memc= memcached("", 0); | | | |
| if (memc) | | | |
| memcached_server_add(memc, hostname.c_str(), port); | | | |
| } | | | |
| | | | |
| Memcache(memcached_st *clone) | | | |
| { | | | |
| memc= memcached_clone(NULL, clone); | | | |
| } | | | |
| | | | |
| Memcache(const Memcache &rhs) | | | |
| { | | | |
| memc= memcached_clone(NULL, rhs.getImpl()); | | | |
| } | | | |
| | | | |
| Memcache &operator=(const Memcache &rhs) | | | |
| { | | | |
| if (this != &rhs) | | | |
| { | | | |
| memcached_free(memc); | | | |
| memc= memcached_clone(NULL, rhs.getImpl()); | | | |
| } | | | |
| | | | |
| return *this; | | | |
| } | | | |
| | | | |
| ~Memcache() | | | |
| { | | | |
| memcached_free(memc); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Get the internal memcached_st * | | | |
| */ | | | |
| const memcached_st *getImpl() const | | | |
| { | | | |
| return memc; | | | |
| } | | | |
| | | | |
| /** | | | |
| * Return an error string for the given return structure. | | | |
| * | | | |
| * @param[in] rc a memcached_return_t structure | | | |
| * @return error string corresponding to given return code in the library | | | |
| . | | | |
| */ | | | |
| const std::string getError(memcached_return_t rc) const | | | |
| { | | | |
| /* first parameter to strerror is unused */ | | | |
| return memcached_strerror(NULL, rc); | | | |
| } | | | |
| | | | |
| bool error(std::string& error_message) const | | | |
| { | | | |
| if (memcached_failed(memcached_last_error(memc))) | | | |
| { | | | |
| error_message+= memcached_last_error_message(memc); | | | |
| return true; | | | |
| } | | | |
| | | | |
| return false; | | | |
| } | | | |
| | | | |
| bool error() const | | | |
| { | | | |
| if (memcached_failed(memcached_last_error(memc))) | | | |
| { | | | |
| return true; | | | |
| } | | | |
| | | | |
| return false; | | | |
| } | | | |
| | | | |
| bool error(memcached_return_t& arg) const | | | |
| { | | | |
| arg= memcached_last_error(memc); | | | |
| return memcached_failed(arg); | | | |
| } | | | |
| | | | |
| bool setBehavior(memcached_behavior_t flag, uint64_t data) | | | |
| { | | | |
| return (memcached_success(memcached_behavior_set(memc, flag, data))); | | | |
| } | | | |
| | | | |
| uint64_t getBehavior(memcached_behavior_t flag) | | | |
| { | | | |
| return memcached_behavior_get(memc, flag); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Configure the memcache object | | | |
| * | | | |
| * @param[in] in_config configuration | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool configure(const std::string &configuration) | | | |
| { | | | |
| memcached_st *new_memc= memcached(configuration.c_str(), configuration. | | | |
| size()); | | | |
| | | | |
| if (new_memc) | | | |
| { | | | |
| memcached_free(memc); | | | |
| memc= new_memc; | | | |
| | | | |
| return true; | | | |
| } | | | |
| | | | |
| return false; | | | |
| } | | | |
| | | | |
| /** | | | |
| * 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, in_port_t port) | | | |
| { | | | |
| return memcached_success(memcached_server_add(memc, server_name.c_str() | | | |
| , port)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * 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, in_port_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_return_t rc= memcached_server_remove(server); | | | |
| | | | |
| return false; | | | |
| } | | | |
| | | | |
| /** | | | |
| * Fetches an individual value from the server. mget() must always | | | |
| * be called before using this method. | | | |
| * | | | |
| * @param[in] key key of object to fetch | | | |
| * @param[out] ret_val store returned object in this vector | | | |
| * @return a memcached return structure | | | |
| */ | | | |
| memcached_return_t fetch(std::string &key, | | | |
| std::vector<char> &ret_val, | | | |
| uint32_t &flags, | | | |
| uint64_t &cas_value) | | | |
| { | | | |
| memcached_return_t rc; | | | |
| | | | |
| memcached_result_st *result; | | | |
| if ((result= memcached_fetch_result(memc, NULL, &rc))) | | | |
| { | | | |
| // Key | | | |
| key.assign(memcached_result_key_value(result), memcached_result_key_l | | | |
| ength(result)); | | | |
| | | | |
| // Actual value, null terminated | | | |
| ret_val.reserve(memcached_result_length(result) +1); | | | |
| ret_val.assign(memcached_result_value(result), | | | |
| memcached_result_value(result) +memcached_result_lengt | | | |
| h(result)); | | | |
| | | | |
| // Misc | | | |
| flags= memcached_result_flags(result); | | | |
| cas_value= memcached_result_cas(result); | | | |
| } | | | |
| memcached_result_free(result); | | | |
| | | | |
| return rc; | | | |
| } | | | |
| | | | |
| memcached_return_t fetch(std::string &key, | | | |
| std::vector<char> &ret_val) | | | |
| { | | | |
| uint32_t flags= 0; | | | |
| uint64_t cas_value= 0; | | | |
| | | | |
| return fetch(key, ret_val, flags, cas_value); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Fetches an individual value from the server. | | | |
| * | | | |
| * @param[in] key key of object whose value to get | | | |
| * @param[out] ret_val object that is retrieved is stored in | | | |
| * this vector | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool get(const std::string &key, std::vector<char> &ret_val) | | | |
| { | | | |
| uint32_t flags= 0; | | | |
| memcached_return_t rc; | | | |
| size_t value_length= 0; | | | |
| | | | |
| char *value= memcached_get(memc, key.c_str(), key.length(), | | | |
| &value_length, &flags, &rc); | | | |
| if (value != NULL && ret_val.empty()) | | | |
| { | | | |
| ret_val.reserve(value_length); | | | |
| ret_val.assign(value, value + value_length); | | | |
| free(value); | | | |
| return true; | | | |
| } | | | |
| | | | |
| return false; | | | |
| } | | | |
| | | | |
| /** | | | |
| * Fetches an individual from a server which is specified by | | | |
| * the master_key parameter that is used for determining which | | | |
| * server an object was stored in if key partitioning was | | | |
| * used for storage. | | | |
| * | | | |
| * @param[in] master_key key that specifies server object is stored on | | | |
| * @param[in] key key of object whose value to get | | | |
| * @param[out] ret_val object that is retrieved is stored in | | | |
| * this vector | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool getByKey(const std::string &master_key, | | | |
| const std::string &key, | | | |
| std::vector<char> &ret_val) | | | |
| { | | | |
| uint32_t flags= 0; | | | |
| memcached_return_t rc; | | | |
| size_t value_length= 0; | | | |
| | | | |
| char *value= memcached_get_by_key(memc, | | | |
| master_key.c_str(), master_key.length | | | |
| (), | | | |
| key.c_str(), key.length(), | | | |
| &value_length, &flags, &rc); | | | |
| if (value) | | | |
| { | | | |
| ret_val.reserve(value_length); | | | |
| ret_val.assign(value, value + value_length); | | | |
| free(value); | | | |
| return true; | | | |
| } | | | |
| return false; | | | |
| } | | | |
| | | | |
| /** | | | |
| * Selects multiple keys at once. This method always | | | |
| * works asynchronously. | | | |
| * | | | |
| * @param[in] keys vector of keys to select | | | |
| * @return true if all keys are found | | | |
| */ | | | |
| bool mget(std::vector<std::string> &keys) | | | |
| { | | | |
| std::vector<const char *> real_keys; | | | |
| std::vector<size_t> key_len; | | | |
| /* | | | |
| * 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 *. | | | |
| */ | | | |
| real_keys.reserve(keys.size()); | | | |
| key_len.reserve(keys.size()); | | | |
| | | | |
| std::vector<std::string>::iterator it= keys.begin(); | | | |
| | | | |
| while (it != keys.end()) | | | |
| { | | | |
| real_keys.push_back(const_cast<char *>((*it).c_str())); | | | |
| key_len.push_back((*it).length()); | | | |
| ++it; | | | |
| } | | | |
| | | | |
| /* | | | |
| * If the std::vector of keys is empty then we cannot | | | |
| * call memcached_mget as we will get undefined behavior. | | | |
| */ | | | |
| if (not real_keys.empty()) | | | |
| { | | | |
| return memcached_success(memcached_mget(memc, &real_keys[0], &key_len | | | |
| [0], real_keys.size())); | | | |
| } | | | |
| | | | |
| return false; | | | |
| } | | | |
| | | | |
| /** | | | |
| * Writes an object to the server. If the object already exists, it will | | | |
| * overwrite the existing object. This method always returns true | | | |
| * when using non-blocking mode unless a network error occurs. | | | |
| * | | | |
| * @param[in] key key of object to write to server | | | |
| * @param[in] value value of object to write to server | | | |
| * @param[in] expiration time to keep the object stored in the server for | | | |
| * @param[in] flags flags to store with the object | | | |
| * @return true on succcess; false otherwise | | | |
| */ | | | |
| bool set(const std::string &key, | | | |
| const std::vector<char> &value, | | | |
| time_t expiration, | | | |
| uint32_t flags) | | | |
| { | | | |
| memcached_return_t rc= memcached_set(memc, | | | |
| key.c_str(), key.length(), | | | |
| &value[0], value.size(), | | | |
| expiration, flags); | | | |
| return memcached_success(rc); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Writes an object to a server specified by the master_key parameter. | | | |
| * If the object already exists, it will overwrite the existing object. | | | |
| * | | | |
| * @param[in] master_key key that specifies server to write to | | | |
| * @param[in] key key of object to write to server | | | |
| * @param[in] value value of object to write to server | | | |
| * @param[in] expiration time to keep the object stored in the server for | | | |
| * @param[in] flags flags to store with the object | | | |
| * @return true on succcess; false otherwise | | | |
| */ | | | |
| bool setByKey(const std::string &master_key, | | | |
| const std::string &key, | | | |
| const std::vector<char> &value, | | | |
| time_t expiration, | | | |
| uint32_t flags) | | | |
| { | | | |
| return memcached_success(memcached_set_by_key(memc, master_key.c_str(), | | | |
| master_key.length(), | | | |
| key.c_str(), key.length() | | | |
| , | | | |
| &value[0], value.size(), | | | |
| expiration, | | | |
| flags)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Writes a list of objects to the server. Objects are specified by | | | |
| * 2 vectors - 1 vector of keys and 1 vector of values. | | | |
| * | | | |
| * @param[in] keys vector of keys of objects to write to server | | | |
| * @param[in] values vector of values of objects to write to server | | | |
| * @param[in] expiration time to keep the objects stored in server for | | | |
| * @param[in] flags flags to store with the objects | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool setAll(std::vector<std::string> &keys, | | | |
| std::vector< std::vector<char> *> &values, | | | |
| time_t expiration, | | | |
| uint32_t flags) | | | |
| { | | | |
| bool retval= true; | | | |
| std::vector<std::string>::iterator key_it= keys.begin(); | | | |
| std::vector< std::vector<char> *>::iterator val_it= values.begin(); | | | |
| while (key_it != keys.end()) | | | |
| { | | | |
| retval= set((*key_it), *(*val_it), expiration, flags); | | | |
| if (retval == false) | | | |
| { | | | |
| return retval; | | | |
| } | | | |
| ++key_it; | | | |
| ++val_it; | | | |
| } | | | |
| return retval; | | | |
| } | | | |
| | | | |
| /** | | | |
| * Writes a list of objects to the server. Objects are specified by | | | |
| * a map of keys to values. | | | |
| * | | | |
| * @param[in] key_value_map map of keys and values to store in server | | | |
| * @param[in] expiration time to keep the objects stored in server for | | | |
| * @param[in] flags flags to store with the objects | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool setAll(std::map<const std::string, std::vector<char> > &key_value_ma | | | |
| p, | | | |
| time_t expiration, | | | |
| uint32_t flags) | | | |
| { | | | |
| bool retval= true; | | | |
| std::map<const std::string, std::vector<char> >::iterator it= key_value | | | |
| _map.begin(); | | | |
| | | | |
| while (it != key_value_map.end()) | | | |
| { | | | |
| retval= set(it->first, it->second, expiration, flags); | | | |
| if (retval == false) | | | |
| { | | | |
| // We should tell the user what the key that failed was | | | |
| return false; | | | |
| } | | | |
| ++it; | | | |
| } | | | |
| return true; | | | |
| } | | | |
| | | | |
| /** | | | |
| * Increment the value of the object associated with the specified | | | |
| * key by the offset given. The resulting value is saved in the value | | | |
| * parameter. | | | |
| * | | | |
| * @param[in] key key of object in server whose value to increment | | | |
| * @param[in] offset amount to increment object's value by | | | |
| * @param[out] value store the result of the increment here | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool increment(const std::string &key, uint32_t offset, uint64_t *value) | | | |
| { | | | |
| return memcached_success(memcached_increment(memc, key.c_str(), key.len | | | |
| gth(), offset, value)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Decrement the value of the object associated with the specified | | | |
| * key by the offset given. The resulting value is saved in the value | | | |
| * parameter. | | | |
| * | | | |
| * @param[in] key key of object in server whose value to decrement | | | |
| * @param[in] offset amount to increment object's value by | | | |
| * @param[out] value store the result of the decrement here | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool decrement(const std::string &key, uint32_t offset, uint64_t *value) | | | |
| { | | | |
| return memcached_success(memcached_decrement(memc, key.c_str(), | | | |
| key.length(), | | | |
| offset, value)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Add an object with the specified key and value to the server. This | | | |
| * function returns false if the object already exists on the server. | | | |
| * | | | |
| * @param[in] key key of object to add | | | |
| * @param[in] value of object to add | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool add(const std::string &key, const std::vector<char> &value) | | | |
| { | | | |
| return memcached_success(memcached_add(memc, key.c_str(), key.length(), | | | |
| &value[0], value.size(), 0, 0)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Add an object with the specified key and value to the server. This | | | |
| * function returns false if the object already exists on the server. The | | | |
| * server to add the object to is specified by the master_key parameter. | | | |
| * | | | |
| * @param[in[ master_key key of server to add object to | | | |
| * @param[in] key key of object to add | | | |
| * @param[in] value of object to add | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool addByKey(const std::string &master_key, | | | |
| const std::string &key, | | | |
| const std::vector<char> &value) | | | |
| { | | | |
| return memcached_success(memcached_add_by_key(memc, | | | |
| master_key.c_str(), | | | |
| master_key.length(), | | | |
| key.c_str(), | | | |
| key.length(), | | | |
| &value[0], | | | |
| value.size(), | | | |
| 0, 0)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Replaces an object on the server. This method only succeeds | | | |
| * if the object is already present on the server. | | | |
| * | | | |
| * @param[in] key key of object to replace | | | |
| * @param[in[ value value to replace object with | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool replace(const std::string &key, const std::vector<char> &value) | | | |
| { | | | |
| return memcached_success(memcached_replace(memc, key.c_str(), key.lengt | | | |
| h(), | | | |
| &value[0], value.size(), | | | |
| 0, 0)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Replaces an object on the server. This method only succeeds | | | |
| * if the object is already present on the server. The server | | | |
| * to replace the object on is specified by the master_key param. | | | |
| * | | | |
| * @param[in] master_key key of server to replace object on | | | |
| * @param[in] key key of object to replace | | | |
| * @param[in[ value value to replace object with | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool replaceByKey(const std::string &master_key, | | | |
| const std::string &key, | | | |
| const std::vector<char> &value) | | | |
| { | | | |
| return memcached_success(memcached_replace_by_key(memc, | | | |
| master_key.c_str(), | | | |
| master_key.length(), | | | |
| key.c_str(), | | | |
| key.length(), | | | |
| &value[0], | | | |
| value.size(), | | | |
| 0, 0)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Places a segment of data before the last piece of data stored. | | | |
| * | | | |
| * @param[in] key key of object whose value we will prepend data to | | | |
| * @param[in] value data to prepend to object's value | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool prepend(const std::string &key, const std::vector<char> &value) | | | |
| { | | | |
| return memcached_success(memcached_prepend(memc, key.c_str(), key.lengt | | | |
| h(), | | | |
| &value[0], value.size(), 0, | | | |
| 0)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Places a segment of data before the last piece of data stored. The | | | |
| * server on which the object where we will be prepending data is stored | | | |
| * on is specified by the master_key parameter. | | | |
| * | | | |
| * @param[in] master_key key of server where object is stored | | | |
| * @param[in] key key of object whose value we will prepend data to | | | |
| * @param[in] value data to prepend to object's value | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool prependByKey(const std::string &master_key, | | | |
| const std::string &key, | | | |
| const std::vector<char> &value) | | | |
| { | | | |
| return memcached_success(memcached_prepend_by_key(memc, | | | |
| master_key.c_str(), | | | |
| master_key.length(), | | | |
| key.c_str(), | | | |
| key.length(), | | | |
| &value[0], | | | |
| value.size(), | | | |
| 0, | | | |
| 0)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Places a segment of data at the end of the last piece of data stored. | | | |
| * | | | |
| * @param[in] key key of object whose value we will append data to | | | |
| * @param[in] value data to append to object's value | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool append(const std::string &key, const std::vector<char> &value) | | | |
| { | | | |
| return memcached_success(memcached_append(memc, | | | |
| key.c_str(), | | | |
| key.length(), | | | |
| &value[0], | | | |
| value.size(), | | | |
| 0, 0)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Places a segment of data at the end of the last piece of data stored. | | | |
| The | | | |
| * server on which the object where we will be appending data is stored | | | |
| * on is specified by the master_key parameter. | | | |
| * | | | |
| * @param[in] master_key key of server where object is stored | | | |
| * @param[in] key key of object whose value we will append data to | | | |
| * @param[in] value data to append to object's value | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool appendByKey(const std::string &master_key, | | | |
| const std::string &key, | | | |
| const std::vector<char> &value) | | | |
| { | | | |
| return memcached_success(memcached_append_by_key(memc, | | | |
| master_key.c_str(), | | | |
| master_key.length(), | | | |
| key.c_str(), | | | |
| key.length(), | | | |
| &value[0], | | | |
| value.size(), | | | |
| 0, 0)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Overwrite data in the server as long as the cas_arg value | | | |
| * is still the same in the server. | | | |
| * | | | |
| * @param[in] key key of object in server | | | |
| * @param[in] value value to store for object in server | | | |
| * @param[in] cas_arg "cas" value | | | |
| */ | | | |
| bool cas(const std::string &key, | | | |
| const std::vector<char> &value, | | | |
| uint64_t cas_arg) | | | |
| { | | | |
| return memcached_success(memcached_cas(memc, key.c_str(), key.length(), | | | |
| &value[0], value.size(), | | | |
| 0, 0, cas_arg)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Overwrite data in the server as long as the cas_arg value | | | |
| * is still the same in the server. The server to use is | | | |
| * specified by the master_key parameter. | | | |
| * | | | |
| * @param[in] master_key specifies server to operate on | | | |
| * @param[in] key key of object in server | | | |
| * @param[in] value value to store for object in server | | | |
| * @param[in] cas_arg "cas" value | | | |
| */ | | | |
| bool casByKey(const std::string &master_key, | | | |
| const std::string &key, | | | |
| const std::vector<char> &value, | | | |
| uint64_t cas_arg) | | | |
| { | | | |
| return memcached_success(memcached_cas_by_key(memc, | | | |
| master_key.c_str(), | | | |
| master_key.length(), | | | |
| key.c_str(), | | | |
| key.length(), | | | |
| &value[0], | | | |
| value.size(), | | | |
| 0, 0, cas_arg)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Delete an object from the server specified by the key given. | | | |
| * | | | |
| * @param[in] key key of object to delete | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool remove(const std::string &key) | | | |
| { | | | |
| return memcached_success(memcached_delete(memc, key.c_str(), key.length | | | |
| (), 0)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Delete an object from the server specified by the key given. | | | |
| * | | | |
| * @param[in] key key of object to delete | | | |
| * @param[in] expiration time to delete the object after | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool remove(const std::string &key, time_t expiration) | | | |
| { | | | |
| return memcached_success(memcached_delete(memc, | | | |
| key.c_str(), | | | |
| key.length(), | | | |
| expiration)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Delete an object from the server specified by the key given. | | | |
| * | | | |
| * @param[in] master_key specifies server to remove object from | | | |
| * @param[in] key key of object to delete | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool removeByKey(const std::string &master_key, | | | |
| const std::string &key) | | | |
| { | | | |
| return memcached_success(memcached_delete_by_key(memc, | | | |
| master_key.c_str(), | | | |
| master_key.length(), | | | |
| key.c_str(), | | | |
| key.length(), | | | |
| 0)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Delete an object from the server specified by the key given. | | | |
| * | | | |
| * @param[in] master_key specifies server to remove object from | | | |
| * @param[in] key key of object to delete | | | |
| * @param[in] expiration time to delete the object after | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool removeByKey(const std::string &master_key, | | | |
| const std::string &key, | | | |
| time_t expiration) | | | |
| { | | | |
| return memcached_success(memcached_delete_by_key(memc, | | | |
| master_key.c_str(), | | | |
| master_key.length(), | | | |
| key.c_str(), | | | |
| key.length(), | | | |
| expiration)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Wipe the contents of memcached servers. | | | |
| * | | | |
| * @param[in] expiration time to wait until wiping contents of | | | |
| * memcached servers | | | |
| * @return true on success; false otherwise | | | |
| */ | | | |
| bool flush(time_t expiration= 0) | | | |
| { | | | |
| return memcached_success(memcached_flush(memc, expiration)); | | | |
| } | | | |
| | | | |
| /** | | | |
| * Get the library version string. | | | |
| * @return std::string containing a copy of the library version string. | | | |
| */ | | | |
| const std::string libVersion() const | | | |
| { | | | |
| const char *ver= memcached_lib_version(); | | | |
| const std::string version(ver); | | | |
| 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<std::string, std::string> > | | | |
| &stats_map) | | | |
| { | | | |
| memcached_return_t 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 ad | | | |
| d | | | |
| * it to the std::map of overall stats. | | | |
| */ | | | |
| for (uint32_t x= 0; x < server_count; x++) | | | |
| { | | | |
| memcached_server_instance_st instance= | | | |
| memcached_server_instance_by_position(memc, x); | | | |
| std::ostringstream strstm; | | | |
| std::string server_name(memcached_server_name(instance)); | | | |
| server_name.append(":"); | | | |
| strstm << memcached_server_port(instance); | | | |
| server_name.append(strstm.str()); | | | |
| | | | |
| std::map<std::string, std::string> 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: | | | |
| memcached_st *memc; | | | |
| }; | | | |
| | | | |
| } | | | |
| | | | |
End of changes. 4 change blocks. |
| 10 lines changed or deleted | | 32 lines changed or added | |
|