cached the server error in memcached_server_st
authorMatt Knox <matthewknox@gmail.com>
Mon, 29 Jun 2009 20:51:23 +0000 (13:51 -0700)
committerMatt Knox <matthewknox@gmail.com>
Mon, 29 Jun 2009 20:51:23 +0000 (13:51 -0700)
libmemcached/memcached_response.c
libmemcached/memcached_server.c
libmemcached/memcached_server.h

index 1ea0c725ea12ca94ad0446ff2d894e1554fd9960..e1720f0a5f39f3c1eb2ee12bb02b01b4e5647dc4 100644 (file)
@@ -238,7 +238,16 @@ static memcached_return textual_read_one_response(memcached_server_st *ptr,
         return MEMCACHED_STAT;
       }
       else if (buffer[1] == 'E')
-        return MEMCACHED_SERVER_ERROR;
+       {
+         /* SERVER_ERROR */ 
+         char *startptr= buffer + 13, *endptr= startptr;
+         while (*endptr != '\r' && *endptr != '\n') endptr++;
+         if (ptr->cached_server_error) free(ptr->cached_server_error);
+         ptr->cached_server_error= malloc(endptr - startptr + 1);
+         memcpy(ptr->cached_server_error, startptr, endptr - startptr);
+         ptr->cached_server_error[endptr - startptr]= 0;
+         return MEMCACHED_SERVER_ERROR;
+       }
       else if (buffer[1] == 'T')
         return MEMCACHED_STORED;
       else
index 04364f3a3d31bad4b0c5fe607c353c8acb980c55..2359611e0f73d2b490904017fea54aab7a14456c 100644 (file)
@@ -53,6 +53,12 @@ void memcached_server_free(memcached_server_st *ptr)
 {
   memcached_quit_server(ptr, 0);
 
+  if (ptr->cached_server_error)
+  {
+    free(ptr->cached_server_error);
+    ptr->cached_server_error= NULL;
+  }
+
   if (ptr->address_info)
   {
     freeaddrinfo(ptr->address_info);
@@ -70,14 +76,24 @@ void memcached_server_free(memcached_server_st *ptr)
 */
 memcached_server_st *memcached_server_clone(memcached_server_st *clone, memcached_server_st *ptr)
 {
+  memcached_server_st *rv = NULL;
+
   /* We just do a normal create if ptr is missing */
   if (ptr == NULL)
     return NULL;
 
-  /* TODO We should check return type */
-  return memcached_server_create_with(ptr->root, clone, 
-                                      ptr->hostname, ptr->port, ptr->weight,
-                                      ptr->type);
+  rv = memcached_server_create_with(ptr->root, clone, 
+                                    ptr->hostname, ptr->port, ptr->weight,
+                                    ptr->type);
+  if (rv != NULL)
+  {
+    rv->cached_errno= ptr->cached_errno;
+    if (ptr->cached_server_error)
+      rv->cached_server_error= strdup(ptr->cached_server_error);
+  }
+
+  return rv;
+
 }
 
 memcached_return memcached_server_cursor(memcached_st *ptr, 
index 1d68f24e614fb3b0b0393471bf7a2a2ca0147731..cffc5e8077e6de3d77213d2e2a9e09ad657b7792 100644 (file)
@@ -21,6 +21,7 @@ struct memcached_server_st {
   unsigned int port;
   int cached_errno;
   int fd;
+  char *cached_server_error;
   uint32_t io_bytes_sent; /* # bytes sent since last read */
   uint32_t server_failure_counter;
   uint32_t weight;