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
;
14 end_ptr
= buffer
+ MEMCACHED_DEFAULT_COMMAND_SIZE
;
16 result
->key_length
= 0;
18 memcached_string_reset(&result
->value
);
21 string_ptr
+= 6; /* "VALUE " */
29 result
->key_length
= 0;
31 for (; isgraph(*string_ptr
); string_ptr
++)
37 result
->key
[result
->key_length
]= 0;
40 if (end_ptr
== string_ptr
)
43 /* Flags fetch move past space */
45 if (end_ptr
== string_ptr
)
47 for (next_ptr
= string_ptr
; isdigit(*string_ptr
); string_ptr
++);
48 result
->flags
= (uint32_t)strtol(next_ptr
, &string_ptr
, 10);
50 if (end_ptr
== string_ptr
)
53 /* Length fetch move past space*/
55 if (end_ptr
== string_ptr
)
58 for (next_ptr
= string_ptr
; isdigit(*string_ptr
); string_ptr
++);
59 value_length
= (size_t)strtoll(next_ptr
, &string_ptr
, 10);
61 if (end_ptr
== string_ptr
)
65 if (*string_ptr
== '\r')
67 /* 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
)
87 /* We add two bytes so that we can walk the \r\n */
88 rc
= memcached_string_check(&result
->value
, value_length
+2);
89 if (rc
!= MEMCACHED_SUCCESS
)
92 return MEMCACHED_MEMORY_ALLOCATION_FAILURE
;
95 value_ptr
= memcached_string_value(&result
->value
);
98 We read the \r\n into the string since not doing so is more
99 cycles then the waster of memory to do so.
101 We are null terminating through, which will most likely make
102 some people lazy about using the return length.
104 to_read
= (value_length
) + 2;
106 read_length
= memcached_io_read(ptr
, value_ptr
, to_read
);
108 if (read_length
!= (size_t)(value_length
+ 2))
113 /* This next bit blows the API, but this is internal....*/
116 char_ptr
= memcached_string_value(&result
->value
);;
117 char_ptr
[value_length
]= 0;
118 char_ptr
[value_length
+ 1]= 0;
119 memcached_string_set_length(&result
->value
, value_length
);
122 return MEMCACHED_SUCCESS
;
128 return MEMCACHED_PARTIAL_READ
;
131 char *memcached_fetch(memcached_st
*ptr
, char *key
, size_t *key_length
,
132 size_t *value_length
,
134 memcached_return
*error
)
136 memcached_result_st
*result_buffer
= &ptr
->result
;
138 while (ptr
->cursor_server
< ptr
->number_of_hosts
)
140 char buffer
[MEMCACHED_DEFAULT_COMMAND_SIZE
];
142 if (memcached_server_response_count(&ptr
->hosts
[ptr
->cursor_server
]) == 0)
144 ptr
->cursor_server
++;
148 *error
= memcached_response(&ptr
->hosts
[ptr
->cursor_server
], buffer
, MEMCACHED_DEFAULT_COMMAND_SIZE
, result_buffer
);
150 if (*error
== MEMCACHED_END
) /* END means that we move on to the next */
152 memcached_server_response_reset(&ptr
->hosts
[ptr
->cursor_server
]);
153 ptr
->cursor_server
++;
156 else if (*error
== MEMCACHED_SUCCESS
)
158 *value_length
= memcached_string_length(&result_buffer
->value
);
162 strncpy(key
, result_buffer
->key
, result_buffer
->key_length
);
163 *key_length
= result_buffer
->key_length
;
165 *flags
= result_buffer
->flags
;
167 return memcached_string_c_copy(&result_buffer
->value
);
176 ptr
->cursor_server
= 0;
181 memcached_result_st
*memcached_fetch_result(memcached_st
*ptr
,
182 memcached_result_st
*result
,
183 memcached_return
*error
)
186 result
= memcached_result_create(ptr
, NULL
);
188 WATCHPOINT_ASSERT(result
->value
.is_allocated
!= MEMCACHED_USED
);
191 if (ptr
->flags
& MEM_NO_BLOCK
)
192 memcached_io_preread(ptr
);
195 while (ptr
->cursor_server
< ptr
->number_of_hosts
)
197 char buffer
[MEMCACHED_DEFAULT_COMMAND_SIZE
];
199 if (memcached_server_response_count(&ptr
->hosts
[ptr
->cursor_server
]) == 0)
201 ptr
->cursor_server
++;
205 *error
= memcached_response(&ptr
->hosts
[ptr
->cursor_server
], buffer
, MEMCACHED_DEFAULT_COMMAND_SIZE
, result
);
207 if (*error
== MEMCACHED_END
) /* END means that we move on to the next */
209 memcached_server_response_reset(&ptr
->hosts
[ptr
->cursor_server
]);
210 ptr
->cursor_server
++;
213 else if (*error
== MEMCACHED_SUCCESS
)
219 /* We have completed reading data */
220 if (result
->is_allocated
== MEMCACHED_ALLOCATED
)
221 memcached_result_free(result
);
223 memcached_string_reset(&result
->value
);
225 ptr
->cursor_server
= 0;