2
#include "memcached_io.h"
4
memcached_return value_fetch(memcached_server_st *ptr,
6
memcached_result_st *result)
8
memcached_return rc= MEMCACHED_SUCCESS;
17
end_ptr= buffer + MEMCACHED_DEFAULT_COMMAND_SIZE;
19
memcached_result_reset(result);
22
string_ptr+= 6; /* "VALUE " */
30
result->key_length= 0;
32
for (; isgraph(*string_ptr); string_ptr++)
38
result->key[result->key_length]= 0;
41
if (end_ptr == string_ptr)
44
/* Flags fetch move past space */
46
if (end_ptr == string_ptr)
48
for (next_ptr= string_ptr; isdigit(*string_ptr); string_ptr++);
49
result->flags= (uint32_t)strtol(next_ptr, &string_ptr, 10);
51
if (end_ptr == string_ptr)
54
/* Length fetch move past space*/
56
if (end_ptr == string_ptr)
59
for (next_ptr= string_ptr; isdigit(*string_ptr); string_ptr++);
60
value_length= (size_t)strtoll(next_ptr, &string_ptr, 10);
62
if (end_ptr == string_ptr)
66
if (*string_ptr == '\r')
68
/* Skip past the \r\n */
74
for (next_ptr= string_ptr; isdigit(*string_ptr); string_ptr++);
75
result->cas= (size_t)strtoll(next_ptr, &string_ptr, 10);
78
if (end_ptr < string_ptr)
81
/* We add two bytes so that we can walk the \r\n */
82
rc= memcached_string_check(&result->value, value_length+2);
83
if (rc != MEMCACHED_SUCCESS)
86
return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
89
value_ptr= memcached_string_value(&result->value);
92
We read the \r\n into the string since not doing so is more
93
cycles then the waster of memory to do so.
95
We are null terminating through, which will most likely make
96
some people lazy about using the return length.
98
to_read= (value_length) + 2;
99
read_length= memcached_io_read(ptr, value_ptr, to_read);
100
if (read_length != (size_t)(value_length + 2))
105
/* This next bit blows the API, but this is internal....*/
108
char_ptr= memcached_string_value(&result->value);;
109
char_ptr[value_length]= 0;
110
char_ptr[value_length + 1]= 0;
111
memcached_string_set_length(&result->value, value_length);
114
return MEMCACHED_SUCCESS;
117
memcached_io_reset(ptr);
119
return MEMCACHED_PARTIAL_READ;
122
char *memcached_fetch(memcached_st *ptr, char *key, size_t *key_length,
123
size_t *value_length,
125
memcached_return *error)
127
memcached_result_st *result_buffer= &ptr->result;
129
while (ptr->cursor_server < ptr->number_of_hosts)
131
char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
133
if (memcached_server_response_count(&ptr->hosts[ptr->cursor_server]) == 0)
135
ptr->cursor_server++;
139
*error= memcached_response(&ptr->hosts[ptr->cursor_server], buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, result_buffer);
141
if (*error == MEMCACHED_END) /* END means that we move on to the next */
143
memcached_server_response_reset(&ptr->hosts[ptr->cursor_server]);
144
ptr->cursor_server++;
147
else if (*error == MEMCACHED_SUCCESS)
149
*value_length= memcached_string_length(&result_buffer->value);
153
strncpy(key, result_buffer->key, result_buffer->key_length);
154
*key_length= result_buffer->key_length;
157
if (result_buffer->flags)
158
*flags= result_buffer->flags;
162
return memcached_string_c_copy(&result_buffer->value);
171
ptr->cursor_server= 0;
176
memcached_result_st *memcached_fetch_result(memcached_st *ptr,
177
memcached_result_st *result,
178
memcached_return *error)
181
result= memcached_result_create(ptr, NULL);
183
WATCHPOINT_ASSERT(result->value.is_allocated != MEMCACHED_USED);
186
if (ptr->flags & MEM_NO_BLOCK)
187
memcached_io_preread(ptr);
190
while (ptr->cursor_server < ptr->number_of_hosts)
192
char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
194
if (memcached_server_response_count(&ptr->hosts[ptr->cursor_server]) == 0)
196
ptr->cursor_server++;
200
*error= memcached_response(&ptr->hosts[ptr->cursor_server], buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, result);
202
if (*error == MEMCACHED_END) /* END means that we move on to the next */
204
memcached_server_response_reset(&ptr->hosts[ptr->cursor_server]);
205
ptr->cursor_server++;
208
else if (*error == MEMCACHED_SUCCESS)
214
/* We have completed reading data */
215
if (result->is_allocated == MEMCACHED_ALLOCATED)
216
memcached_result_free(result);
218
memcached_string_reset(&result->value);
220
ptr->cursor_server= 0;