|
|
@ -68,8 +68,13 @@ mod ffi {
|
|
|
|
type PinnableSliceBridge;
|
|
|
|
type PinnableSliceBridge;
|
|
|
|
fn as_bytes(self: &PinnableSliceBridge) -> &[u8];
|
|
|
|
fn as_bytes(self: &PinnableSliceBridge) -> &[u8];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type SliceBridge;
|
|
|
|
|
|
|
|
fn as_bytes(self: &SliceBridge) -> &[u8];
|
|
|
|
|
|
|
|
|
|
|
|
type ReadOptionsBridge;
|
|
|
|
type ReadOptionsBridge;
|
|
|
|
fn new_read_options() -> UniquePtr<ReadOptionsBridge>;
|
|
|
|
fn new_read_options() -> UniquePtr<ReadOptionsBridge>;
|
|
|
|
|
|
|
|
fn set_verify_checksums(self: &ReadOptionsBridge, v: bool);
|
|
|
|
|
|
|
|
fn set_total_order_seek(self: &ReadOptionsBridge, v: bool);
|
|
|
|
|
|
|
|
|
|
|
|
type WriteOptionsBridge;
|
|
|
|
type WriteOptionsBridge;
|
|
|
|
fn new_write_options() -> UniquePtr<WriteOptionsBridge>;
|
|
|
|
fn new_write_options() -> UniquePtr<WriteOptionsBridge>;
|
|
|
@ -89,6 +94,21 @@ mod ffi {
|
|
|
|
fn cf_names(self: &DBBridge) -> UniquePtr<CxxVector<CxxString>>;
|
|
|
|
fn cf_names(self: &DBBridge) -> UniquePtr<CxxVector<CxxString>>;
|
|
|
|
fn put(self: &DBBridge, options: &WriteOptionsBridge, cf_id: usize, key: &[u8], val: &[u8], status: &mut Status);
|
|
|
|
fn put(self: &DBBridge, options: &WriteOptionsBridge, cf_id: usize, key: &[u8], val: &[u8], status: &mut Status);
|
|
|
|
fn get(self: &DBBridge, options: &ReadOptionsBridge, cf_id: usize, key: &[u8], status: &mut Status) -> UniquePtr<PinnableSliceBridge>;
|
|
|
|
fn get(self: &DBBridge, options: &ReadOptionsBridge, cf_id: usize, key: &[u8], status: &mut Status) -> UniquePtr<PinnableSliceBridge>;
|
|
|
|
|
|
|
|
fn write_batch(self: &DBBridge) -> UniquePtr<WriteBatchBridge>;
|
|
|
|
|
|
|
|
fn iterator(self: &DBBridge, options: &ReadOptionsBridge, cf_id: usize) -> UniquePtr<IteratorBridge>;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type WriteBatchBridge;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type IteratorBridge;
|
|
|
|
|
|
|
|
fn seek_to_first(self: &IteratorBridge);
|
|
|
|
|
|
|
|
fn seek_to_last(self: &IteratorBridge);
|
|
|
|
|
|
|
|
fn next(self: &IteratorBridge);
|
|
|
|
|
|
|
|
fn is_valid(self: &IteratorBridge) -> bool;
|
|
|
|
|
|
|
|
fn seek(self: &IteratorBridge, key: &[u8]);
|
|
|
|
|
|
|
|
fn seek_for_prev(self: &IteratorBridge, key: &[u8]);
|
|
|
|
|
|
|
|
fn key(self: &IteratorBridge) -> UniquePtr<SliceBridge>;
|
|
|
|
|
|
|
|
fn value(self: &IteratorBridge) -> UniquePtr<SliceBridge>;
|
|
|
|
|
|
|
|
fn status(self: &IteratorBridge) -> Status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -140,18 +160,19 @@ impl Default for Options {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pub struct PinnableSlice {
|
|
|
|
pub struct ReadOptions {
|
|
|
|
bridge: UniquePtr<PinnableSliceBridge>,
|
|
|
|
bridge: UniquePtr<ReadOptionsBridge>,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl PinnableSlice {
|
|
|
|
impl ReadOptions {
|
|
|
|
pub fn as_bytes(&self) -> &[u8] {
|
|
|
|
pub fn set_total_order_seek(self, v: bool) -> Self {
|
|
|
|
self.bridge.as_bytes()
|
|
|
|
self.bridge.set_total_order_seek(v);
|
|
|
|
|
|
|
|
self
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn set_verify_checksums(self, v: bool) -> Self {
|
|
|
|
|
|
|
|
self.bridge.set_total_order_seek(v);
|
|
|
|
|
|
|
|
self
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub struct ReadOptions {
|
|
|
|
|
|
|
|
bridge: UniquePtr<ReadOptionsBridge>,
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl Default for ReadOptions {
|
|
|
|
impl Default for ReadOptions {
|
|
|
@ -177,12 +198,16 @@ impl Default for WriteOptions {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub type PinnableSlice = UniquePtr<PinnableSliceBridge>;
|
|
|
|
|
|
|
|
pub type Slice = UniquePtr<SliceBridge>;
|
|
|
|
|
|
|
|
pub type Iterator = UniquePtr<IteratorBridge>;
|
|
|
|
|
|
|
|
|
|
|
|
pub struct DB {
|
|
|
|
pub struct DB {
|
|
|
|
bridge: UniquePtr<DBBridge>,
|
|
|
|
bridge: UniquePtr<DBBridge>,
|
|
|
|
pub options: Options,
|
|
|
|
pub options: Options,
|
|
|
|
pub default_read_options: ReadOptions,
|
|
|
|
pub default_read_options: ReadOptions,
|
|
|
|
pub default_write_options: WriteOptions,
|
|
|
|
pub default_write_options: WriteOptions,
|
|
|
|
pub column_families: BTreeMap<String, usize>
|
|
|
|
pub column_families: BTreeMap<String, usize>,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn get_path_bytes(path: &std::path::Path) -> &[u8] {
|
|
|
|
fn get_path_bytes(path: &std::path::Path) -> &[u8] {
|
|
|
@ -209,7 +234,7 @@ impl DB {
|
|
|
|
let bridge = open_db(
|
|
|
|
let bridge = open_db(
|
|
|
|
&options.bridge,
|
|
|
|
&options.bridge,
|
|
|
|
get_path_bytes(path.as_ref()),
|
|
|
|
get_path_bytes(path.as_ref()),
|
|
|
|
&mut status
|
|
|
|
&mut status,
|
|
|
|
);
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
if status.code == StatusCode::kOk {
|
|
|
|
if status.code == StatusCode::kOk {
|
|
|
@ -219,13 +244,11 @@ impl DB {
|
|
|
|
default_read_options: ReadOptions::default(),
|
|
|
|
default_read_options: ReadOptions::default(),
|
|
|
|
default_write_options: WriteOptions::default(),
|
|
|
|
default_write_options: WriteOptions::default(),
|
|
|
|
options,
|
|
|
|
options,
|
|
|
|
column_families
|
|
|
|
column_families,
|
|
|
|
})
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
Err(status)
|
|
|
|
Err(status)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
#[inline]
|
|
|
@ -248,11 +271,16 @@ impl DB {
|
|
|
|
&options.unwrap_or(&self.default_read_options).bridge, cf,
|
|
|
|
&options.unwrap_or(&self.default_read_options).bridge, cf,
|
|
|
|
key.as_ref(), &mut status);
|
|
|
|
key.as_ref(), &mut status);
|
|
|
|
match status.code {
|
|
|
|
match status.code {
|
|
|
|
StatusCode::kOk => Ok(Some(PinnableSlice { bridge: slice })),
|
|
|
|
StatusCode::kOk => Ok(Some(slice)),
|
|
|
|
StatusCode::kNotFound => Ok(None),
|
|
|
|
StatusCode::kNotFound => Ok(None),
|
|
|
|
_ => Err(status)
|
|
|
|
_ => Err(status)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
|
|
|
pub fn iterator(&self, cf: usize, options: Option<&ReadOptions>) -> Iterator {
|
|
|
|
|
|
|
|
self.bridge.iterator(&options.unwrap_or(&self.default_read_options).bridge, cf)
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
impl Default for Status {
|
|
|
|
impl Default for Status {
|
|
|
|