X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fbin%2Fcommon%2Fexecute.cc;fp=src%2Fbin%2Fcommon%2Fexecute.cc;h=f0a5e47e40e88dc86c594323f1116c25d149dd22;hb=ef66fe65395361ec9656531413af6e26676e1f47;hp=0000000000000000000000000000000000000000;hpb=cebfad29f9703f768594b729c20ea0568765d52b;p=awesomized%2Flibmemcached diff --git a/src/bin/common/execute.cc b/src/bin/common/execute.cc new file mode 100644 index 00000000..f0a5e47e --- /dev/null +++ b/src/bin/common/execute.cc @@ -0,0 +1,142 @@ +/* LibMemcached + * Copyright (C) 2011-2012 Data Differential, http://datadifferential.com/ + * Copyright (C) 2006-2009 Brian Aker + * All rights reserved. + * + * Use and distribution licensed under the BSD license. See + * the COPYING file in the parent directory for full text. + * + * Summary: + * + */ + +/* + Execute a memcached_set() a set of pairs. + Return the number of rows set. +*/ + +#include "mem_config.h" +#include "execute.h" + +unsigned int execute_set(memcached_st *memc, pairs_st *pairs, unsigned int number_of) +{ + uint32_t count= 0; + for (; count < number_of; ++count) + { + memcached_return_t rc= memcached_set(memc, pairs[count].key, pairs[count].key_length, + pairs[count].value, pairs[count].value_length, + 0, 0); + if (memcached_failed(rc)) + { + fprintf(stderr, "%s:%d Failure on %u insert (%s) of %.*s\n", + __FILE__, __LINE__, count, + memcached_last_error_message(memc), + (unsigned int)pairs[count].key_length, pairs[count].key); + + // We will try to reconnect and see if that fixes the issue + memcached_quit(memc); + + return count; + } + } + + return count; +} + +/* + Execute a memcached_get() on a set of pairs. + Return the number of rows retrieved. +*/ +unsigned int execute_get(memcached_st *memc, pairs_st *pairs, unsigned int number_of) +{ + unsigned int x; + unsigned int retrieved; + + + for (retrieved= 0,x= 0; x < number_of; x++) + { + size_t value_length; + uint32_t flags; + + unsigned int fetch_key= (unsigned int)((unsigned int)random() % number_of); + + memcached_return_t rc; + char *value= memcached_get(memc, pairs[fetch_key].key, pairs[fetch_key].key_length, + &value_length, &flags, &rc); + + if (memcached_failed(rc)) + { + fprintf(stderr, "%s:%d Failure on read(%s) of %.*s\n", + __FILE__, __LINE__, + memcached_last_error_message(memc), + (unsigned int)pairs[fetch_key].key_length, pairs[fetch_key].key); + } + else + { + retrieved++; + } + + ::free(value); + } + + return retrieved; +} + +/** + * Callback function to count the number of results + */ +static memcached_return_t callback_counter(const memcached_st *ptr, + memcached_result_st *result, + void *context) +{ + (void)ptr; + (void)result; + unsigned int *counter= (unsigned int *)context; + *counter= *counter + 1; + + return MEMCACHED_SUCCESS; +} + +/** + * Try to run a large mget to get all of the keys + * @param memc memcached handle + * @param keys the keys to get + * @param key_length the length of the keys + * @param number_of the number of keys to try to get + * @return the number of keys received + */ +unsigned int execute_mget(memcached_st *memc, + const char * const *keys, + size_t *key_length, + unsigned int number_of) +{ + unsigned int retrieved= 0; + memcached_execute_fn callbacks[]= { callback_counter }; + memcached_return_t rc; + rc= memcached_mget_execute(memc, keys, key_length, + (size_t)number_of, callbacks, &retrieved, 1); + + if (rc == MEMCACHED_SUCCESS || rc == MEMCACHED_NOTFOUND || + rc == MEMCACHED_BUFFERED || rc == MEMCACHED_END) + { + rc= memcached_fetch_execute(memc, callbacks, (void *)&retrieved, 1); + if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_NOTFOUND && rc != MEMCACHED_END) + { + fprintf(stderr, "%s:%d Failed to execute mget: %s\n", + __FILE__, __LINE__, + memcached_strerror(memc, rc)); + memcached_quit(memc); + return 0; + } + } + else + { + fprintf(stderr, "%s:%d Failed to execute mget: %s\n", + __FILE__, __LINE__, + memcached_strerror(memc, rc)); + memcached_quit(memc); + return 0; + } + + return retrieved; +}