Merge in code changes for all of the new parser.
[m6w6/libmemcached] / libmemcached / version.c
index dde59066083c970d3c21105babd0d84c959873de..82de87d362240666b2134ee50b802c56b7e99952 100644 (file)
@@ -13,18 +13,13 @@ memcached_return_t memcached_version(memcached_st *ptr)
   if (ptr->flags.use_udp)
     return MEMCACHED_NOT_SUPPORTED;
 
-  bool was_blocking= ptr->flags.no_block;
   memcached_return_t rc;
 
-  ptr->flags.no_block= false;
-
   if (ptr->flags.binary_protocol)
     rc= memcached_version_binary(ptr);
   else
     rc= memcached_version_textual(ptr);      
 
-  ptr->flags.no_block= was_blocking;
-
   return rc;
 }
 
@@ -36,7 +31,7 @@ static inline memcached_return_t memcached_version_textual(memcached_st *ptr)
   char *response_ptr;
   const char *command= "version\r\n";
 
-  send_length= strlen(command);
+  send_length= sizeof("version\r\n") -1;
 
   rc= MEMCACHED_SUCCESS;
   for (uint32_t x= 0; x < memcached_server_count(ptr); x++)
@@ -45,10 +40,14 @@ static inline memcached_return_t memcached_version_textual(memcached_st *ptr)
     memcached_server_write_instance_st instance=
       memcached_server_instance_fetch(ptr, x);
 
+    // Optimization, we only fetch version once.
+    if (instance->major_version != UINT8_MAX)
+      continue;
+
     rrc= memcached_do(instance, command, send_length, true);
     if (rrc != MEMCACHED_SUCCESS)
     {
-      instance->major_version= instance->minor_version= instance->micro_version= 0;
+      instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
       rc= MEMCACHED_SOME_ERRORS;
       continue;
     }
@@ -56,7 +55,7 @@ static inline memcached_return_t memcached_version_textual(memcached_st *ptr)
     rrc= memcached_response(instance, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, NULL);
     if (rrc != MEMCACHED_SUCCESS)
     {
-      instance->major_version= instance->minor_version= instance->micro_version= 0;
+      instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
       rc= MEMCACHED_SOME_ERRORS;
       continue;
     }
@@ -68,7 +67,7 @@ static inline memcached_return_t memcached_version_textual(memcached_st *ptr)
     instance->major_version= (uint8_t)strtol(response_ptr, (char **)NULL, 10);
     if (errno == ERANGE)
     {
-      instance->major_version= instance->minor_version= instance->micro_version= 0;
+      instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
       rc= MEMCACHED_SOME_ERRORS;
       continue;
     }
@@ -79,7 +78,7 @@ static inline memcached_return_t memcached_version_textual(memcached_st *ptr)
     instance->minor_version= (uint8_t)strtol(response_ptr, (char **)NULL, 10);
     if (errno == ERANGE)
     {
-      instance->major_version= instance->minor_version= instance->micro_version= 0;
+      instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
       rc= MEMCACHED_SOME_ERRORS;
       continue;
     }
@@ -89,7 +88,7 @@ static inline memcached_return_t memcached_version_textual(memcached_st *ptr)
     instance->micro_version= (uint8_t)strtol(response_ptr, (char **)NULL, 10);
     if (errno == ERANGE)
     {
-      instance->major_version= instance->minor_version= instance->micro_version= 0;
+      instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
       rc= MEMCACHED_SOME_ERRORS;
       continue;
     }
@@ -114,6 +113,9 @@ static inline memcached_return_t memcached_version_binary(memcached_st *ptr)
     memcached_server_write_instance_st instance=
       memcached_server_instance_fetch(ptr, x);
 
+    if (instance->major_version != UINT8_MAX)
+      continue;
+
     rrc= memcached_do(instance, request.bytes, sizeof(request.bytes), true);
     if (rrc != MEMCACHED_SUCCESS) 
     {
@@ -128,6 +130,9 @@ static inline memcached_return_t memcached_version_binary(memcached_st *ptr)
     memcached_server_write_instance_st instance=
       memcached_server_instance_fetch(ptr, x);
 
+    if (instance->major_version != UINT8_MAX)
+      continue;
+
     if (memcached_server_response_count(instance) > 0) 
     {
       memcached_return_t rrc;
@@ -143,8 +148,29 @@ static inline memcached_return_t memcached_version_binary(memcached_st *ptr)
       }
 
       instance->major_version= (uint8_t)strtol(buffer, &p, 10);
+      if (errno == ERANGE)
+      {
+        instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
+        rc= MEMCACHED_SOME_ERRORS;
+        continue;
+      }
+
       instance->minor_version= (uint8_t)strtol(p + 1, &p, 10);
+      if (errno == ERANGE)
+      {
+        instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
+        rc= MEMCACHED_SOME_ERRORS;
+        continue;
+      }
+
       instance->micro_version= (uint8_t)strtol(p + 1, NULL, 10);
+      if (errno == ERANGE)
+      {
+        instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
+        rc= MEMCACHED_SOME_ERRORS;
+        continue;
+      }
+
     }
   }