You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
4.5 KiB
C

2 years ago
//
// Created by Ziyang Hu on 2022/7/3.
//
#ifndef COZOROCKS_DB_H
#define COZOROCKS_DB_H
#include <utility>
2 years ago
#include "iostream"
#include "common.h"
#include "tx.h"
2 years ago
#include "slice.h"
2 years ago
struct RawRocksDbBridge {
unique_ptr<DB> db;
unique_ptr<Comparator> comparator;
unique_ptr<Options> options;
unique_ptr<ReadOptions> r_opts;
unique_ptr<WriteOptions> w_opts;
bool destroy_on_exit;
string db_path;
inline ~RawRocksDbBridge() {
if (destroy_on_exit) {
auto status = db->Close();
if (!status.ok()) {
cerr << status.ToString() << endl;
}
db.reset();
auto status2 = DestroyDB(db_path, *options);
if (!status2.ok()) {
cerr << status.ToString() << endl;
}
}
}
2 years ago
inline void set_ignore_range_deletions(bool v) const {
r_opts->ignore_range_deletions = v;
}
[[nodiscard]] inline const string &get_db_path() const {
return db_path;
}
inline unique_ptr<IterBridge> iterator() const {
return make_unique<IterBridge>(&*db);
};
inline unique_ptr<PinnableSlice> get(RustBytes key, RocksDbStatus &status) const {
Slice key_ = convert_slice(key);
auto ret = make_unique<PinnableSlice>();
auto s = db->Get(*r_opts, db->DefaultColumnFamily(), key_, &*ret);
write_status(s, status);
return ret;
}
inline void exists(RustBytes key, RocksDbStatus &status) const {
Slice key_ = convert_slice(key);
auto ret = PinnableSlice();
auto s = db->Get(*r_opts, db->DefaultColumnFamily(), key_, &ret);
write_status(s, status);
}
2 years ago
inline void put(RustBytes key, RustBytes val, RocksDbStatus &status) const {
write_status(db->Put(*w_opts, convert_slice(key), convert_slice(val)), status);
}
2 years ago
inline void del(RustBytes key, RocksDbStatus &status) const {
write_status(db->Delete(*w_opts, convert_slice(key)), status);
}
2 years ago
inline void del_range(RustBytes start, RustBytes end, RocksDbStatus &status) const {
write_status(db->DeleteRange(*w_opts, db->DefaultColumnFamily(), convert_slice(start), convert_slice(end)),
status);
}
};
2 years ago
struct RocksDbBridge {
2 years ago
unique_ptr<Comparator> comparator;
unique_ptr<Options> options;
bool destroy_on_exit;
string db_path;
[[nodiscard]] virtual unique_ptr<TxBridge> transact() const = 0;
2 years ago
[[nodiscard]] inline const string &get_db_path() const {
2 years ago
return db_path;
}
};
2 years ago
struct OptimisticRocksDb : public RocksDbBridge {
2 years ago
unique_ptr<OptimisticTransactionDB> db;
[[nodiscard]] inline unique_ptr<TxBridge> transact() const override {
2 years ago
auto ret = make_unique<TxBridge>(&*this->db);
ret->o_tx_opts->cmp = &*comparator;
return ret;
}
2 years ago
virtual ~OptimisticRocksDb();
};
2 years ago
struct PessimisticRocksDb : public RocksDbBridge {
2 years ago
unique_ptr<TransactionDBOptions> tdb_opts;
unique_ptr<TransactionDB> db;
[[nodiscard]] inline unique_ptr<TxBridge> transact() const override {
2 years ago
auto ret = make_unique<TxBridge>(&*this->db);
return ret;
}
2 years ago
virtual ~PessimisticRocksDb();
};
2 years ago
//typedef int8_t (*CmpFn)(RustBytes a, RustBytes b);
typedef rust::Fn<std::int8_t(rust::Slice<const std::uint8_t>, rust::Slice<const std::uint8_t>)> RustComparatorFn;
2 years ago
class RustComparator : public Comparator {
public:
2 years ago
inline RustComparator(string name_, bool can_different_bytes_be_equal_, RustComparatorFn f) :
name(std::move(name_)),
2 years ago
ext_cmp(f),
2 years ago
can_different_bytes_be_equal(can_different_bytes_be_equal_) {
}
[[nodiscard]] inline int Compare(const Slice &a, const Slice &b) const override {
2 years ago
return ext_cmp(convert_slice_back(a), convert_slice_back(b));
2 years ago
}
[[nodiscard]] inline const char *Name() const override {
2 years ago
return name.c_str();
}
[[nodiscard]] inline bool CanKeysWithDifferentByteContentsBeEqual() const override {
2 years ago
return can_different_bytes_be_equal;
}
inline void FindShortestSeparator(string *, const Slice &) const override {}
2 years ago
inline void FindShortSuccessor(string *) const override {}
2 years ago
string name;
2 years ago
RustComparatorFn ext_cmp;
2 years ago
bool can_different_bytes_be_equal;
};
shared_ptr<RawRocksDbBridge>
open_raw_db(const DbOpts &opts, RocksDbStatus &status, bool use_cmp, RustComparatorFn cmp_impl, bool no_wal);
2 years ago
shared_ptr<RocksDbBridge> open_db(const DbOpts &opts, RocksDbStatus &status, bool use_cmp, RustComparatorFn cmp_impl);
2 years ago
#endif //COZOROCKS_DB_H