static int64_t incr_qsize(SSDBImpl *ssdb, const Bytes &name, int64_t incr){ int64_t size = ssdb->qsize(name); if(size == -1){ return -1; } size += incr; if(size <= 0){ ssdb->binlogs->Delete(encode_qsize_key(name)); qdel_one(ssdb, name, QFRONT_SEQ); qdel_one(ssdb, name, QBACK_SEQ); }else{ ssdb->binlogs->Put(encode_qsize_key(name), leveldb::Slice((char *)&size, sizeof(size))); } return size; }
int SSDBImpl::qlist(const Bytes &name_s, const Bytes &name_e, uint64_t limit, std::vector<std::string> *list){ std::string start; std::string end; start = encode_qsize_key(name_s); if(!name_e.empty()){ end = encode_qsize_key(name_e); } Iterator *it = this->iterator(start, end, limit); get_qnames(it, list); delete it; return 0; }
int SSDB::qfix(const Bytes &name){ Transaction trans(binlogs); std::string key_s = encode_qitem_key(name, QITEM_MIN_SEQ - 1); std::string key_e = encode_qitem_key(name, QITEM_MAX_SEQ); bool error = false; uint64_t seq_min = 0; uint64_t seq_max = 0; uint64_t count = 0; Iterator *it = this->iterator(key_s, key_e, QITEM_MAX_SEQ); while(it->next()){ //dump(it->key().data(), it->key().size()); if(seq_min == 0){ if(decode_qitem_key(it->key(), NULL, &seq_min) == -1){ // or just delete it? error = true; break; } } if(decode_qitem_key(it->key(), NULL, &seq_max) == -1){ error = true; break; } count ++; } delete it; if(error){ return -1; } if(count == 0){ this->binlogs->Delete(encode_qsize_key(name)); qdel_one(this, name, QFRONT_SEQ); qdel_one(this, name, QBACK_SEQ); }else{ this->binlogs->Put(encode_qsize_key(name), leveldb::Slice((char *)&count, sizeof(count))); qset_one(this, name, QFRONT_SEQ, Bytes(&seq_min, sizeof(seq_min))); qset_one(this, name, QBACK_SEQ, Bytes(&seq_max, sizeof(seq_max))); } leveldb::Status s = binlogs->commit(); if(!s.ok()){ log_error("Write error!"); return -1; } return 0; }
int SSDB::qlist(const Bytes &name_s, const Bytes &name_e, uint64_t limit, std::vector<std::string> *list){ std::string start; std::string end; start = encode_qsize_key(name_s); if(!name_e.empty()){ end = encode_qsize_key(name_e); } Iterator *it = this->iterator(start, end, limit); while(it->next()){ Bytes ks = it->key(); //dump(ks.data(), ks.size()); if(ks.data()[0] != DataType::QSIZE){ break; } std::string n; if(decode_qsize_key(ks, &n) == -1){ continue; } list->push_back(n); } delete it; return 0; }
int64_t SSDB::qsize(const Bytes &name){ std::string key = encode_qsize_key(name); std::string val; leveldb::Status s; s = db->Get(leveldb::ReadOptions(), key, &val); if(s.IsNotFound()){ return 0; }else if(!s.ok()){ log_error("Get() error!"); return -1; }else{ if(val.size() != sizeof(uint64_t)){ return -1; } return *(int64_t *)val.data(); } }
int SSDBImpl::key_range(std::vector<std::string> *keys){ int ret = 0; std::string kstart, kend; std::string hstart, hend; std::string zstart, zend; std::string qstart, qend; Iterator *it; it = this->iterator(encode_kv_key(""), "", 1); if(it->next()){ Bytes ks = it->key(); if(ks.data()[0] == DataType::KV){ std::string n; if(decode_kv_key(ks, &n) == -1){ ret = -1; }else{ kstart = n; } } } delete it; it = this->rev_iterator(encode_kv_key("\xff"), "", 1); if(it->next()){ Bytes ks = it->key(); if(ks.data()[0] == DataType::KV){ std::string n; if(decode_kv_key(ks, &n) == -1){ ret = -1; }else{ kend = n; } } } delete it; it = this->iterator(encode_hsize_key(""), "", 1); if(it->next()){ Bytes ks = it->key(); if(ks.data()[0] == DataType::HSIZE){ std::string n; if(decode_hsize_key(ks, &n) == -1){ ret = -1; }else{ hstart = n; } } } delete it; it = this->rev_iterator(encode_hsize_key("\xff"), "", 1); if(it->next()){ Bytes ks = it->key(); if(ks.data()[0] == DataType::HSIZE){ std::string n; if(decode_hsize_key(ks, &n) == -1){ ret = -1; }else{ hend = n; } } } delete it; it = this->iterator(encode_zsize_key(""), "", 1); if(it->next()){ Bytes ks = it->key(); if(ks.data()[0] == DataType::ZSIZE){ std::string n; if(decode_hsize_key(ks, &n) == -1){ ret = -1; }else{ zstart = n; } } } delete it; it = this->rev_iterator(encode_zsize_key("\xff"), "", 1); if(it->next()){ Bytes ks = it->key(); if(ks.data()[0] == DataType::ZSIZE){ std::string n; if(decode_hsize_key(ks, &n) == -1){ ret = -1; }else{ zend = n; } } } delete it; it = this->iterator(encode_qsize_key(""), "", 1); if(it->next()){ Bytes ks = it->key(); if(ks.data()[0] == DataType::QSIZE){ std::string n; if(decode_qsize_key(ks, &n) == -1){ ret = -1; }else{ qstart = n; } } } delete it; it = this->rev_iterator(encode_qsize_key("\xff"), "", 1); if(it->next()){ Bytes ks = it->key(); if(ks.data()[0] == DataType::QSIZE){ std::string n; if(decode_qsize_key(ks, &n) == -1){ ret = -1; }else{ qend = n; } } } delete it; keys->push_back(kstart); keys->push_back(kend); keys->push_back(hstart); keys->push_back(hend); keys->push_back(zstart); keys->push_back(zend); keys->push_back(qstart); keys->push_back(qend); return ret; }