From: Trond Norbye Date: Thu, 26 Mar 2009 14:53:19 +0000 (+0100) Subject: Backed out changeset 74a1c5ce90d4 X-Git-Tag: 0.27~3 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=fa356c992dadfbd21eea474456d59dac4eba9495;p=m6w6%2Flibmemcached Backed out changeset 74a1c5ce90d4 There seems to be a problem with with using freed memory.. --- diff --git a/libmemcached/Makefile.am b/libmemcached/Makefile.am index 9b1f00c8..74a5bbe2 100644 --- a/libmemcached/Makefile.am +++ b/libmemcached/Makefile.am @@ -39,6 +39,7 @@ libmemcached_la_SOURCES = crc.c \ memcached_delete.c \ memcached_do.c \ memcached_fetch.c \ + memcached_fetch_execute.c \ memcached_flush.c \ memcached_get.c \ memcached_hash.c \ diff --git a/libmemcached/memcached_fetch.c b/libmemcached/memcached_fetch.c index 28e84ed9..7f8a6b52 100644 --- a/libmemcached/memcached_fetch.c +++ b/libmemcached/memcached_fetch.c @@ -14,28 +14,51 @@ char *memcached_fetch(memcached_st *ptr, char *key, size_t *key_length, return NULL; } - result_buffer= memcached_fetch_result(ptr, result_buffer, error); - - if (*error != MEMCACHED_SUCCESS) + while (ptr->cursor_server < ptr->number_of_hosts) { - *value_length= 0; - return NULL; - } + char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE]; - *value_length= memcached_string_length(&result_buffer->value); + if (memcached_server_response_count(&ptr->hosts[ptr->cursor_server]) == 0) + { + ptr->cursor_server++; + continue; + } - if (key) - { - strncpy(key, result_buffer->key, result_buffer->key_length); - *key_length= result_buffer->key_length; - } + *error= memcached_response(&ptr->hosts[ptr->cursor_server], buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, result_buffer); - if (result_buffer->flags) - *flags= result_buffer->flags; - else - *flags= 0; + if (*error == MEMCACHED_END) /* END means that we move on to the next */ + { + memcached_server_response_reset(&ptr->hosts[ptr->cursor_server]); + ptr->cursor_server++; + continue; + } + else if (*error == MEMCACHED_SUCCESS) + { + *value_length= memcached_string_length(&result_buffer->value); + + if (key) + { + strncpy(key, result_buffer->key, result_buffer->key_length); + *key_length= result_buffer->key_length; + } - return memcached_string_c_copy(&result_buffer->value); + if (result_buffer->flags) + *flags= result_buffer->flags; + else + *flags= 0; + + return memcached_string_c_copy(&result_buffer->value); + } + else + { + *value_length= 0; + return NULL; + } + } + + ptr->cursor_server= 0; + *value_length= 0; + return NULL; } memcached_result_st *memcached_fetch_result(memcached_st *ptr, @@ -75,25 +98,3 @@ memcached_result_st *memcached_fetch_result(memcached_st *ptr, return NULL; } -memcached_return memcached_fetch_execute(memcached_st *ptr, - memcached_execute_function *callback, - void *context, - unsigned int number_of_callbacks) -{ - memcached_result_st *result= &ptr->result; - memcached_return rc; - unsigned int x; - - while ((result= memcached_fetch_result(ptr, result, &rc)) != NULL) { - if (rc == MEMCACHED_SUCCESS) - { - for (x= 0; x < number_of_callbacks; x++) - { - rc= (*callback[x])(ptr, result, context); - if (rc != MEMCACHED_SUCCESS) - break; - } - } - } - return rc; -} diff --git a/libmemcached/memcached_fetch_execute.c b/libmemcached/memcached_fetch_execute.c new file mode 100644 index 00000000..5058fdec --- /dev/null +++ b/libmemcached/memcached_fetch_execute.c @@ -0,0 +1,47 @@ +#include "common.h" + +memcached_return memcached_fetch_execute(memcached_st *ptr, + memcached_execute_function *callback, + void *context, + unsigned int number_of_callbacks) +{ + memcached_result_st *result= &ptr->result; + + while (ptr->cursor_server < ptr->number_of_hosts) + { + memcached_return rc; + + char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE]; + + if (memcached_server_response_count(&ptr->hosts[ptr->cursor_server]) == 0) + { + ptr->cursor_server++; + continue; + } + + rc= memcached_response(&ptr->hosts[ptr->cursor_server], buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, result); + + if (rc == MEMCACHED_END) /* END means that we move on to the next */ + { + memcached_server_response_reset(&ptr->hosts[ptr->cursor_server]); + ptr->cursor_server++; + continue; + } + else if (rc == MEMCACHED_SUCCESS) + { + unsigned int x; + + for (x= 0; x < number_of_callbacks; x++) + { + memcached_return iferror; + + iferror= (*callback[x])(ptr, result, context); + + if (iferror != MEMCACHED_SUCCESS) + continue; + } + } + } + + return MEMCACHED_SUCCESS; +}