Exemplo n.º 1
0
	///値の加算
	///@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;
	}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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);
}