Пример #1
0
int SSDB::zset(const Bytes &name, const Bytes &key, const Bytes &score) const{
	if(name.size() > SSDB_KEY_LEN_MAX || key.size() > SSDB_KEY_LEN_MAX){
		return -1;
	}

	std::string old_score;
	if(this->zget(name, key, &old_score) == -1 || old_score != score){
		leveldb::Status s;
		leveldb::WriteBatch batch;
		std::string k0, k1, k2, v;

		// delete zset key
		k1 = encode_z_key(name, key, old_score);
		batch.Delete(k1);

		// update score
		k0 = encode_zs_key(name, key);
		v.assign(score.data(), score.size());
		batch.Put(k0, v);

		// add zset key
		k2 = encode_z_key(name, key, score);
		batch.Put(k2, "");

		s = db->Write(write_options, &batch);
		if(!s.ok()){
			log_error("zset error: %s", s.ToString().c_str());
			return -1;
		}
		return 1;
	}
	return 0;
}
Пример #2
0
int SSDB::zdel(const Bytes &name, const Bytes &key) const{
	std::string old_score;
	if(this->zget(name, key, &old_score) == -1){
		return 0;
	}

	leveldb::Status s;
	leveldb::WriteBatch batch;
	std::string k0, k1;

	// delete score
	k0 = encode_zs_key(name, key);
	batch.Delete(k0);

	// delete zset key
	k1 = encode_z_key(name, key, old_score);
	batch.Delete(k1);

	s = db->Write(write_options, &batch);
	if(!s.ok()){
		log_error("zdel error: %s", s.ToString().c_str());
		return -1;
	}
	return 1;
}
Пример #3
0
int SSDB::zdel(const Bytes &name, const Bytes &key) const{
	std::string old_score;
	int found = this->zget(name, key, &old_score);
	if(found != 1){
		return 0;
	}

	leveldb::Status s;
	leveldb::WriteBatch batch;
	std::string k0, k1;

	// update zsize
	int64_t size = this->zsize(name);
	if(size == -1){
		return -1;
	}
	size --;
	std::string size_key = encode_zsize_key(name);
	batch.Put(size_key, leveldb::Slice((char *)&size, sizeof(int64_t)));

	// delete score
	k0 = encode_zs_key(name, key);
	batch.Delete(k0);

	// delete zset key
	k1 = encode_z_key(name, key, old_score);
	batch.Delete(k1);

	s = db->Write(write_options, &batch);
	if(!s.ok()){
		log_error("zdel error: %s", s.ToString().c_str());
		return -1;
	}
	return 1;
}
Пример #4
0
ZIterator* SSDB::zscan(const Bytes &name, const Bytes &key,
		const Bytes &score_start, const Bytes &score_end, int limit) const{
	std::string key_start, key_end;

	if(score_start.empty()){
		key_start = encode_z_key(name, key, SSDB_SCORE_MIN);
	}else{
		key_start = encode_z_key(name, key, score_start);
	}
	if(score_end.empty()){
		key_end = encode_z_key(name, "", SSDB_SCORE_MAX);
	}else{
		key_end = encode_z_key(name, "", score_end);
	}

	//dump(key_start.data(), key_start.size(), "zscan.start");
	//dump(key_end.data(), key_end.size(), "zscan.end");

	return new ZIterator(this->iterator(key_start, key_end, limit), name);
}