X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=lib%2Fmemcached_response.c;h=7402975f895761ade88c41864174b074e630c433;hb=3bd95102380ff8d9f2599f0965c09776344d0691;hp=24ee832f148a593ab9791f049abb1308d2170aad;hpb=257f0547823cf6b18473ba8bd2580b38235f6d79;p=m6w6%2Flibmemcached diff --git a/lib/memcached_response.c b/lib/memcached_response.c index 24ee832f..7402975f 100644 --- a/lib/memcached_response.c +++ b/lib/memcached_response.c @@ -6,46 +6,68 @@ */ #include "common.h" +#include "memcached_io.h" memcached_return memcached_response(memcached_st *ptr, char *buffer, size_t buffer_length, unsigned int server_key) { + unsigned int x; size_t send_length; char *buffer_ptr; + unsigned int max_messages; + - memset(buffer, 0, buffer_length); send_length= 0; - buffer_ptr= buffer; - while (1) + max_messages= memcached_server_response_count(ptr, server_key); + for (x= 0; x <= max_messages; x++) { - unsigned int read_length; + size_t total_length= 0; + buffer_ptr= buffer; + + while (1) + { + unsigned int read_length; + + read_length= memcached_io_read(ptr, server_key, + buffer_ptr, 1); - read_length= memcached_io_read(ptr, server_key, - buffer_ptr, 1); + if (read_length != 1) + return MEMCACHED_UNKNOWN_READ_FAILURE; - if (read_length != 1) - return MEMCACHED_UNKNOWN_READ_FAILURE; + if (*buffer_ptr == '\n') + break; + else + buffer_ptr++; + + total_length++; + WATCHPOINT_ASSERT(total_length <= buffer_length); - if (*buffer_ptr == '\n') - break; - else - buffer_ptr++; + if (total_length >= buffer_length) + return MEMCACHED_PROTOCOL_ERROR; + } + buffer_ptr++; + *buffer_ptr= 0; + + if (memcached_server_response_count(ptr, server_key)) + memcached_server_response_decrement(ptr, server_key); } switch(buffer[0]) { - case 'V': /* VALUE */ + case 'V': /* VALUE || VERSION */ return MEMCACHED_SUCCESS; case 'O': /* OK */ return MEMCACHED_SUCCESS; case 'S': /* STORED STATS SERVER_ERROR */ { - if (buffer[1] == 'T') /* STORED STATS */ - return MEMCACHED_SUCCESS; + if (buffer[2] == 'A') /* STORED STATS */ + return MEMCACHED_STAT; else if (buffer[1] == 'E') return MEMCACHED_SERVER_ERROR; + else if (buffer[1] == 'T') + return MEMCACHED_STORED; else return MEMCACHED_UNKNOWN_READ_FAILURE; } @@ -78,3 +100,15 @@ memcached_return memcached_response(memcached_st *ptr, return MEMCACHED_SUCCESS; } + +char *memcached_result_value(memcached_result_st *ptr) +{ + memcached_string_st *sptr= &ptr->value; + return memcached_string_value(sptr); +} + +size_t memcached_result_length(memcached_result_st *ptr) +{ + memcached_string_st *sptr= &ptr->value; + return memcached_string_length(sptr); +}