/* * Does arithmetic on a numeric item value. */ 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(&cache_lock); ret = do_add_delta(c, item, incr, delta, buf); pthread_mutex_unlock(&cache_lock); return ret; }
/* * Does arithmetic on a numeric item value. */ enum delta_result_type add_delta(conn *c, const char *key, const size_t nkey, int incr, const int64_t delta, char *buf, uint64_t *cas) { enum delta_result_type ret; pthread_mutex_lock(&cache_lock); ret = do_add_delta(c, key, nkey, incr, delta, buf, cas); pthread_mutex_unlock(&cache_lock); return ret; }
/* * Does arithmetic on a numeric item value. */ enum delta_result_type add_delta(conn *c, const char *key, const size_t nkey, int incr, const int64_t delta, char *buf, uint64_t *cas) { enum delta_result_type ret; uint32_t hv; hv = hash(key, nkey); item_lock(hv); ret = do_add_delta(c, key, nkey, incr, delta, buf, cas, hv); item_unlock(hv); return ret; }
static ENGINE_ERROR_CODE do_arithmetic(struct default_engine *engine, const void* cookie, const hash_key* key, const bool increment, const bool create, const uint64_t delta, const uint64_t initial, const rel_time_t exptime, item **result_item, uint8_t datatype, uint64_t *result) { hash_item *item = do_item_get(engine, key); ENGINE_ERROR_CODE ret; if (item == NULL) { if (!create) { return ENGINE_KEY_ENOENT; } else { char buffer[128]; int len = snprintf(buffer, sizeof(buffer), "%"PRIu64, (uint64_t)initial); if (len < 0 || len >= sizeof(buffer)) { return ENGINE_ENOMEM; } item = do_item_alloc(engine, key, 0, exptime, len, cookie, datatype); if (item == NULL) { return ENGINE_ENOMEM; } memcpy((void*)item_get_data(item), buffer, len); if ((ret = do_store_item(engine, item, OPERATION_ADD, cookie, (hash_item**)result_item)) == ENGINE_SUCCESS) { *result = initial; } else { do_item_release(engine, item); } } } else { ret = do_add_delta(engine, item, increment, delta, result_item, result, cookie); } return ret; }