-#include <memcached.h>
-
-static char *memcached_value_fetch(memcached_st *ptr, char *key, size_t *key_length,
- size_t *value_length,
- uint16_t *flags,
- memcached_return *error,
- char load_key,
- unsigned int server_key)
-{
- char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
- char *string_ptr;
-
- *value_length= 0;
-
- memset(buffer, 0, MEMCACHED_DEFAULT_COMMAND_SIZE);
- *error= memcached_response(ptr, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, server_key);
-
- if (*error == MEMCACHED_SUCCESS)
- {
- char *end_ptr;
-
- string_ptr= buffer;
- string_ptr+= 6; /* "VALUE " */
-
- /* We load the key */
- if (load_key)
- {
- memset(key, 0, MEMCACHED_MAX_KEY);
- for (end_ptr= string_ptr; *end_ptr != ' '; end_ptr++)
- {
- *key= *end_ptr;
- key++;
- }
- }
- else /* Skip characters */
- for (end_ptr= string_ptr; *end_ptr != ' '; end_ptr++);
-
- /* Flags fetch */
- string_ptr= end_ptr + 1;
- for (end_ptr= string_ptr; *end_ptr != ' '; end_ptr++);
- *flags= (uint16_t)strtol(string_ptr, &end_ptr, 10);
-
- /* Length fetch */
- string_ptr= end_ptr + 1;
- for (end_ptr= string_ptr; *end_ptr != ' '; end_ptr++);
- *value_length= strtoll(string_ptr, &end_ptr, 10);
-
- /* Skip past the \r\n */
- string_ptr= end_ptr +2;
-
- if (*value_length)
- {
- size_t read_length;
- char *value;
-
- /* We add two bytes so that we can walk the \r\n */
- value= (char *)malloc(((*value_length) +2) * sizeof(char));
-
- if (!value)
- {
- *value_length= 0;
- *error= MEMCACHED_MEMORY_ALLOCATION_FAILURE;
- return NULL;
- }
-
- read_length= read(ptr->hosts[server_key].fd, value, (*value_length)+2);
-
- if ((read_length -2) != *value_length)
- {
- free(value);
- *error= MEMCACHED_PARTIAL_READ;
-
- return NULL;
- }
-
- return value;
- }
- }
-
- return NULL;
-}