|
|
|
@ -15,14 +15,58 @@
|
|
|
|
|
|
|
|
|
|
struct Status;
|
|
|
|
|
|
|
|
|
|
typedef ROCKSDB_NAMESPACE::Status::Code StatusCode;
|
|
|
|
|
typedef ROCKSDB_NAMESPACE::Status::SubCode StatusSubCode;
|
|
|
|
|
typedef ROCKSDB_NAMESPACE::Status::Severity StatusSeverity;
|
|
|
|
|
namespace RDB = ROCKSDB_NAMESPACE;
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<ROCKSDB_NAMESPACE::DB> new_db();
|
|
|
|
|
typedef RDB::Status::Code StatusCode;
|
|
|
|
|
typedef RDB::Status::SubCode StatusSubCode;
|
|
|
|
|
typedef RDB::Status::Severity StatusSeverity;
|
|
|
|
|
|
|
|
|
|
struct Options {
|
|
|
|
|
mutable ROCKSDB_NAMESPACE::Options inner;
|
|
|
|
|
std::unique_ptr<RDB::DB> new_db();
|
|
|
|
|
|
|
|
|
|
struct ReadOptionsBridge {
|
|
|
|
|
mutable RDB::ReadOptions inner;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct WriteOptionsBridge {
|
|
|
|
|
mutable RDB::WriteOptions inner;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
inline void set_disable_wal(bool v) const {
|
|
|
|
|
inner.disableWAL = v;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
typedef rust::Fn<std::int8_t(rust::Slice<const std::uint8_t>, rust::Slice<const std::uint8_t>)> RustComparatorFn;
|
|
|
|
|
|
|
|
|
|
class RustComparator: public RDB::Comparator {
|
|
|
|
|
public:
|
|
|
|
|
inline int Compare(const rocksdb::Slice& a, const rocksdb::Slice& b ) const {
|
|
|
|
|
auto ra = rust::Slice(reinterpret_cast<const std::uint8_t *>(a.data()), a.size());
|
|
|
|
|
auto rb = rust::Slice(reinterpret_cast<const std::uint8_t *>(b.data()), b.size());
|
|
|
|
|
return int(rust_compare(ra, rb));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char* Name() const {
|
|
|
|
|
return "RustComparator";
|
|
|
|
|
}
|
|
|
|
|
void FindShortestSeparator(std::string*, const rocksdb::Slice&) const { }
|
|
|
|
|
void FindShortSuccessor(std::string*) const { }
|
|
|
|
|
|
|
|
|
|
void set_fn(RustComparatorFn f) const {
|
|
|
|
|
rust_compare = f;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void set_name(rust::Str name_) const {
|
|
|
|
|
name = std::string(name_);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mutable std::string name;
|
|
|
|
|
mutable RustComparatorFn rust_compare;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct OptionsBridge {
|
|
|
|
|
mutable RDB::Options inner;
|
|
|
|
|
mutable RustComparator cmp_obj;
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
inline void prepare_for_bulk_load() const {
|
|
|
|
@ -40,47 +84,85 @@ public:
|
|
|
|
|
inline void set_create_if_missing(bool v) const {
|
|
|
|
|
inner.create_if_missing = v;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void set_comparator(rust::Str name, RustComparatorFn f) const {
|
|
|
|
|
cmp_obj = RustComparator();
|
|
|
|
|
cmp_obj.set_name(name);
|
|
|
|
|
cmp_obj.set_fn(f);
|
|
|
|
|
inner.comparator = &cmp_obj;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
inline std::unique_ptr<Options> new_options() {
|
|
|
|
|
return std::unique_ptr<Options>(new Options);
|
|
|
|
|
inline std::unique_ptr<ReadOptionsBridge> new_read_options() {
|
|
|
|
|
return std::unique_ptr<ReadOptionsBridge>(new ReadOptionsBridge);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline std::unique_ptr<WriteOptionsBridge> new_write_options() {
|
|
|
|
|
return std::unique_ptr<WriteOptionsBridge>(new WriteOptionsBridge);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline std::unique_ptr<OptionsBridge> new_options() {
|
|
|
|
|
return std::unique_ptr<OptionsBridge>(new OptionsBridge);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct PinnableSlice {
|
|
|
|
|
ROCKSDB_NAMESPACE::PinnableSlice inner;
|
|
|
|
|
|
|
|
|
|
struct PinnableSliceBridge {
|
|
|
|
|
RDB::PinnableSlice inner;
|
|
|
|
|
|
|
|
|
|
inline rust::Slice<const std::uint8_t> as_bytes() const {
|
|
|
|
|
return rust::Slice(reinterpret_cast<const std::uint8_t *>(inner.data()), inner.size());
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void write_status_impl(Status &status, StatusCode code, StatusSubCode subcode, StatusSeverity severity);
|
|
|
|
|
|
|
|
|
|
struct DB {
|
|
|
|
|
mutable ROCKSDB_NAMESPACE::DB *inner;
|
|
|
|
|
|
|
|
|
|
inline ~DB() {
|
|
|
|
|
if (inner != nullptr) {
|
|
|
|
|
delete inner;
|
|
|
|
|
}
|
|
|
|
|
inline void write_status(RDB::Status &&rstatus, Status &status) {
|
|
|
|
|
if (rstatus.code() != StatusCode::kOk || rstatus.subcode() != StatusSubCode::kNoSpace ||
|
|
|
|
|
rstatus.severity() != StatusSeverity::kNoError) {
|
|
|
|
|
write_status_impl(status, rstatus.code(), rstatus.subcode(), rstatus.severity());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void put(rust::Slice<const uint8_t> key, rust::Slice<const uint8_t> val, Status &status) const;
|
|
|
|
|
struct DBBridge {
|
|
|
|
|
mutable std::unique_ptr<RDB::DB> inner;
|
|
|
|
|
|
|
|
|
|
DBBridge(RDB::DB *inner_) : inner(inner_) {}
|
|
|
|
|
|
|
|
|
|
inline void put(
|
|
|
|
|
const WriteOptionsBridge &options,
|
|
|
|
|
rust::Slice<const uint8_t> key,
|
|
|
|
|
rust::Slice<const uint8_t> val,
|
|
|
|
|
Status &status
|
|
|
|
|
) const {
|
|
|
|
|
write_status(
|
|
|
|
|
inner->Put(options.inner,
|
|
|
|
|
RDB::Slice(reinterpret_cast<const char *>(key.data()), key.size()),
|
|
|
|
|
RDB::Slice(reinterpret_cast<const char *>(val.data()), val.size())),
|
|
|
|
|
status
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline std::unique_ptr<PinnableSlice> get(rust::Slice<const uint8_t> key) const {
|
|
|
|
|
auto pinnable_val = std::make_unique<PinnableSlice>();
|
|
|
|
|
inner->Get(ROCKSDB_NAMESPACE::ReadOptions(),
|
|
|
|
|
inline std::unique_ptr<PinnableSliceBridge> get(
|
|
|
|
|
const ReadOptionsBridge &options,
|
|
|
|
|
rust::Slice<const uint8_t> key,
|
|
|
|
|
Status &status
|
|
|
|
|
) const {
|
|
|
|
|
auto pinnable_val = std::make_unique<PinnableSliceBridge>();
|
|
|
|
|
write_status(
|
|
|
|
|
inner->Get(options.inner,
|
|
|
|
|
inner->DefaultColumnFamily(),
|
|
|
|
|
ROCKSDB_NAMESPACE::Slice(reinterpret_cast<const char *>(key.data()), key.size()),
|
|
|
|
|
&pinnable_val->inner);
|
|
|
|
|
RDB::Slice(reinterpret_cast<const char *>(key.data()), key.size()),
|
|
|
|
|
&pinnable_val->inner),
|
|
|
|
|
status
|
|
|
|
|
);
|
|
|
|
|
return pinnable_val;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
inline std::unique_ptr<DB> open_db(const Options &options, const rust::Str path) {
|
|
|
|
|
ROCKSDB_NAMESPACE::DB *db_ptr;
|
|
|
|
|
ROCKSDB_NAMESPACE::Status s = ROCKSDB_NAMESPACE::DB::Open(options.inner, std::string(path), &db_ptr);
|
|
|
|
|
auto db = std::unique_ptr<DB>(new DB);
|
|
|
|
|
db->inner = db_ptr;
|
|
|
|
|
return db;
|
|
|
|
|
inline std::unique_ptr<DBBridge> open_db(const OptionsBridge &options, const rust::Slice<const uint8_t> path) {
|
|
|
|
|
RDB::DB *db_ptr;
|
|
|
|
|
RDB::Status s = RDB::DB::Open(options.inner,
|
|
|
|
|
std::string(reinterpret_cast<const char *>(path.data()), path.size()),
|
|
|
|
|
&db_ptr);
|
|
|
|
|
return std::unique_ptr<DBBridge>(new DBBridge(db_ptr));
|
|
|
|
|
}
|