//############################################################################## //############################################################################## BerkeleyDB::range_changelist_t BerkeleyDB::get_changelist() { RANGE_LOG_FUNCTION(); this->init_info(); std::string buf = info_->get_record(record_type::GRAPH_META, "range_changelist"); ChangeList changes; if(!buf.empty()) { changes.ParseFromString(buf); } else { return range_changelist_t(); } range_changelist_t changelist; for (int c_idx = 0; c_idx < changes.change_size(); ++c_idx) { range_change_t c; std::time_t t; for (int i_idx = 0; i_idx < changes.change(c_idx).items_size(); ++i_idx) { auto item = changes.change(c_idx).items(i_idx); c[item.key()] = item.version(); auto ts = changes.change(c_idx).timestamp(); t = ts.seconds(); } changelist.push_back(std::make_tuple(t, c_idx, c)); } return changelist; }
//############################################################################## //############################################################################## uint64_t BerkeleyDB::range_version() const { RANGE_LOG_FUNCTION(); this->init_info(); std::string buf = info_->get_record(record_type::GRAPH_META, "range_changelist"); if(!buf.empty()) { ChangeList changes; changes.ParseFromString(buf); return changes.current_version(); } return 0; }
//############################################################################## //############################################################################## ChangeList BerkeleyDBCXXDb::read_changelist() const { RANGE_LOG_FUNCTION(); std::string buf = this->get_record(record_type::GRAPH_META, "changelist"); ChangeList changes; if(!buf.empty()) { changes.ParseFromString(buf); if(!changes.IsInitialized()) { THROW_STACK(DatabaseVersioningError("Changelist cannot be initialized")); } return changes; } changes.set_current_version(0); changes.mutable_change(); changes.mutable_unknown_fields(); return changes; //THROW_STACK(DatabaseVersioningError("Changelist cannot be read")); }
//############################################################################## //############################################################################## void BerkeleyDB::set_wanted_version(uint64_t version) { RANGE_LOG_FUNCTION(); this->init_info(); std::string buf = info_->get_record(record_type::GRAPH_META, "range_changelist"); ChangeList changes; if(!buf.empty()) { changes.ParseFromString(buf); } for (uint32_t c_idx = changes.change_size() - 1; c_idx >= version; --c_idx) { for (int i_idx = 0; i_idx < changes.change(c_idx).items_size(); ++i_idx) { auto item = changes.change(c_idx).items(i_idx); graph_wanted_version_map_[item.key()] = item.version(); } } }
//############################################################################## //############################################################################## void BerkeleyDB::add_new_range_version() { RANGE_LOG_FUNCTION(); this->init_info(); auto lock = info_->write_lock(record_type::GRAPH_META, "graph_list"); std::string buf = info_->get_record(record_type::GRAPH_META, "range_changelist"); ChangeList changes; if(!buf.empty()) { changes.ParseFromString(buf); } std::unordered_map<std::string, uint64_t> vermap; for (auto &gname : listGraphInstances()) { auto ginst = getGraphInstance(gname); vermap[gname] = ginst->version(); } ChangeList_Change *c = changes.add_change(); for(auto &verinfo : vermap) { auto item = c->add_items(); item->set_key(verinfo.first); item->set_version(verinfo.second); } struct timeval cur_time; gettimeofday(&cur_time, NULL); auto ts = c->mutable_timestamp(); ts->set_seconds(cur_time.tv_sec); ts->set_msec(cur_time.tv_usec / 1000); changes.set_current_version(changes.current_version() + 1); info_->commit_record(std::make_tuple(record_type::GRAPH_META, "range_changelist", 0, changes.SerializeAsString())); }