22#include <glog/logging.h>
27std::unique_ptr<Storage>
NewMemoryDB() {
return std::make_unique<MemoryDB>(); }
37 std::string values =
"[";
38 bool first_iteration =
true;
39 for (
auto kv : kv_map_) {
40 if (!first_iteration) values.append(
",");
41 first_iteration =
false;
42 values.append(kv.second);
49 const std::string& max_key) {
50 std::string values =
"[";
51 bool first_iteration =
true;
52 for (
auto kv : kv_map_) {
53 if (kv.first >= min_key && kv.first <= max_key) {
54 if (!first_iteration) values.append(
",");
55 first_iteration =
false;
56 values.append(kv.second);
64 auto search = kv_map_.find(key);
65 if (search != kv_map_.end())
66 return search->second;
73 const std::string& value,
int version) {
74 auto it = kv_map_with_v_.find(key);
75 if ((it == kv_map_with_v_.end() && version != 0) ||
76 (it != kv_map_with_v_.end() && it->second.back().second != version)) {
77 LOG(ERROR) <<
" value version not match. key:" << key <<
" db version:"
78 << (it == kv_map_with_v_.end() ? 0 : it->second.back().second)
79 <<
" user version:" << version;
82 kv_map_with_v_[key].push_back(std::make_pair(value, version + 1));
87 const std::string& key,
int version) {
88 auto search_it = kv_map_with_v_.find(key);
89 if (search_it != kv_map_with_v_.end() && search_it->second.size()) {
90 auto it = search_it->second.end();
93 if (it->second == version) {
96 if (it->second < version) {
99 }
while (it != search_it->second.begin());
100 it = --search_it->second.end();
101 LOG(ERROR) <<
" key:" << key <<
" no version:" << version
102 <<
" return max:" << it->second;
105 return std::make_pair(
"", 0);
109 std::map<std::string, std::pair<std::string, int>> resp;
111 for (
const auto& it : kv_map_with_v_) {
112 resp.insert(std::make_pair(it.first, it.second.back()));
118 const std::string& min_key,
const std::string& max_key) {
119 LOG(ERROR) <<
"min key:" << min_key <<
" max key:" << max_key;
120 std::map<std::string, std::pair<std::string, int>> resp;
121 for (
const auto& it : kv_map_with_v_) {
122 if (it.first >= min_key && it.first <= max_key) {
123 resp.insert(std::make_pair(it.first, it.second.back()));
130 const std::string& key,
int min_version,
int max_version) {
131 std::vector<std::pair<std::string, int>> resp;
132 auto search_it = kv_map_with_v_.find(key);
133 if (search_it == kv_map_with_v_.end()) {
137 auto it = search_it->second.end();
140 if (it->second < min_version) {
143 if (it->second <= max_version) {
146 }
while (it != search_it->second.begin());
151 const std::string& key,
int top_number) {
152 std::vector<std::pair<std::string, int>> resp;
153 auto search_it = kv_map_with_v_.find(key);
154 if (search_it == kv_map_with_v_.end()) {
158 auto it = search_it->second.end();
162 if (resp.size() >=
static_cast<size_t>(top_number)) {
165 }
while (it != search_it->second.begin());
std::vector< std::pair< std::string, int > > GetTopHistory(const std::string &key, int number) override
std::string GetAllValues() override
std::vector< std::pair< std::string, int > > GetHistory(const std::string &key, int min_version, int max_version) override
std::string GetRange(const std::string &min_key, const std::string &max_key) override
std::string GetValue(const std::string &key)
std::map< std::string, std::pair< std::string, int > > GetAllItems() override
int SetValueWithVersion(const std::string &key, const std::string &value, int version) override
int SetValue(const std::string &key, const std::string &value)
std::pair< std::string, int > GetValueWithVersion(const std::string &key, int version) override
std::map< std::string, std::pair< std::string, int > > GetKeyRange(const std::string &min_key, const std::string &max_key) override
std::unique_ptr< Storage > storage
std::unique_ptr< Storage > NewMemoryDB()