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;