// Copyright 2022, The Cozo Project Authors. // // This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. // If a copy of the MPL was not distributed with this file, // You can obtain one at https://mozilla.org/MPL/2.0/. #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 SstFileWriterBridge { SstFileWriter inner; SstFileWriterBridge(EnvOptions eopts, Options opts) : inner(eopts, opts) { } inline void finish(RocksDbStatus &status) { write_status(inner.Finish(), status); } inline void put(RustBytes key, RustBytes val, RocksDbStatus &status) { write_status(inner.Put(convert_slice(key), convert_slice(val)), status); } }; static WriteOptions DEFAULT_WRITE_OPTIONS = WriteOptions(); struct RocksDbBridge { unique_ptr db; bool destroy_on_exit; string db_path; inline unique_ptr get_sst_writer(rust::Str path, RocksDbStatus &status) const { DB *db_ = get_base_db(); auto cf = db->DefaultColumnFamily(); Options options_ = db_->GetOptions(cf); auto sst_file_writer = std::make_unique(EnvOptions(), options_); string path_(path); write_status(sst_file_writer->inner.Open(path_), status); return sst_file_writer; } inline void ingest_sst(rust::Str path, RocksDbStatus &status) const { IngestExternalFileOptions ifo; DB *db_ = get_base_db(); string path_(path); auto cf = db->DefaultColumnFamily(); write_status(db_->IngestExternalFile(cf, {std::move(path_)}, ifo), status); } [[nodiscard]] inline const string &get_db_path() const { return db_path; } [[nodiscard]] inline unique_ptr transact() const { auto ret = make_unique(&*this->db, db->DefaultColumnFamily()); return ret; } inline void del_range(RustBytes start, RustBytes end, RocksDbStatus &status) const { WriteBatch batch; auto cf = db->DefaultColumnFamily(); auto s = batch.DeleteRange(cf, convert_slice(start), convert_slice(end)); if (!s.ok()) { write_status(s, status); return; } WriteOptions w_opts; TransactionDBWriteOptimizations optimizations; optimizations.skip_concurrency_control = true; optimizations.skip_duplicate_key_check = true; auto s2 = db->Write(w_opts, optimizations, &batch); write_status(s2, status); } inline void put(RustBytes key, RustBytes val, RocksDbStatus &status) const { auto raw_db = this->get_base_db(); auto s = raw_db->Put(DEFAULT_WRITE_OPTIONS, convert_slice(key), convert_slice(val)); write_status(s, status); } void compact_range(RustBytes start, RustBytes end, RocksDbStatus &status) const { CompactRangeOptions options; auto cf = db->DefaultColumnFamily(); auto start_s = convert_slice(start); auto end_s = convert_slice(end); auto s = db->CompactRange(options, cf, &start_s, &end_s); write_status(s, status); } DB *get_base_db() const { return db->GetBaseDB(); } ~RocksDbBridge(); }; shared_ptr open_db(const DbOpts &opts, RocksDbStatus &status); #endif //COZOROCKS_DB_H