Add ability to have version "just requested" when you initially connect.
[m6w6/libmemcached] / libmemcached / version.cc
index 5772ef2c617cf32e6ca1b83aaac799f680d1d3d3..e9a54050977de0843004f1e3e41dcc196d0f9c86 100644 (file)
@@ -143,23 +143,85 @@ static inline memcached_return_t memcached_version_binary(memcached_st *ptr)
   return errors_happened ? MEMCACHED_SOME_ERRORS : MEMCACHED_SUCCESS;
 }
 
-memcached_return_t memcached_version(memcached_st *ptr)
+static inline void version_ascii_instance(org::libmemcached::Instance* instance)
 {
-  memcached_return_t rc;
-  if (memcached_failed(rc= initialize_query(ptr, true)))
+  if (instance->major_version != UINT8_MAX)
   {
-    return rc;
+    libmemcached_io_vector_st vector[]=
+    {
+      { memcached_literal_param("version\r\n") },
+    };
+
+    (void)memcached_vdo(instance, vector, 1, false);
   }
+}
 
-  if (memcached_is_udp(ptr))
+static inline void version_binary_instance(org::libmemcached::Instance* instance)
+{
+  if (instance->major_version != UINT8_MAX)
   {
-    return MEMCACHED_NOT_SUPPORTED;
+    protocol_binary_request_version request= {};
+
+    request.message.header.request.opcode= PROTOCOL_BINARY_CMD_VERSION;
+    request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES;
+
+    libmemcached_io_vector_st vector[]=
+    {
+      { request.bytes, sizeof(request.bytes) }
+    };
+
+    initialize_binary_request(instance, request.message.header);
+
+    (void)memcached_vdo(instance, vector, 1, false);
+  }
+}
+
+void memcached_version_instance(org::libmemcached::Instance* instance)
+{
+  if (instance)
+  {
+    if (memcached_has_root(instance))
+    {
+      if (memcached_is_fetching_version(instance->root))
+      {
+        if (memcached_is_udp(instance->root) == false)
+        {
+
+          if (memcached_is_binary(instance->root))
+          {
+            version_binary_instance(instance);
+            return;
+          }
+
+          version_ascii_instance(instance);      
+        }
+      }
+    }
   }
+}
 
-  if (memcached_is_binary(ptr))
+memcached_return_t memcached_version(memcached_st *ptr)
+{
+  if (ptr)
   {
-    return memcached_version_binary(ptr);
+    memcached_return_t rc;
+    if (memcached_failed(rc= initialize_query(ptr, true)))
+    {
+      return rc;
+    }
+
+    if (memcached_is_udp(ptr))
+    {
+      return MEMCACHED_NOT_SUPPORTED;
+    }
+
+    if (memcached_is_binary(ptr))
+    {
+      return memcached_version_binary(ptr);
+    }
+
+    return memcached_version_textual(ptr);      
   }
 
-  return memcached_version_textual(ptr);      
+  return MEMCACHED_INVALID_ARGUMENTS;
 }