Esempio n. 1
0
static protocol_binary_response_status delete_handler(const void *cookie,
                                                      const void *key,
                                                      uint16_t keylen,
                                                      uint64_t cas) {
  (void)cookie;
  protocol_binary_response_status rval= PROTOCOL_BINARY_RESPONSE_SUCCESS;

  if (cas != 0)
  {
    struct item *item= get_item(key, keylen);
    if (item != NULL)
    {
      if (item->cas != cas)
      {
        release_item(item);
        return PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS;
      }
      release_item(item);
    }
  }

  if (!delete_item(key, keylen))
  {
    rval= PROTOCOL_BINARY_RESPONSE_KEY_ENOENT;
  }

  return rval;
}
Esempio n. 2
0
static protocol_binary_response_status add_handler(const void *cookie,
                                                   const void *key,
                                                   uint16_t keylen,
                                                   const void *data,
                                                   uint32_t datalen,
                                                   uint32_t flags,
                                                   uint32_t exptime,
                                                   uint64_t *cas)
{
  (void)cookie;
  protocol_binary_response_status rval= PROTOCOL_BINARY_RESPONSE_SUCCESS;
  struct item* item= get_item(key, keylen);
  if (item == NULL)
  {
    item= create_item(key, keylen, data, datalen, flags, (time_t)exptime);
    if (item == 0)
    {
      rval= PROTOCOL_BINARY_RESPONSE_ENOMEM;
    }
    else
    {
      put_item(item);
      *cas= item->cas;
      release_item(item);
    }
  }
  else
  {
    rval= PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS;
  }

  return rval;
}
Esempio n. 3
0
static protocol_binary_response_status prepend_handler(const void *cookie,
                                                       const void *key,
                                                       uint16_t keylen,
                                                       const void* val,
                                                       uint32_t vallen,
                                                       uint64_t cas,
                                                       uint64_t *result_cas) {
  (void)cookie;
  protocol_binary_response_status rval= PROTOCOL_BINARY_RESPONSE_SUCCESS;

  struct item *item= get_item(key, keylen);
  struct item *nitem= NULL;

  if (item == NULL)
  {
    rval= PROTOCOL_BINARY_RESPONSE_KEY_ENOENT;
  }
  else if (cas != 0 && cas != item->cas)
  {
    rval= PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS;
  }
  else if ((nitem= create_item(key, keylen, NULL, item->size + vallen,
                                 item->flags, item->exp)) == NULL)
  {
    rval= PROTOCOL_BINARY_RESPONSE_ENOMEM;
  }
  else
  {
    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;
}
Esempio n. 4
0
static protocol_binary_response_status decrement_handler(const void *cookie,
                                                         const void *key,
                                                         uint16_t keylen,
                                                         uint64_t delta,
                                                         uint64_t initial,
                                                         uint32_t expiration,
                                                         uint64_t *result,
                                                         uint64_t *result_cas) {
    protocol_binary_response_status rval= PROTOCOL_BINARY_RESPONSE_SUCCESS;
    uint64_t val= initial;
    item_t *item;

    (void)cookie;
    mutex_lock(&storage_lock);

    item = get_item(key, keylen);

    if (item != NULL) {
        if (delta > *(uint64_t*)item->data)
            val= 0;
        else
            val= *(uint64_t*)item->data - delta;

        expiration= (uint32_t)item->exp;
        release_item(item);
        delete_item(key, keylen);
    }

    item= create_item(key, keylen, NULL, sizeof(initial), 0, (time_t)expiration);
    if (item == 0) {
        rval= PROTOCOL_BINARY_RESPONSE_ENOMEM;
    } else {
        memcpy(item->data, &val, sizeof(val));
        put_item(item);
        *result= val;
        *result_cas= item->cas;
        release_item(item);
    }

    mutex_unlock(&storage_lock);
    return rval;
}
Esempio n. 5
0
static protocol_binary_response_status increment_handler(const void *cookie,
                                                         const void *key,
                                                         uint16_t keylen,
                                                         uint64_t delta,
                                                         uint64_t initial,
                                                         uint32_t expiration,
                                                         uint64_t *result,
                                                         uint64_t *result_cas) {
    protocol_binary_response_status rval= PROTOCOL_BINARY_RESPONSE_SUCCESS;
    uint64_t val= initial;
    item_t *item;
    
    (void)cookie;
    mutex_lock(&storage_lock);

    item = get_item(key, keylen);

    if (item != NULL) {
        val= (*(uint64_t*)item->data) + delta;
        expiration= (uint32_t)item->exp;
        release_item(item);
        delete_item(key, keylen);
    }

    item= create_item(key, keylen, NULL, sizeof(initial), 0, (time_t)expiration);
    if (item == NULL) {
        rval= PROTOCOL_BINARY_RESPONSE_ENOMEM;
    } else {
        char buffer[1024] = {0}; // FIXME: does this need to be so big ~ajc
        memcpy(buffer, key, keylen);
        memcpy(item->data, &val, sizeof(val));
        put_item(item);
        *result= val;
        *result_cas= item->cas;
        release_item(item);
    }

    mutex_unlock(&storage_lock);

    return rval;
}
Esempio n. 6
0
static protocol_binary_response_status set_handler(const void *cookie,
                                                   const void *key,
                                                   uint16_t keylen,
                                                   const void* data,
                                                   uint32_t datalen,
                                                   uint32_t flags,
                                                   uint32_t exptime,
                                                   uint64_t cas,
                                                   uint64_t *result_cas) {
  (void)cookie;
  protocol_binary_response_status rval= PROTOCOL_BINARY_RESPONSE_SUCCESS;

  if (cas != 0)
  {
    struct item* item= get_item(key, keylen);
    if (item != NULL && cas != item->cas)
    {
      /* Invalid CAS value */
      release_item(item);
      return PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS;
    }
  }

  delete_item(key, keylen);
  struct item* item= create_item(key, keylen, data, datalen, flags, (time_t)exptime);
  if (item == 0)
  {
    rval= PROTOCOL_BINARY_RESPONSE_ENOMEM;
  }
  else
  {
    put_item(item);
    *result_cas= item->cas;
    release_item(item);
  }

  return rval;
}
Esempio n. 7
0
static protocol_binary_response_status replace_handler(const void *cookie,
                                                       const void *key,
                                                       uint16_t keylen,
                                                       const void* data,
                                                       uint32_t datalen,
                                                       uint32_t flags,
                                                       uint32_t exptime,
                                                       uint64_t cas,
                                                       uint64_t *result_cas) {
    protocol_binary_response_status rval= PROTOCOL_BINARY_RESPONSE_SUCCESS;
    item_t* item; 

    mutex_lock(&storage_lock);
    (void)cookie;

    item= get_item(key, keylen);

    if (item == NULL) {
        rval= PROTOCOL_BINARY_RESPONSE_KEY_ENOENT;
    } 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) {
            rval= PROTOCOL_BINARY_RESPONSE_ENOMEM;
        } else {
            put_item(item);
            *result_cas= item->cas;
            release_item(item);
        }
    } else {
        rval= PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS;
        release_item(item);
    }

    mutex_unlock(&storage_lock);
    return rval;
}
Esempio n. 8
0
static protocol_binary_response_status append_handler(const void *cookie,
                                                      const void *key,
                                                      uint16_t keylen,
                                                      const void* val,
                                                      uint32_t vallen,
                                                      uint64_t cas,
                                                      uint64_t *result_cas)
{
    protocol_binary_response_status rval= PROTOCOL_BINARY_RESPONSE_SUCCESS;
    item_t *item, *nitem;

    mutex_lock(&storage_lock);
    (void)cookie;

    item= get_item(key, keylen);

    if (item == NULL) {
        rval= PROTOCOL_BINARY_RESPONSE_KEY_ENOENT;
    } else if (cas != 0 && cas != item->cas) {
        rval= PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS;
    } 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);
    }

    mutex_unlock(&storage_lock);
    return rval;
}
Esempio n. 9
0
static protocol_binary_response_status get_handler(const void *cookie,
                                                   const void *key,
                                                   uint16_t keylen,
                                                   memcached_binary_protocol_get_response_handler response_handler) {
  struct item *item= get_item(key, keylen);

  if (item == NULL)
  {
    return PROTOCOL_BINARY_RESPONSE_KEY_ENOENT;
  }

  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;
}