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; }
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; }
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; }
int SSDB::zget(const Bytes &name, const Bytes &key, std::string *score) const{ std::string buf = encode_zs_key(name, key); leveldb::Status s = db->Get(read_options, buf, score); if(s.IsNotFound()){ return 0; } if(!s.ok()){ log_error("zget error: %s", s.ToString().c_str()); return -1; } return 1; }