Merge
[awesomized/libmemcached] / example / interface_v1.c
index a1a1a22aa558eb8820df16b90319919b7b137823..2fcc0790da7a260910c3ddb0036d5cf0ed4479d8 100644 (file)
@@ -8,6 +8,7 @@
  * you will not receive the next command before a answer to the previous
  * command is being sent.
  */
+#include "config.h"
 #include <assert.h>
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -47,6 +48,7 @@ static protocol_binary_response_status add_handler(const void *cookie,
     {
       put_item(item);
       *cas= item->cas;
+      release_item(item);
     }
   }
   else
@@ -63,7 +65,8 @@ static protocol_binary_response_status append_handler(const void *cookie,
                                                       const void* val,
                                                       uint32_t vallen,
                                                       uint64_t cas,
-                                                      uint64_t *result_cas) {
+                                                      uint64_t *result_cas)
+{
   (void)cookie;
   protocol_binary_response_status rval= PROTOCOL_BINARY_RESPONSE_SUCCESS;
 
@@ -81,15 +84,18 @@ static protocol_binary_response_status append_handler(const void *cookie,
   else if ((nitem= create_item(key, keylen, NULL, item->size + vallen,
                                item->flags, item->exp)) == NULL)
   {
+    release_item(item);
     rval= PROTOCOL_BINARY_RESPONSE_ENOMEM;
   }
   else
   {
     memcpy(nitem->data, item->data, item->size);
     memcpy(((char*)(nitem->data)) + item->size, val, vallen);
+    release_item(item);
     delete_item(key, keylen);
     put_item(nitem);
     *result_cas= nitem->cas;
+    release_item(nitem);
   }
 
   return rval;
@@ -116,6 +122,7 @@ static protocol_binary_response_status decrement_handler(const void *cookie,
       val= *(uint64_t*)item->data - delta;
 
     expiration= (uint32_t)item->exp;
+    release_item(item);
     delete_item(key, keylen);
   }
 
@@ -130,6 +137,7 @@ static protocol_binary_response_status decrement_handler(const void *cookie,
     put_item(item);
     *result= val;
     *result_cas= item->cas;
+    release_item(item);
   }
 
   return rval;
@@ -145,9 +153,14 @@ static protocol_binary_response_status delete_handler(const void *cookie,
   if (cas != 0)
   {
     struct item *item= get_item(key, keylen);
-    if (item != NULL && item->cas != cas)
+    if (item != NULL)
     {
-      return PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS;
+      if (item->cas != cas)
+      {
+        release_item(item);
+        return PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS;
+      }
+      release_item(item);
     }
   }
 
@@ -179,9 +192,12 @@ static protocol_binary_response_status get_handler(const void *cookie,
     return PROTOCOL_BINARY_RESPONSE_KEY_ENOENT;
   }
 
-  return response_handler(cookie, key, (uint16_t)keylen,
+  protocol_binary_response_status rc;
+  rc= response_handler(cookie, key, (uint16_t)keylen,
                           item->data, (uint32_t)item->size, item->flags,
                           item->cas);
+  release_item(item);
+  return rc;
 }
 
 static protocol_binary_response_status increment_handler(const void *cookie,
@@ -201,6 +217,7 @@ static protocol_binary_response_status increment_handler(const void *cookie,
   {
     val= (*(uint64_t*)item->data) + delta;
     expiration= (uint32_t)item->exp;
+    release_item(item);
     delete_item(key, keylen);
   }
 
@@ -217,6 +234,7 @@ static protocol_binary_response_status increment_handler(const void *cookie,
     put_item(item);
     *result= val;
     *result_cas= item->cas;
+    release_item(item);
   }
 
   return rval;
@@ -238,7 +256,8 @@ static protocol_binary_response_status prepend_handler(const void *cookie,
   protocol_binary_response_status rval= PROTOCOL_BINARY_RESPONSE_SUCCESS;
 
   struct item *item= get_item(key, keylen);
-  struct item *nitem;
+  struct item *nitem= NULL;
+
   if (item == NULL)
   {
     rval= PROTOCOL_BINARY_RESPONSE_KEY_ENOENT;
@@ -256,11 +275,19 @@ static protocol_binary_response_status prepend_handler(const void *cookie,
   {
     memcpy(nitem->data, val, vallen);
     memcpy(((char*)(nitem->data)) + vallen, item->data, item->size);
+    release_item(item);
+    item= NULL;
     delete_item(key, keylen);
     put_item(nitem);
     *result_cas= nitem->cas;
   }
 
+  if (item)
+    release_item(item);
+
+  if (nitem)
+    release_item(nitem);
+
   return rval;
 }
 
@@ -288,6 +315,7 @@ static protocol_binary_response_status replace_handler(const void *cookie,
   }
   else if (cas == 0 || cas == item->cas)
   {
+    release_item(item);
     delete_item(key, keylen);
     item= create_item(key, keylen, data, datalen, flags, (time_t)exptime);
     if (item == 0)
@@ -298,11 +326,13 @@ static protocol_binary_response_status replace_handler(const void *cookie,
     {
       put_item(item);
       *result_cas= item->cas;
+      release_item(item);
     }
   }
   else
   {
     rval= PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS;
+    release_item(item);
   }
 
   return rval;
@@ -326,6 +356,7 @@ static protocol_binary_response_status set_handler(const void *cookie,
     if (item != NULL && cas != item->cas)
     {
       /* Invalid CAS value */
+      release_item(item);
       return PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS;
     }
   }
@@ -340,6 +371,7 @@ static protocol_binary_response_status set_handler(const void *cookie,
   {
     put_item(item);
     *result_cas= item->cas;
+    release_item(item);
   }
 
   return rval;
@@ -361,8 +393,8 @@ static protocol_binary_response_status version_handler(const void *cookie,
   return response_handler(cookie, version, (uint32_t)strlen(version));
 }
 
-struct memcached_binary_protocol_callback_st interface_v1_impl= {
-  .interface_version= 1,
+memcached_binary_protocol_callback_st interface_v1_impl= {
+  .interface_version= MEMCACHED_PROTOCOL_HANDLER_V1,
   .interface.v1= {
     .add= add_handler,
     .append= append_handler,