Add support for query_id, and fixes a few cases where programmer error can
[awesomized/libmemcached] / libmemcached / flush.c
index e9c6370591761b2614d99517e64e110493b986bc..8da6b5b57b10cc663689db00b2a24f4051c0839f 100644 (file)
@@ -8,6 +8,10 @@ static memcached_return_t memcached_flush_textual(memcached_st *ptr,
 memcached_return_t memcached_flush(memcached_st *ptr, time_t expiration)
 {
   memcached_return_t rc;
+  if ((rc= initialize_query(ptr)) != MEMCACHED_SUCCESS)
+  {
+    return rc;
+  }
 
   LIBMEMCACHED_MEMCACHED_FLUSH_START();
   if (ptr->flags.binary_protocol)
@@ -21,30 +25,40 @@ memcached_return_t memcached_flush(memcached_st *ptr, time_t expiration)
 static memcached_return_t memcached_flush_textual(memcached_st *ptr, 
                                                   time_t expiration)
 {
-  unsigned int x;
-  size_t send_length;
-  memcached_return_t rc;
-  char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
-
   unlikely (memcached_server_count(ptr) == 0)
     return MEMCACHED_NO_SERVERS;
 
-  for (x= 0; x < memcached_server_count(ptr); x++)
+  for (unsigned int x= 0; x < memcached_server_count(ptr); x++)
   {
+    memcached_return_t rc;
+    char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
+
     bool no_reply= ptr->flags.no_reply;
+    memcached_server_write_instance_st instance=
+      memcached_server_instance_fetch(ptr, x);
 
+    int send_length;
     if (expiration)
-      send_length= (size_t) snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, 
-                                     "flush_all %llu%s\r\n",
-                                     (unsigned long long)expiration, no_reply ? " noreply" : "");
+    {
+      send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, 
+                            "flush_all %llu%s\r\n",
+                            (unsigned long long)expiration, no_reply ? " noreply" : "");
+    }
     else
-      send_length= (size_t) snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, 
-                                     "flush_all%s\r\n", no_reply ? " noreply" : "");
+    {
+      send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, 
+                            "flush_all%s\r\n", no_reply ? " noreply" : "");
+    }
 
-    rc= memcached_do(&ptr->hosts[x], buffer, send_length, 1);
+    if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE || send_length < 0)
+    {
+      return MEMCACHED_FAILURE;
+    }
+
+    rc= memcached_do(instance, buffer, (size_t)send_length, true);
 
     if (rc == MEMCACHED_SUCCESS && !no_reply)
-      (void)memcached_response(&ptr->hosts[x], buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, NULL);
+      (void)memcached_response(instance, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, NULL);
   }
 
   return MEMCACHED_SUCCESS;
@@ -53,7 +67,6 @@ static memcached_return_t memcached_flush_textual(memcached_st *ptr,
 static memcached_return_t memcached_flush_binary(memcached_st *ptr, 
                                                  time_t expiration)
 {
-  unsigned int x;
   protocol_binary_request_flush request= {.bytes= {0}};
 
   unlikely (memcached_server_count(ptr) == 0)
@@ -66,24 +79,34 @@ static memcached_return_t memcached_flush_binary(memcached_st *ptr,
   request.message.header.request.bodylen= htonl(request.message.header.request.extlen);
   request.message.body.expiration= htonl((uint32_t) expiration);
 
-  for (x= 0; x < memcached_server_count(ptr); x++)
+  for (uint32_t x= 0; x < memcached_server_count(ptr); x++)
   {
+    memcached_server_write_instance_st instance=
+      memcached_server_instance_fetch(ptr, x);
+
     if (ptr->flags.no_reply)
+    {
       request.message.header.request.opcode= PROTOCOL_BINARY_CMD_FLUSHQ;
+    }
     else
+    {
       request.message.header.request.opcode= PROTOCOL_BINARY_CMD_FLUSH;
-    if (memcached_do(&ptr->hosts[x], request.bytes, 
-                     sizeof(request.bytes), 1) != MEMCACHED_SUCCESS) 
+    }
+
+    if (memcached_do(instance, request.bytes, sizeof(request.bytes), true) != MEMCACHED_SUCCESS) 
     {
-      memcached_io_reset(&ptr->hosts[x]);
+      memcached_io_reset(instance);
       return MEMCACHED_WRITE_FAILURE;
     } 
   }
 
-  for (x= 0; x < memcached_server_count(ptr); x++)
+  for (uint32_t x= 0; x < memcached_server_count(ptr); x++)
   {
-    if (memcached_server_response_count(&ptr->hosts[x]) > 0)
-      (void)memcached_response(&ptr->hosts[x], NULL, 0, NULL);
+    memcached_server_write_instance_st instance=
+      memcached_server_instance_fetch(ptr, x);
+
+    if (memcached_server_response_count(instance) > 0)
+      (void)memcached_response(instance, NULL, 0, NULL);
   }
 
   return MEMCACHED_SUCCESS;