The clients and test programs should not be compiled with MEMCACHED_INTERNAL defined
[m6w6/libmemcached] / libmemcached / memcached_response.c
index 08e664f62fce4ef881de4db623df892058efc141..e9f82b0af3653064e9cec4fa4a8906d1b6128b31 100644 (file)
@@ -50,7 +50,8 @@ memcached_return memcached_response(memcached_server_st *ptr,
    * compatibility. 
    */
   if ((ptr->root->flags & MEM_BINARY_PROTOCOL) == 0)
-    while (memcached_server_response_count(ptr) > 1) {
+    while (memcached_server_response_count(ptr) > 1)
+    {
       memcached_return rc= memcached_read_one_response(ptr, buffer, buffer_length, result);
       
       unlikely (rc != MEMCACHED_END &&
@@ -156,7 +157,7 @@ static memcached_return textual_read_one_response(memcached_server_st *ptr,
     }
   }
 
-  return MEMCACHED_SUCCESS;
+  /* NOTREACHED */
 }
 
 char *memcached_result_value(memcached_result_st *ptr)
@@ -300,14 +301,30 @@ static memcached_return binary_read_one_response(memcached_server_st *ptr,
   else if (header.response.bodylen) 
   {
      /* What should I do with the error message??? just discard it for now */
-    char buffer[SMALL_STRING_LEN];
+    char hole[SMALL_STRING_LEN];
     while (bodylen > 0) 
     {
       size_t nr= (bodylen > SMALL_STRING_LEN) ? SMALL_STRING_LEN : bodylen;
-      if (memcached_safe_read(ptr, buffer, nr) != MEMCACHED_SUCCESS)
+      if (memcached_safe_read(ptr, hole, nr) != MEMCACHED_SUCCESS)
         return MEMCACHED_UNKNOWN_READ_FAILURE;
       bodylen -= nr;
     }
+
+    /* This might be an error from one of the quiet commands.. if
+     * so, just throw it away and get the next one. What about creating
+     * a callback to the user with the error information?
+     */
+    switch (header.response.opcode)
+    {
+    case PROTOCOL_BINARY_CMD_SETQ:
+    case PROTOCOL_BINARY_CMD_ADDQ:
+    case PROTOCOL_BINARY_CMD_REPLACEQ:
+    case PROTOCOL_BINARY_CMD_APPENDQ:
+    case PROTOCOL_BINARY_CMD_PREPENDQ:
+      return binary_read_one_response(ptr, buffer, buffer_length, result);
+    default:
+      break;
+    }
   }
 
   memcached_return rc= MEMCACHED_SUCCESS;