///値の加算 ///@note Available since 2.0.0. bool server_type::api_hincrby(client_type * client) { auto current = client->get_time(); auto & key = *client->get_keys()[0]; auto & field = *client->get_fields()[0]; auto & increment = client->get_argument(3); bool is_valid = true; int64_t intval = atoi64(increment, is_valid); if (!is_valid) { throw std::runtime_error("ERR increment is not valid integer"); } auto db = writable_db(client); std::shared_ptr<type_hash> hash = db->get_hash(key, current); std::string oldval = "0"; if (hash) { auto r = hash->hget(field); if (r.second) { oldval = r.first; } } int64_t newval = incrby(oldval, intval); std::string newstr = format("%"PRId64, newval); if (!hash) { hash.reset(new type_hash(current)); hash->hset(field, newstr); db->replace(key, hash); } else { hash->hset(field, newstr); hash->update(current); } client->response_integer(newval); return true; }
static int zunionstore_sum(rlite *db, long keys_size, unsigned char **keys, long *keys_len, double *weights) { rl_skiplist_iterator *iterator = NULL; rl_skiplist *skiplist; double score; unsigned char *member; long memberlen; int retval; long i; for (i = 1; i < keys_size; i++) { retval = rl_zset_get_objects(db, keys[i], keys_len[i], NULL, NULL, NULL, &skiplist, NULL, 0, 0); if (retval == RL_NOT_FOUND) { continue; } if (retval != RL_OK) { goto cleanup; } RL_CALL(rl_skiplist_iterator_create, RL_OK, db, &iterator, skiplist, 0, 1, 0); while ((retval = rl_zset_iterator_next(iterator, &score, &member, &memberlen)) == RL_OK) { if (weights) { score *= weights[i - 1]; } if (isnan(score)) { score = 0.0; } retval = incrby(db, keys[0], keys_len[0], score, member, memberlen, NULL, 1); rl_free(member); if (retval != RL_OK) { goto cleanup; } } iterator = NULL; if (retval != RL_END) { goto cleanup; } } retval = RL_OK; cleanup: if (iterator) { rl_zset_iterator_destroy(iterator); } return retval; }
int rl_zincrby(rlite *db, const unsigned char *key, long keylen, double score, unsigned char *member, long memberlen, double *newscore) { return incrby(db, key, keylen, score, member, memberlen, newscore, 0); }