// // Created by Ziyang Hu on 2022/7/3. // #ifndef COZOROCKS_DB_H #define COZOROCKS_DB_H #include #include "iostream" #include "common.h" #include "tx.h" #include "slice.h" struct SnapshotBridge { const Snapshot *snapshot; DB *db; explicit SnapshotBridge(const Snapshot *snapshot_, DB *db_) : snapshot(snapshot_), db(db_) {} ~SnapshotBridge() { db->ReleaseSnapshot(snapshot); // printf("released snapshot\n"); } }; struct RawRocksDbBridge { unique_ptr db; unique_ptr comparator; unique_ptr options; unique_ptr r_opts; unique_ptr 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; } } } shared_ptr make_snapshot() const { const Snapshot *snapshot = db->GetSnapshot(); return make_shared(snapshot, &*db); } 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 iterator() const { return make_unique(&*db); }; inline unique_ptr iterator_with_snapshot(const SnapshotBridge &sb) const { auto ret = make_unique(&*db); ret->set_snapshot(sb.snapshot); return ret; }; inline unique_ptr get(RustBytes key, RocksDbStatus &status) const { Slice key_ = convert_slice(key); auto ret = make_unique(); 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); } inline void put(RustBytes key, RustBytes val, RocksDbStatus &status) const { write_status(db->Put(*w_opts, convert_slice(key), convert_slice(val)), status); } inline void del(RustBytes key, RocksDbStatus &status) const { write_status(db->Delete(*w_opts, convert_slice(key)), status); } 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); } }; struct RocksDbBridge { unique_ptr comparator; unique_ptr options; bool destroy_on_exit; string db_path; [[nodiscard]] virtual unique_ptr transact() const = 0; [[nodiscard]] inline const string &get_db_path() const { return db_path; } }; struct OptimisticRocksDb : public RocksDbBridge { unique_ptr db; [[nodiscard]] inline unique_ptr transact() const override { auto ret = make_unique(&*this->db); ret->o_tx_opts->cmp = &*comparator; return ret; } virtual ~OptimisticRocksDb(); }; struct PessimisticRocksDb : public RocksDbBridge { unique_ptr tdb_opts; unique_ptr db; [[nodiscard]] inline unique_ptr transact() const override { auto ret = make_unique(&*this->db); return ret; } virtual ~PessimisticRocksDb(); }; //typedef int8_t (*CmpFn)(RustBytes a, RustBytes b); typedef rust::Fn, rust::Slice)> RustComparatorFn; class RustComparator : public Comparator { public: inline RustComparator(string name_, bool can_different_bytes_be_equal_, RustComparatorFn f) : name(std::move(name_)), ext_cmp(f), can_different_bytes_be_equal(can_different_bytes_be_equal_) { } [[nodiscard]] inline int Compare(const Slice &a, const Slice &b) const override { return ext_cmp(convert_slice_back(a), convert_slice_back(b)); } [[nodiscard]] inline const char *Name() const override { return name.c_str(); } [[nodiscard]] inline bool CanKeysWithDifferentByteContentsBeEqual() const override { return can_different_bytes_be_equal; } inline void FindShortestSeparator(string *, const Slice &) const override {} inline void FindShortSuccessor(string *) const override {} string name; RustComparatorFn ext_cmp; bool can_different_bytes_be_equal; }; shared_ptr open_raw_db(const DbOpts &opts, RocksDbStatus &status, bool use_cmp, RustComparatorFn cmp_impl, bool no_wal); shared_ptr open_db(const DbOpts &opts, RocksDbStatus &status, bool use_cmp, RustComparatorFn cmp_impl); #endif //COZOROCKS_DB_H