int Slave::proc_sync(const Binlog &log, const std::vector<Bytes> &req){ switch(log.cmd()){ case BinlogCommand::KSET: { if(req.size() != 2){ break; } std::string key; if(decode_kv_key(log.key(), &key) == -1){ break; } log_trace("set %s", hexmem(key.data(), key.size()).c_str()); if(ssdb->set(key, req[1], log_type) == -1){ return -1; } } break; case BinlogCommand::KDEL: { std::string key; if(decode_kv_key(log.key(), &key) == -1){ break; } log_trace("del %s", hexmem(key.data(), key.size()).c_str()); if(ssdb->del(key, log_type) == -1){ return -1; } } break; case BinlogCommand::HSET: { if(req.size() != 2){ break; } std::string name, key; if(decode_hash_key(log.key(), &name, &key) == -1){ break; } log_trace("hset %s %s", hexmem(name.data(), name.size()).c_str(), hexmem(key.data(), key.size()).c_str()); if(ssdb->hset(name, key, req[1], log_type) == -1){ return -1; } } break; case BinlogCommand::HDEL: { std::string name, key; if(decode_hash_key(log.key(), &name, &key) == -1){ break; } log_trace("hdel %s %s", hexmem(name.data(), name.size()).c_str(), hexmem(key.data(), key.size()).c_str()); if(ssdb->hdel(name, key, log_type) == -1){ return -1; } } break; case BinlogCommand::ZSET: { if(req.size() != 2){ break; } std::string name, key; if(decode_zset_key(log.key(), &name, &key) == -1){ break; } log_trace("zset %s %s", hexmem(name.data(), name.size()).c_str(), hexmem(key.data(), key.size()).c_str()); if(ssdb->zset(name, key, req[1], log_type) == -1){ return -1; } } break; case BinlogCommand::ZDEL: { std::string name, key; if(decode_zset_key(log.key(), &name, &key) == -1){ break; } log_trace("zdel %s %s", hexmem(name.data(), name.size()).c_str(), hexmem(key.data(), key.size()).c_str()); if(ssdb->zdel(name, key, log_type) == -1){ return -1; } } break; case BinlogCommand::QSET: case BinlogCommand::QPUSH_BACK: case BinlogCommand::QPUSH_FRONT: { if(req.size() != 2){ break; } std::string name; uint64_t seq; if(decode_qitem_key(log.key(), &name, &seq) == -1){ break; } if(seq < QITEM_MIN_SEQ || seq > QITEM_MAX_SEQ){ break; } int ret; if(log.cmd() == BinlogCommand::QSET){ log_trace("qset %s %" PRIu64 "", hexmem(name.data(), name.size()).c_str(), seq); ret = ssdb->qset_by_seq(name, seq, req[1], log_type); }else if(log.cmd() == BinlogCommand::QPUSH_BACK){ log_trace("qpush_back %s", hexmem(name.data(), name.size()).c_str()); ret = ssdb->qpush_back(name, req[1], log_type); }else{ log_trace("qpush_front %s", hexmem(name.data(), name.size()).c_str()); ret = ssdb->qpush_front(name, req[1], log_type); } if(ret == -1){ return -1; } } break; case BinlogCommand::QPOP_BACK: case BinlogCommand::QPOP_FRONT: { int ret; const Bytes name = log.key(); std::string tmp; if(log.cmd() == BinlogCommand::QPOP_BACK){ log_trace("qpop_back %s", hexmem(name.data(), name.size()).c_str()); ret = ssdb->qpop_back(name, &tmp, log_type); }else{ log_trace("qpop_front %s", hexmem(name.data(), name.size()).c_str()); ret = ssdb->qpop_front(name, &tmp, log_type); } if(ret == -1){ return -1; } } break; default: log_error("unknown binlog, type=%d, cmd=%d", log.type(), log.cmd()); break; } this->last_seq = log.seq(); if(log.type() == BinlogType::COPY){ this->last_key = log.key().String(); } this->save_status(); return 0; }
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; }
int Slave::proc_sync(const Binlog &log, const std::vector<Bytes> &req){ switch(log.cmd()){ case BinlogCommand::KSET: { if(req.size() != 2){ break; } std::string key; if(decode_kv_key(log.key(), &key) == -1){ break; } log_trace("set %s", hexmem(key.data(), key.size()).c_str()); if(ssdb->set(key, req[1], log_type) == -1){ return -1; } } break; case BinlogCommand::KDEL: { std::string key; if(decode_kv_key(log.key(), &key) == -1){ break; } log_trace("del %s", hexmem(key.data(), key.size()).c_str()); if(ssdb->del(key, log_type) == -1){ return -1; } } break; case BinlogCommand::HSET: { if(req.size() != 2){ break; } std::string name, key; if(decode_hash_key(log.key(), &name, &key) == -1){ break; } log_trace("hset %s %s", hexmem(name.data(), name.size()).c_str(), hexmem(key.data(), key.size()).c_str()); if(ssdb->hset(name, key, req[1], log_type) == -1){ return -1; } } break; case BinlogCommand::HDEL: { std::string name, key; if(decode_hash_key(log.key(), &name, &key) == -1){ break; } log_trace("hdel %s %s", hexmem(name.data(), name.size()).c_str(), hexmem(key.data(), key.size()).c_str()); if(ssdb->hdel(name, key, log_type) == -1){ return -1; } } break; case BinlogCommand::ZSET: { if(req.size() != 2){ break; } std::string name, key; if(decode_zset_key(log.key(), &name, &key) == -1){ break; } log_trace("zset %s %s", hexmem(name.data(), name.size()).c_str(), hexmem(key.data(), key.size()).c_str()); if(ssdb->zset(name, key, req[1], log_type) == -1){ return -1; } } break; case BinlogCommand::ZDEL: { std::string name, key; if(decode_zset_key(log.key(), &name, &key) == -1){ break; } log_trace("zdel %s %s", hexmem(name.data(), name.size()).c_str(), hexmem(key.data(), key.size()).c_str()); if(ssdb->zdel(name, key, log_type) == -1){ return -1; } } break; default: log_error("unknown binlog, type=%d, cmd=%d", log.type(), log.cmd()); break; } this->last_seq = log.seq(); if(log.type() == BinlogType::COPY){ this->last_key = log.key().String(); } this->save_status(); return 0; }