const std::string &k, ///< [in] Key to set
const bufferlist &bl ///< [in] Value to set
) = 0;
-
+ virtual void set(
+ const std::string &prefix,
+ const char *k,
+ size_t keylen,
+ const bufferlist& bl) {
+ set(prefix, string(k, keylen), bl);
+ }
/// Removes Keys (via encoded bufferlist)
void rmkeys(
const std::string &prefix, ///< [in] Prefix to search for
const std::string &k ///< [in] Key to remove
) = 0;
+ virtual void rmkey(
+ const std::string &prefix, ///< [in] Prefix to search for
+ const char *k, ///< [in] Key to remove
+ size_t keylen
+ ) {
+ rmkey(prefix, string(k, keylen));
+ }
/// Remove Single Key which exists and was not overwritten.
/// This API is only related to performance optimization, and should only be
}
return r;
}
+ virtual int get(const string &prefix,
+ const char *key, size_t keylen,
+ bufferlist *value) {
+ return get(prefix, string(key, keylen), value);
+ }
class GenericIteratorImpl {
public:
}
}
+void RocksDBStore::RocksDBTransactionImpl::set(
+ const string &prefix,
+ const char *k, size_t keylen,
+ const bufferlist &to_set_bl)
+{
+ string key;
+ combine_strings(prefix, k, keylen, &key);
+
+ // bufferlist::c_str() is non-constant, so we can't call c_str()
+ if (to_set_bl.is_contiguous() && to_set_bl.length() > 0) {
+ bat.Put(rocksdb::Slice(key),
+ rocksdb::Slice(to_set_bl.buffers().front().c_str(),
+ to_set_bl.length()));
+ } else {
+ // make a copy
+ bufferlist val = to_set_bl;
+ bat.Put(rocksdb::Slice(key),
+ rocksdb::Slice(val.c_str(), val.length()));
+ }
+}
+
void RocksDBStore::RocksDBTransactionImpl::rmkey(const string &prefix,
const string &k)
{
bat.Delete(combine_strings(prefix, k));
}
+void RocksDBStore::RocksDBTransactionImpl::rmkey(const string &prefix,
+ const char *k,
+ size_t keylen)
+{
+ string key;
+ combine_strings(prefix, k, keylen, &key);
+ bat.Delete(key);
+}
+
void RocksDBStore::RocksDBTransactionImpl::rm_single_key(const string &prefix,
const string &k)
{
return r;
}
-string RocksDBStore::combine_strings(const string &prefix, const string &value)
-{
- string out = prefix;
- out.push_back(0);
- out.append(value);
- return out;
-}
-
-bufferlist RocksDBStore::to_bufferlist(rocksdb::Slice in)
+int RocksDBStore::get(
+ const string& prefix,
+ const char *key,
+ size_t keylen,
+ bufferlist *out)
{
- bufferlist bl;
- bl.append(bufferptr(in.data(), in.size()));
- return bl;
+ assert(out && (out->length() == 0));
+ utime_t start = ceph_clock_now();
+ int r = 0;
+ string value, k;
+ combine_strings(prefix, key, keylen, &k);
+ rocksdb::Status s;
+ s = db->Get(rocksdb::ReadOptions(), rocksdb::Slice(k), &value);
+ if (s.ok()) {
+ out->append(value);
+ } else {
+ r = -ENOENT;
+ }
+ utime_t lat = ceph_clock_now() - start;
+ logger->inc(l_rocksdb_gets);
+ logger->tinc(l_rocksdb_get_latency, lat);
+ return r;
}
int RocksDBStore::split_key(rocksdb::Slice in, string *prefix, string *key)
const string &prefix,
const string &k,
const bufferlist &bl) override;
+ void set(
+ const string &prefix,
+ const char *k,
+ size_t keylen,
+ const bufferlist &bl) override;
void rmkey(
const string &prefix,
const string &k) override;
+ void rmkey(
+ const string &prefix,
+ const char *k,
+ size_t keylen) override;
void rm_single_key(
const string &prefix,
const string &k) override;
const string &prefix,
const std::set<string> &key,
std::map<string, bufferlist> *out
- );
+ ) override;
int get(
const string &prefix,
const string &key,
bufferlist *out
- );
+ ) override;
+ int get(
+ const string &prefix,
+ const char *key,
+ size_t keylen,
+ bufferlist *out) override;
+
class RocksDBWholeSpaceIteratorImpl :
public KeyValueDB::WholeSpaceIteratorImpl {
};
/// Utility
- static string combine_strings(const string &prefix, const string &value);
+ static string combine_strings(const string &prefix, const string &value) {
+ string out = prefix;
+ out.push_back(0);
+ out.append(value);
+ return out;
+ }
+ static void combine_strings(const string &prefix,
+ const char *key, size_t keylen,
+ string *out) {
+ out->reserve(prefix.size() + 1 + keylen);
+ *out = prefix;
+ out->push_back(0);
+ out->append(key, keylen);
+ }
+
static int split_key(rocksdb::Slice in, string *prefix, string *key);
- static bufferlist to_bufferlist(rocksdb::Slice in);
+
+ static bufferlist to_bufferlist(rocksdb::Slice in) {
+ bufferlist bl;
+ bl.append(bufferptr(in.data(), in.size()));
+ return bl;
+ }
+
static string past_prefix(const string &prefix);
class MergeOperatorRouter;