X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=lib%2Fmemcached_response.c;h=91ae3fe60870e48092bd2c1bff8f28c56c81717e;hb=b8aaaefdcb0b10d22668da2b530b67f55ffa653a;hp=693f9b30520a71c0f21f875ffc095090b25e8c6f;hpb=87424051896224c7fbc3744a1dcf94dbd76ccfef;p=m6w6%2Flibmemcached diff --git a/lib/memcached_response.c b/lib/memcached_response.c index 693f9b30..91ae3fe6 100644 --- a/lib/memcached_response.c +++ b/lib/memcached_response.c @@ -12,51 +12,68 @@ memcached_return memcached_response(memcached_st *ptr, unsigned int server_key) { size_t send_length; + char *buffer_ptr; memset(buffer, 0, buffer_length); - send_length= read(ptr->hosts[server_key].fd, buffer, buffer_length); + send_length= 0; - if (send_length) - switch(buffer[0]) + buffer_ptr= buffer; + while (1) + { + unsigned int read_length; + read_length= read(ptr->hosts[server_key].fd, buffer_ptr, 1); + + if (read_length != 1) + return MEMCACHED_UNKNOWN_READ_FAILURE; + + if (*buffer_ptr == '\n') + break; + else + buffer_ptr++; + } + + switch(buffer[0]) + { + case 'V': /* VALUE */ + return MEMCACHED_SUCCESS; + case 'O': /* OK */ + return MEMCACHED_SUCCESS; + case 'S': /* STORED STATS SERVER_ERROR */ + { + if (buffer[1] == 'T') /* STORED STATS */ + return MEMCACHED_SUCCESS; + else if (buffer[1] == 'E') + return MEMCACHED_SERVER_ERROR; + else + return MEMCACHED_UNKNOWN_READ_FAILURE; + } + case 'D': /* DELETED */ + return MEMCACHED_SUCCESS; + case 'N': /* NOT_FOUND */ + { + if (buffer[4] == 'F') + return MEMCACHED_NOTFOUND; + else if (buffer[4] == 'S') + return MEMCACHED_NOTSTORED; + else + return MEMCACHED_UNKNOWN_READ_FAILURE; + } + case 'E': /* PROTOCOL ERROR or END */ { - case 'V': /* VALUE */ - return MEMCACHED_SUCCESS; - case 'O': /* OK */ - return MEMCACHED_SUCCESS; - case 'S': /* STORED STATS SERVER_ERROR */ - { - if (buffer[1] == 'T') /* STORED STATS */ - return MEMCACHED_SUCCESS; - else if (buffer[1] == 'E') - return MEMCACHED_SERVER_ERROR; - else - return MEMCACHED_UNKNOWN_READ_FAILURE; - } - case 'D': /* DELETED */ - return MEMCACHED_SUCCESS; - case 'N': /* NOT_FOUND */ - { - if (buffer[4] == 'F') - return MEMCACHED_NOTFOUND; - else if (buffer[4] == 'S') - return MEMCACHED_NOTSTORED; - else - return MEMCACHED_UNKNOWN_READ_FAILURE; - } - case 'E': /* PROTOCOL ERROR or END */ - { - if (buffer[1] == 'N') - return MEMCACHED_NOTFOUND; - else if (buffer[1] == 'R') - return MEMCACHED_PROTOCOL_ERROR; - else - return MEMCACHED_UNKNOWN_READ_FAILURE; - } - case 'C': /* CLIENT ERROR */ - return MEMCACHED_CLIENT_ERROR; - default: - return MEMCACHED_UNKNOWN_READ_FAILURE; + if (buffer[1] == 'N') + return MEMCACHED_NOTFOUND; + else if (buffer[1] == 'R') + return MEMCACHED_PROTOCOL_ERROR; + else + return MEMCACHED_UNKNOWN_READ_FAILURE; } + case 'C': /* CLIENT ERROR */ + return MEMCACHED_CLIENT_ERROR; + default: + return MEMCACHED_UNKNOWN_READ_FAILURE; + + return MEMCACHED_READ_FAILURE; + } - return MEMCACHED_READ_FAILURE; + return MEMCACHED_SUCCESS; }