<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1031,10 +1031,22 @@ static void complete_incr_bin(conn *c) {
                c-&gt;binary_header.request.cas == ITEM_get_cas(it))) {
         /* Weird magic in add_delta forces me to pad here */
         char tmpbuf[INCR_MAX_STORAGE_LEN];
-        char *adrv = add_delta(c, it, c-&gt;cmd == PROTOCOL_BINARY_CMD_INCREMENT,
-                               req-&gt;message.body.delta, tmpbuf);
-        if (strncmp(adrv, &quot;CLIENT_ERROR&quot;, 12) == 0) {
-            write_bin_error(c, PROTOCOL_BINARY_RESPONSE_DELTA_BADVAL, 0);
+        protocol_binary_response_status st = PROTOCOL_BINARY_RESPONSE_SUCCESS;
+
+        switch(add_delta(c, it, c-&gt;cmd == PROTOCOL_BINARY_CMD_INCREMENT,
+                         req-&gt;message.body.delta, tmpbuf)) {
+        case OK:
+            break;
+        case NON_NUMERIC:
+            st = PROTOCOL_BINARY_RESPONSE_DELTA_BADVAL;
+            break;
+        case EOM:
+            st = PROTOCOL_BINARY_RESPONSE_ENOMEM;
+            break;
+        }
+
+        if (st != PROTOCOL_BINARY_RESPONSE_SUCCESS) {
+            write_bin_error(c, st, 0);
         } else {
             rsp-&gt;message.body.value = swap64(strtoull(tmpbuf, NULL, 10));
             c-&gt;cas = ITEM_get_cas(it);
@@ -2516,7 +2528,17 @@ static void process_arithmetic_command(conn *c, token_t *tokens, const size_t nt
         return;
     }
 
-    out_string(c, add_delta(c, it, incr, delta, temp));
+    switch(add_delta(c, it, incr, delta, temp)) {
+    case OK:
+        out_string(c, temp);
+        break;
+    case NON_NUMERIC:
+        out_string(c, &quot;CLIENT_ERROR cannot increment or decrement non-numeric value&quot;);
+        break;
+    case EOM:
+        out_string(c, &quot;SERVER_ERROR out of memory&quot;);
+        break;
+    }
     item_remove(it);         /* release our reference */
 }
 
@@ -2531,7 +2553,8 @@ static void process_arithmetic_command(conn *c, token_t *tokens, const size_t nt
  *
  * returns a response string to send back to the client.
  */
-char *do_add_delta(conn *c, item *it, const bool incr, const int64_t delta, char *buf) {
+enum delta_result_type do_add_delta(conn *c, item *it, const bool incr,
+                                    const int64_t delta, char *buf) {
     char *ptr;
     uint64_t value;
     int res;
@@ -2539,7 +2562,7 @@ char *do_add_delta(conn *c, item *it, const bool incr, const int64_t delta, char
     ptr = ITEM_data(it);
 
     if (!safe_strtoull(ptr, &amp;value)) {
-        return &quot;CLIENT_ERROR cannot increment or decrement non-numeric value&quot;;
+        return NON_NUMERIC;
     }
 
     if (incr) {
@@ -2568,7 +2591,7 @@ char *do_add_delta(conn *c, item *it, const bool incr, const int64_t delta, char
         item *new_it;
         new_it = do_item_alloc(ITEM_key(it), it-&gt;nkey, atoi(ITEM_suffix(it) + 1), it-&gt;exptime, res + 2 );
         if (new_it == 0) {
-            return &quot;SERVER_ERROR out of memory in incr/decr&quot;;
+            return EOM;
         }
         memcpy(ITEM_data(new_it), buf, res);
         memcpy(ITEM_data(new_it) + res, &quot;\r\n&quot;, 2);
@@ -2583,7 +2606,7 @@ char *do_add_delta(conn *c, item *it, const bool incr, const int64_t delta, char
         memset(ITEM_data(it) + res, ' ', it-&gt;nbytes - res - 2);
     }
 
-    return buf;
+    return OK;
 }
 
 static void process_delete_command(conn *c, token_t *tokens, const size_t ntokens) {</diff>
      <filename>memcached.c</filename>
    </modified>
    <modified>
      <diff>@@ -178,6 +178,9 @@ enum store_item_type {
     NOT_STORED=0, STORED, EXISTS, NOT_FOUND
 };
 
+enum delta_result_type {
+    OK, NON_NUMERIC, EOM
+};
 
 /** Time relative to server start. Smaller than time_t on 64-bit systems. */
 typedef unsigned int rel_time_t;
@@ -402,8 +405,8 @@ extern volatile rel_time_t current_time;
  * Functions
  */
 void do_accept_new_conns(const bool do_accept);
-char *do_add_delta(conn *c, item *item, const bool incr, const int64_t delta,
-                   char *buf);
+enum delta_result_type do_add_delta(conn *c, item *item, const bool incr,
+                                    const int64_t delta, char *buf);
 enum store_item_type do_store_item(item *item, int comm, conn* c);
 conn *conn_new(const int sfd, const enum conn_states init_state, const int event_flags, const int read_buffer_size, enum network_transport transport, struct event_base *base);
 extern int daemonize(int nochdir, int noclose);
@@ -429,8 +432,8 @@ int  dispatch_event_add(int thread, conn *c);
 void dispatch_conn_new(int sfd, enum conn_states init_state, int event_flags, int read_buffer_size, enum network_transport transport);
 
 /* Lock wrappers for cache functions that are called from main loop. */
-char *add_delta(conn *c, item *item, const int incr, const int64_t delta,
-                char *buf);
+enum delta_result_type add_delta(conn *c, item *item, const int incr,
+                                 const int64_t delta, char *buf);
 void accept_new_conns(const bool do_accept);
 conn *conn_from_freelist(void);
 bool  conn_add_to_freelist(conn *c);</diff>
      <filename>memcached.h</filename>
    </modified>
    <modified>
      <diff>@@ -400,9 +400,9 @@ void item_update(item *item) {
 /*
  * Does arithmetic on a numeric item value.
  */
-char *add_delta(conn *c, item *item, int incr, const int64_t delta,
-                char *buf) {
-    char *ret;
+enum delta_result_type add_delta(conn *c, item *item, int incr,
+                                 const int64_t delta, char *buf) {
+    enum delta_result_type ret;
 
     pthread_mutex_lock(&amp;cache_lock);
     ret = do_add_delta(c, item, incr, delta, buf);</diff>
      <filename>thread.c</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>cce46e8f092b2c57cdb94a780f67d95b65bdd762</id>
    </parent>
  </parents>
  <author>
    <name>Dustin Sallings</name>
    <email>dustin@spy.net</email>
  </author>
  <url>http://github.com/dustin/memcached/commit/d044acb2ff52147a2e0296519e8b0df1c96f817b</url>
  <id>d044acb2ff52147a2e0296519e8b0df1c96f817b</id>
  <committed-date>2009-06-29T14:18:02-07:00</committed-date>
  <authored-date>2009-06-27T18:04:23-07:00</authored-date>
  <message>add_delta should return a proper status indicator.

Before, it was returning text protocol, requiring special handling in
the binary protocol.</message>
  <tree>88f039d936d412f8bec83c65e945352baf343c4f</tree>
  <committer>
    <name>Trond Norbye</name>
    <email>Trond.Norbye@sun.com</email>
  </committer>
</commit>
