Updated return code from memcached_response to send proper return to
authorBrian Aker <brian@tangent.org>
Sun, 7 Oct 2007 21:39:58 +0000 (14:39 -0700)
committerBrian Aker <brian@tangent.org>
Sun, 7 Oct 2007 21:39:58 +0000 (14:39 -0700)
memcached_stats().

Fixed memcached_stat to report accurate values.

ChangeLog
include/memcached.h
lib/memcached_response.c
lib/memcached_stats.c
lib/memcached_strerror.c
src/memstat.c
tests/output.res

index 42a319c570b4b34c84e2f856c76f03b61fd20bc6..c14cabf0bc110be49616e561985a59624a5ec67d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,7 @@
   * Fixed bug in multiple hosts not being activated
   * Added environmental variable MEMCACHED_SERVERS which can be used to 
     set the servers list.
+  * fixed memcached_stat method (and now memstat works)
 
 0.4 Wed Oct  3 10:28:50 PDT 2007
   * Added buffered IO to write calls for keys
index 1633872fea0412bdc903871d265c699bd756e1ce..d687897a20407bc03b13abf852db5bbe77855683 100644 (file)
@@ -66,6 +66,7 @@ typedef enum {
   MEMCACHED_END,
   MEMCACHED_DELETED,
   MEMCACHED_VALUE,
+  MEMCACHED_STAT,
   MEMCACHED_MAXIMUM_RETURN, /* Always add new error code before */
 } memcached_return;
 
index d649922b0da164354d91bd276e16fadf8f44838b..5b0b7831cd8b7fef75d43e806cfa0c30393bde90 100644 (file)
@@ -49,7 +49,7 @@ memcached_return memcached_response(memcached_st *ptr,
   case 'S': /* STORED STATS SERVER_ERROR */
     {
       if (buffer[2] == 'A') /* STORED STATS */
-        return MEMCACHED_SUCCESS;
+        return MEMCACHED_STAT;
       else if (buffer[1] == 'E')
         return MEMCACHED_SERVER_ERROR;
       else if (buffer[1] == 'T')
index 644ca70d41d24f722731cab263a73482f6c7202e..b3a5781213e8f9f05368ed23f2ee085a431e0ee0 100644 (file)
@@ -222,7 +222,7 @@ static memcached_return memcached_stats_fetch(memcached_st *ptr,
                                               unsigned int server_key)
 {
   memcached_return rc;
-  char buffer[HUGE_STRING_LEN];
+  char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
   size_t send_length, sent_length;
 
   rc= memcached_connect(ptr);
@@ -231,10 +231,10 @@ static memcached_return memcached_stats_fetch(memcached_st *ptr,
     return rc;
 
   if (args)
-    send_length= snprintf(buffer, HUGE_STRING_LEN
+    send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE
                           "stats %s\r\n", args);
   else
-    send_length= snprintf(buffer, HUGE_STRING_LEN
+    send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE
                           "stats\r\n");
 
   if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
@@ -245,19 +245,17 @@ static memcached_return memcached_stats_fetch(memcached_st *ptr,
   if (sent_length == -1 || sent_length != send_length)
     return MEMCACHED_WRITE_FAILURE;
 
-  rc= memcached_response(ptr, buffer, HUGE_STRING_LEN, 0);
-
-  if (rc == MEMCACHED_SUCCESS)
+  while (1)
   {
-    char *string_ptr, *end_ptr;
-    char *key, *value;
+    rc= memcached_response(ptr, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, 0);
 
-    string_ptr= buffer;
-    while (1)
+    if (rc == MEMCACHED_STAT)
     {
-      if (memcmp(string_ptr, "STAT ", 5))
-        break;
-      string_ptr+= 5;
+      char *string_ptr, *end_ptr;
+      char *key, *value;
+
+      string_ptr= buffer;
+      string_ptr+= 5; /* Move past STAT */
       for (end_ptr= string_ptr; *end_ptr != ' '; end_ptr++);
       key= string_ptr;
       key[(size_t)(end_ptr-string_ptr)]= 0;
@@ -269,9 +267,14 @@ static memcached_return memcached_stats_fetch(memcached_st *ptr,
       string_ptr= end_ptr + 2;
       set_data(stat, key, value);
     }
+    else
+      break;
   }
 
-  return rc;
+  if (rc == MEMCACHED_END)
+    return MEMCACHED_SUCCESS;
+  else
+    return rc;
 }
 
 memcached_stat_st *memcached_stat(memcached_st *ptr, char *args, memcached_return *error)
index 43c36a488c352a06d2833064b6b5609f5cd354a1..372cea23b1ff1e4cd3a77ee5836eb7729af5f63c 100644 (file)
@@ -52,6 +52,8 @@ char *memcached_strerror(memcached_st *ptr, memcached_return rc)
     return "SERVER DELETE";
   case MEMCACHED_VALUE:
     return "SERVER VALUE";
+  case MEMCACHED_STAT:
+    return "STAT VALUE";
   case MEMCACHED_MAXIMUM_RETURN:
     return "Gibberish returned!";
   default:
index 40aade209435daa74e62e3845d5948e6b3cbf4eb..6b7f0ae52770e05cec8b6b1b0fa7fecde05a6d0d 100644 (file)
@@ -50,7 +50,7 @@ int main(int argc, char *argv[])
 
   stat= memcached_stat(memc, NULL, &rc);
 
-  if (rc != MEMCACHED_SUCCESS && rc == MEMCACHED_SOME_ERRORS)
+  if (rc != MEMCACHED_SUCCESS && rc != MEMCACHED_SOME_ERRORS)
   {
     printf("Failure to communicate with servers (%s)\n",
           memcached_strerror(memc, rc));
index c91716421cd1f071499da738ae423e17d385cb70..a3c5c628e9def0c140d98dfb1093587810773012 100644 (file)
@@ -23,6 +23,7 @@ Error 20 -> NO SERVERS DEFINED
 Error 21 -> SERVER END
 Error 22 -> SERVER DELETE
 Error 23 -> SERVER VALUE
+Error 24 -> STAT VALUE
 Found key pid
 Found key uptime
 Found key time
@@ -125,6 +126,7 @@ Error 20 -> NO SERVERS DEFINED
 Error 21 -> SERVER END
 Error 22 -> SERVER DELETE
 Error 23 -> SERVER VALUE
+Error 24 -> STAT VALUE
 Found key pid
 Found key uptime
 Found key time
@@ -227,6 +229,7 @@ Error 20 -> NO SERVERS DEFINED
 Error 21 -> SERVER END
 Error 22 -> SERVER DELETE
 Error 23 -> SERVER VALUE
+Error 24 -> STAT VALUE
 Found key pid
 Found key uptime
 Found key time
@@ -329,6 +332,7 @@ Error 20 -> NO SERVERS DEFINED
 Error 21 -> SERVER END
 Error 22 -> SERVER DELETE
 Error 23 -> SERVER VALUE
+Error 24 -> STAT VALUE
 Found key pid
 Found key uptime
 Found key time