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.

116 lines
3.3 KiB
C

// 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/.
2 years ago
#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 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);
}
};
2 years ago
struct RocksDbBridge {
unique_ptr<TransactionDB> db;
2 years ago
bool destroy_on_exit;
string db_path;
inline unique_ptr<SstFileWriterBridge> 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<SstFileWriterBridge>(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 {
2 years ago
return db_path;
}
2 years ago
[[nodiscard]] inline unique_ptr<TxBridge> transact() const {
auto ret = make_unique<TxBridge>(&*this->db, db->DefaultColumnFamily());
2 years ago
return ret;
}
2 years ago
inline void del_range(RustBytes start, RustBytes end, RocksDbStatus &status) const {
2 years ago
WriteBatch batch;
auto cf = db->DefaultColumnFamily();
auto s = batch.DeleteRange(cf, convert_slice(start), convert_slice(end));
2 years ago
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);
}
void compact_range(RustBytes start, RustBytes end, RocksDbStatus &status) const {
2 years ago
CompactRangeOptions options;
auto cf = db->DefaultColumnFamily();
2 years ago
auto start_s = convert_slice(start);
auto end_s = convert_slice(end);
auto s = db->CompactRange(options, cf, &start_s, &end_s);
2 years ago
write_status(s, status);
}
DB *get_base_db() const {
return db->GetBaseDB();
}
~RocksDbBridge();
2 years ago
};
shared_ptr<RocksDbBridge>
open_db(const DbOpts &opts, RocksDbStatus &status);
2 years ago
#endif //COZOROCKS_DB_H