Committing work for next release (got to do something over lunch aye?)
[m6w6/libmemcached] / lib / memcached_response.c
index 1276351332d829d851eab826fe4ce61f540465ed..7402975f895761ade88c41864174b074e630c433 100644 (file)
@@ -6,49 +6,73 @@
 */
 
 #include "common.h"
+#include "memcached_io.h"
 
 memcached_return memcached_response(memcached_st *ptr, 
                                     char *buffer, size_t buffer_length,
                                     unsigned int server_key)
 {
+  unsigned int x;
   size_t send_length;
   char *buffer_ptr;
+  unsigned int max_messages;
+
 
-  memset(buffer, 0, buffer_length);
   send_length= 0;
 
-  buffer_ptr= buffer;
-  while (1)
+  max_messages= memcached_server_response_count(ptr, server_key);
+  for (x= 0; x <=  max_messages; x++)
   {
-    unsigned int read_length;
-    read_length= recv(ptr->hosts[server_key].fd, buffer_ptr, 1, 0);
+    size_t total_length= 0;
+    buffer_ptr= buffer;
+
+    while (1)
+    {
+      unsigned int read_length;
+
+      read_length= memcached_io_read(ptr, server_key,
+                                     buffer_ptr, 1);
+
+      if (read_length != 1)
+        return  MEMCACHED_UNKNOWN_READ_FAILURE;
 
-    if (read_length != 1)
-      return  MEMCACHED_UNKNOWN_READ_FAILURE;
+      if (*buffer_ptr == '\n')
+        break;
+      else
+        buffer_ptr++;
+
+      total_length++;
+      WATCHPOINT_ASSERT(total_length <= buffer_length);
+
+      if (total_length >= buffer_length)
+        return MEMCACHED_PROTOCOL_ERROR;
+    }
+    buffer_ptr++;
+    *buffer_ptr= 0;
 
-    if (*buffer_ptr == '\n')
-      break;
-    else
-      buffer_ptr++;
+    if (memcached_server_response_count(ptr, server_key))
+      memcached_server_response_decrement(ptr, server_key);
   }
 
   switch(buffer[0])
   {
-  case 'V': /* VALUE */
+  case 'V': /* VALUE || VERSION */
     return MEMCACHED_SUCCESS;
   case 'O': /* OK */
     return MEMCACHED_SUCCESS;
   case 'S': /* STORED STATS SERVER_ERROR */
     {
-      if (buffer[1] == 'T') /* STORED STATS */
-        return MEMCACHED_SUCCESS;
+      if (buffer[2] == 'A') /* STORED STATS */
+        return MEMCACHED_STAT;
       else if (buffer[1] == 'E')
         return MEMCACHED_SERVER_ERROR;
+      else if (buffer[1] == 'T')
+        return MEMCACHED_STORED;
       else
         return MEMCACHED_UNKNOWN_READ_FAILURE;
     }
   case 'D': /* DELETED */
-    return MEMCACHED_SUCCESS;
+    return MEMCACHED_DELETED;
   case 'N': /* NOT_FOUND */
     {
       if (buffer[4] == 'F')
@@ -61,7 +85,7 @@ memcached_return memcached_response(memcached_st *ptr,
   case 'E': /* PROTOCOL ERROR or END */
     {
       if (buffer[1] == 'N')
-        return MEMCACHED_NOTFOUND;
+        return MEMCACHED_END;
       else if (buffer[1] == 'R')
         return MEMCACHED_PROTOCOL_ERROR;
       else
@@ -76,3 +100,15 @@ memcached_return memcached_response(memcached_st *ptr,
 
   return MEMCACHED_SUCCESS;
 }
+
+char *memcached_result_value(memcached_result_st *ptr)
+{
+  memcached_string_st *sptr= &ptr->value;
+  return memcached_string_value(sptr);
+}
+
+size_t memcached_result_length(memcached_result_st *ptr)
+{
+  memcached_string_st *sptr= &ptr->value;
+  return memcached_string_length(sptr);
+}