+
+static memcached_return_t _read_one_response(org::libmemcached::Instance* instance,
+ char *buffer, const size_t buffer_length,
+ memcached_result_st *result)
+{
+ memcached_server_response_decrement(instance);
+
+ if (result == NULL)
+ {
+ memcached_st *root= (memcached_st *)instance->root;
+ result = &root->result;
+ }
+
+ memcached_return_t rc;
+ if (memcached_is_binary(instance->root))
+ {
+ rc= binary_read_one_response(instance, buffer, buffer_length, result);
+ }
+ else
+ {
+ rc= textual_read_one_response(instance, buffer, buffer_length, result);
+ }
+
+ if (memcached_fatal(rc))
+ {
+ memcached_io_reset(instance);
+ }
+
+ return rc;
+}
+
+memcached_return_t memcached_read_one_response(org::libmemcached::Instance* instance,
+ memcached_result_st *result)
+{
+ char buffer[SMALL_STRING_LEN];
+
+ if (memcached_is_udp(instance->root))
+ {
+ return memcached_set_error(*instance, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT);
+ }
+
+
+ return _read_one_response(instance, buffer, sizeof(buffer), result);
+}
+
+memcached_return_t memcached_response(org::libmemcached::Instance* instance,
+ memcached_result_st *result)
+{
+ char buffer[1024];
+
+ return memcached_response(instance, buffer, sizeof(buffer), result);
+}
+
+memcached_return_t memcached_response(org::libmemcached::Instance* instance,
+ char *buffer, size_t buffer_length,
+ memcached_result_st *result)
+{
+ if (memcached_is_udp(instance->root))
+ {
+ return memcached_set_error(*instance, MEMCACHED_NOT_SUPPORTED, MEMCACHED_AT);
+ }
+
+ /* We may have old commands in the buffer not set, first purge */
+ if ((instance->root->flags.no_block) and (memcached_is_processing_input(instance->root) == false))
+ {
+ (void)memcached_io_write(instance);
+ }
+
+ /*
+ * The previous implementation purged all pending requests and just
+ * returned the last one. Purge all pending messages to ensure backwards
+ * compatibility.
+ */
+ if (memcached_is_binary(instance->root) == false and memcached_server_response_count(instance) > 1)
+ {
+ memcached_result_st junked_result;
+ memcached_result_st *junked_result_ptr= memcached_result_create(instance->root, &junked_result);
+
+ assert(junked_result_ptr);
+
+ while (memcached_server_response_count(instance) > 1)
+ {
+ memcached_return_t rc= _read_one_response(instance, buffer, buffer_length, junked_result_ptr);
+
+ // @TODO should we return an error on another but a bad read case?
+ if (memcached_fatal(rc))
+ {
+ memcached_result_free(junked_result_ptr);
+ return rc;
+ }
+ }
+ memcached_result_free(junked_result_ptr);
+ }
+
+ return _read_one_response(instance, buffer, buffer_length, result);
+}