1
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
3
#include "LevelDBStore.h"
9
#include "leveldb/include/leveldb/db.h"
10
#include "leveldb/include/leveldb/write_batch.h"
11
#include "leveldb/include/leveldb/slice.h"
15
int LevelDBStore::init(ostream &out)
17
leveldb::Options options;
18
options.create_if_missing = true;
20
leveldb::Status status = leveldb::DB::Open(options, path, &_db);
23
out << status.ToString() << std::endl;
29
void LevelDBStore::LevelDBTransactionImpl::set(
31
const std::map<string, bufferlist> &to_set)
33
for (std::map<string, bufferlist>::const_iterator i = to_set.begin();
36
buffers.push_back(i->second);
37
buffers.rbegin()->rebuild();
38
bufferlist &bl = *(buffers.rbegin());
39
string key = combine_strings(prefix, i->first);
41
bat.Delete(leveldb::Slice(*(keys.rbegin())));
42
bat.Put(leveldb::Slice(*(keys.rbegin())),
43
leveldb::Slice(bl.c_str(), bl.length()));
46
void LevelDBStore::LevelDBTransactionImpl::rmkeys(const string &prefix,
47
const std::set<string> &to_rm)
49
for (std::set<string>::const_iterator i = to_rm.begin();
52
string key = combine_strings(prefix, *i);
54
bat.Delete(leveldb::Slice(*(keys.rbegin())));
58
void LevelDBStore::LevelDBTransactionImpl::rmkeys_by_prefix(const string &prefix)
60
KeyValueDB::Iterator it = db->get_iterator(prefix);
61
for (it->seek_to_first();
64
string key = combine_strings(prefix, it->key());
66
bat.Delete(*(keys.rbegin()));
70
int LevelDBStore::get(
72
const std::set<string> &keys,
73
std::map<string, bufferlist> *out)
75
KeyValueDB::Iterator it = get_iterator(prefix);
76
for (std::set<string>::const_iterator i = keys.begin();
80
if (it->valid() && it->key() == *i) {
81
out->insert(make_pair(*i, it->value()));
82
} else if (!it->valid())
88
string LevelDBStore::combine_strings(const string &prefix, const string &value)
96
bufferlist LevelDBStore::to_bufferlist(leveldb::Slice in)
99
bl.append(bufferptr(in.data(), in.size()));
103
int LevelDBStore::split_key(leveldb::Slice in, string *prefix, string *key)
105
string in_prefix = in.ToString();
106
size_t prefix_len = in_prefix.find('\0');
107
if (prefix_len >= in_prefix.size())
111
*prefix = string(in_prefix, 0, prefix_len);
113
*key= string(in_prefix, prefix_len + 1);