Pushing missing doc, update to list of functions at bottom of
[m6w6/libmemcached] / lib / memcached_response.c
index 7402975f895761ade88c41864174b074e630c433..6ec120c8662208e2ed7a8eb1f7ba2f1c7dc0eab1 100644 (file)
@@ -10,6 +10,7 @@
 
 memcached_return memcached_response(memcached_st *ptr, 
                                     char *buffer, size_t buffer_length,
+                                    memcached_result_st *result,
                                     unsigned int server_key)
 {
   unsigned int x;
@@ -20,8 +21,12 @@ memcached_return memcached_response(memcached_st *ptr,
 
   send_length= 0;
 
+  /* We may have old commands in the buffer not set, first purge */
+  if (ptr->flags & MEM_NO_BLOCK)
+    (void)memcached_io_write(ptr, server_key, NULL, 0, 1);
+
   max_messages= memcached_server_response_count(ptr, server_key);
-  for (x= 0; x <=  max_messages; x++)
+  for (x= 0; x <  max_messages; x++)
   {
     size_t total_length= 0;
     buffer_ptr= buffer;
@@ -50,26 +55,54 @@ memcached_return memcached_response(memcached_st *ptr,
     buffer_ptr++;
     *buffer_ptr= 0;
 
-    if (memcached_server_response_count(ptr, server_key))
-      memcached_server_response_decrement(ptr, server_key);
+    memcached_server_response_decrement(ptr, server_key);
   }
 
   switch(buffer[0])
   {
   case 'V': /* VALUE || VERSION */
-    return MEMCACHED_SUCCESS;
+    if (buffer[1] == 'A') /* VALUE */
+    {
+      memcached_return rc;
+
+      /* We add back in one because we will need to search for END */
+      memcached_server_response_increment(ptr, server_key);
+      if (result)
+        rc= value_fetch(ptr, buffer, result, server_key);
+      else
+        rc= value_fetch(ptr, buffer, &ptr->result, server_key);
+
+      return rc;
+    }
+    else if (buffer[1] == 'E') /* VERSION */
+    {
+      return MEMCACHED_SUCCESS;
+    }
+    else
+    {
+      WATCHPOINT_STRING(buffer);
+      WATCHPOINT_ASSERT(0);
+      return MEMCACHED_UNKNOWN_READ_FAILURE;
+    }
   case 'O': /* OK */
     return MEMCACHED_SUCCESS;
   case 'S': /* STORED STATS SERVER_ERROR */
     {
       if (buffer[2] == 'A') /* STORED STATS */
+      {
+        memcached_server_response_increment(ptr, server_key);
         return MEMCACHED_STAT;
+      }
       else if (buffer[1] == 'E')
         return MEMCACHED_SERVER_ERROR;
       else if (buffer[1] == 'T')
         return MEMCACHED_STORED;
       else
+      {
+        WATCHPOINT_STRING(buffer);
+        WATCHPOINT_ASSERT(0);
         return MEMCACHED_UNKNOWN_READ_FAILURE;
+      }
     }
   case 'D': /* DELETED */
     return MEMCACHED_DELETED;