X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=example%2Finterface_v1.c;h=d2b20712664ec8321b5b78be51fe38ef28e7e9a5;hb=a18c65b0ee1a4721a4f1298f52f8b3446cf7c600;hp=a1a1a22aa558eb8820df16b90319919b7b137823;hpb=bffba75d25150a0c08f37c759bad82ee90cf00f1;p=m6w6%2Flibmemcached diff --git a/example/interface_v1.c b/example/interface_v1.c index a1a1a22a..d2b20712 100644 --- a/example/interface_v1.c +++ b/example/interface_v1.c @@ -8,11 +8,9 @@ * you will not receive the next command before a answer to the previous * command is being sent. */ +#include "config.h" #include #include -#include -#include -#include #include #include #include @@ -20,8 +18,8 @@ #include #include -#include -#include +#include +#include #include "storage.h" static protocol_binary_response_status add_handler(const void *cookie, @@ -47,6 +45,7 @@ static protocol_binary_response_status add_handler(const void *cookie, { put_item(item); *cas= item->cas; + release_item(item); } } else @@ -63,7 +62,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 +81,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 +119,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 +134,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 +150,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 +189,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 +214,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 +231,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 +253,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 +272,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 +312,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 +323,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 +353,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 +368,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 +390,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,