main
Ziyang Hu 2 years ago
parent eddf6a5573
commit b9ebb8e533

@ -31,6 +31,7 @@ include_cpp! {
} }
pub use ffi::rocksdb::Options; pub use ffi::rocksdb::Options;
pub use ffi::rocksdb::PinnableSlice;
pub use ffi::rocksdb::ReadOptions; pub use ffi::rocksdb::ReadOptions;
pub use ffi::rocksdb::Slice; pub use ffi::rocksdb::Slice;
pub use ffi::rocksdb::Snapshot; pub use ffi::rocksdb::Snapshot;
@ -50,6 +51,7 @@ pub struct DbStatus {
pub severity: StatusSeverity, pub severity: StatusSeverity,
} }
#[inline(always)]
fn convert_status(status: &ffi::rocksdb::Status) -> DbStatus { fn convert_status(status: &ffi::rocksdb::Status) -> DbStatus {
let code = status.code(); let code = status.code();
let subcode = status.subcode(); let subcode = status.subcode();
@ -61,113 +63,112 @@ fn convert_status(status: &ffi::rocksdb::Status) -> DbStatus {
} }
} }
fn convert_slice(src: impl AsRef<[u8]>) -> Slice { #[inline(always)]
let src = src.as_ref(); fn convert_slice(src: &[u8]) -> Slice {
Slice { Slice {
data_: src.as_ptr() as *const c_char, data_: src.as_ptr() as *const c_char,
size_: src.len(), size_: src.len(),
} }
} }
#[inline(always)]
fn convert_slice_back(src: &Slice) -> &[u8] {
unsafe { std::slice::from_raw_parts(src.data() as *const u8, src.size()) }
}
#[inline]
pub fn put( pub fn put(
db: Pin<&mut DB>, db: Pin<&mut DB>,
opts: &WriteOptions, opts: &WriteOptions,
key: impl AsRef<[u8]>, key: impl AsRef<[u8]>,
val: impl AsRef<[u8]>, val: impl AsRef<[u8]>,
) -> DbStatus { ) -> DbStatus {
let key = convert_slice(key); let key = convert_slice(key.as_ref());
let val = convert_slice(val); let val = convert_slice(val.as_ref());
moveit! { let status = db.Put2(opts, &key, &val); } moveit! { let status = db.Put2(opts, &key, &val); }
convert_status(&status) convert_status(&status)
} }
#[macro_export]
macro_rules! let_pinnable_slice {
($i:ident) => {
$crate::moveit! {
let mut $i = $crate::PinnableSlice::new();
}
};
}
#[macro_export] #[macro_export]
macro_rules! let_write_opts { macro_rules! let_write_opts {
($i:ident = [$( $opt:ident ),*]) => { ($i:ident = {$( $opt_name:ident => $opt_val:expr ),*}) => {
$crate::moveit! { $crate::moveit! {
let mut $i = $crate::WriteOptions::new(); let mut $i = $crate::WriteOptions::new();
} }
let_write_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
$( };
match stringify!($opt) { ( @let_opts, $i:ident, ) => {};
"sync" => { ( @let_opts, $i:ident, sync, $val:expr, $( $opt_name:ident, $opt_val:expr, )* ) => {
$crate::ffi::rocksdb_additions::set_w_opts_sync($i.as_mut(), true); $crate::ffi::rocksdb_additions::set_w_opts_sync($i.as_mut(), $val);
} let_write_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
"no_sync" => { };
$crate::ffi::rocksdb_additions::set_w_opts_sync($i.as_mut(), false); ( @let_opts, $i:ident, disable_wal, $val:expr, $( $opt_name:ident, $opt_val:expr, )* ) => {
} $crate::ffi::rocksdb_additions::set_w_opts_disable_wal($i.as_mut(), $val);
"disable_wal" => { let_write_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
$crate::ffi::rocksdb_additions::set_w_opts_disable_wal($i.as_mut(), true); };
} ( @let_opts, $i:ident, low_pri, $val:expr, $( $opt_name:ident, $opt_val:expr, )* ) => {
"no_disable_wal" => { $crate::ffi::rocksdb_additions::set_w_opts_low_pri($i.as_mut(), $val);
$crate::ffi::rocksdb_additions::set_w_opts_disable_wal($i.as_mut(), false); let_write_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
} };
"low_pri" => {
$crate::ffi::rocksdb_additions::set_w_opts_low_pri($i.as_mut(), true);
}
"no_set_w_opts_low_pri" => {
$crate::ffi::rocksdb_additions::set_w_opts_low_pri($i.as_mut(), false);
}
_ => panic!("unknown option to let_write_opts: {}", stringify!($i))
};
)*
}
} }
#[macro_export] #[macro_export]
macro_rules! let_read_opts { macro_rules! let_read_opts {
($i:ident = [$( $opt:ident ),*]) => { ($i:ident = {$( $opt_name:ident => $opt_val:expr ),*}) => {
$crate::moveit! { $crate::moveit! {
let mut $i = $crate::ReadOptions::new(); let mut $i = $crate::ReadOptions::new();
} }
let_read_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
$( };
match stringify!($opt) { ( @let_opts, $i:ident, ) => {};
"total_order_seek" => { ( @let_opts, $i:ident, lower_bound, $val:expr, $( $opt_name:ident, $opt_val:expr, )* ) => {
$crate::ffi::rocksdb_additions::set_r_opts_total_order_seek($i.as_mut(), true); $crate::ffi::rocksdb_additions::set_iterate_lower_bound($i.as_mut(), &$crate::convert_slice($val.as_ref()));
} let_read_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
"no_total_order_seek" => { };
$crate::ffi::rocksdb_additions::set_r_opts_total_order_seek($i.as_mut(), false); ( @let_opts, $i:ident, upper_bound, $val:expr, $( $opt_name:ident, $opt_val:expr, )* ) => {
} $crate::ffi::rocksdb_additions::set_iterate_upper_bound($i.as_mut(), &$crate::convert_slice($val.as_ref()));
"auto_prefix_mode" => { let_read_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
$crate::ffi::rocksdb_additions::set_r_opts_auto_prefix_mode($i.as_mut(), true); };
} ( @let_opts, $i:ident, snapshot, $val:expr, $( $opt_name:ident, $opt_val:expr, )* ) => {
"no_auto_prefix_mode" => { $crate::ffi::rocksdb_additions::set_snapshot($i.as_mut(), $val);
$crate::ffi::rocksdb_additions::set_r_opts_auto_prefix_mode($i.as_mut(), false); let_read_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
} };
"prefix_same_as_start" => { ( @let_opts, $i:ident, total_order_seek, $val:expr, $( $opt_name:ident, $opt_val:expr, )* ) => {
$crate::ffi::rocksdb_additions::set_r_opts_prefix_same_as_start($i.as_mut(), true); $crate::ffi::rocksdb_additions::set_r_opts_total_order_seek($i.as_mut(), $val);
} let_read_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
"no_prefix_same_as_start" => { };
$crate::ffi::rocksdb_additions::set_r_opts_prefix_same_as_start($i.as_mut(), false); ( @let_opts, $i:ident, auto_prefix_mode, $val:expr, $( $opt_name:ident, $opt_val:expr, )* ) => {
} $crate::ffi::rocksdb_additions::set_r_opts_auto_prefix_mode($i.as_mut(), $val);
"tailing" => { let_read_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
$crate::ffi::rocksdb_additions::set_r_opts_tailing($i.as_mut(), true); };
} ( @let_opts, $i:ident, prefix_same_as_start, $val:expr, $( $opt_name:ident, $opt_val:expr, )* ) => {
"no_tailing" => { $crate::ffi::rocksdb_additions::set_r_opts_prefix_same_as_start($i.as_mut(), $val);
$crate::ffi::rocksdb_additions::set_r_opts_tailing($i.as_mut(), false); let_read_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
} };
"pin_data" => { ( @let_opts, $i:ident, tailing, $val:expr, $( $opt_name:ident, $opt_val:expr, )* ) => {
$crate::ffi::rocksdb_additions::set_r_opts_pin_data($i.as_mut(), true); $crate::ffi::rocksdb_additions::set_r_opts_tailing($i.as_mut(), $val);
} let_read_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
"no_pin_data" => { };
$crate::ffi::rocksdb_additions::set_r_opts_pin_data($i.as_mut(), false); ( @let_opts, $i:ident, pin_data, $val:expr, $( $opt_name:ident, $opt_val:expr, )* ) => {
} $crate::ffi::rocksdb_additions::set_r_opts_pin_data($i.as_mut(), $val);
"verify_checksums" => { let_read_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
$crate::ffi::rocksdb_additions::set_r_opts_verify_checksums($i.as_mut(), true); };
} ( @let_opts, $i:ident, verify_checksums, $val:expr, $( $opt_name:ident, $opt_val:expr, )* ) => {
"no_verify_checksums" => { $crate::ffi::rocksdb_additions::set_r_opts_verify_checksums($i.as_mut(), $val);
$crate::ffi::rocksdb_additions::set_r_opts_verify_checksums($i.as_mut(), false); let_read_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
} };
"fill_cache" => { ( @let_opts, $i:ident, fill_cache, $val:expr, $( $opt_name:ident, $opt_val:expr, )* ) => {
$crate::ffi::rocksdb_additions::set_r_opts_fill_cache($i.as_mut(), true); $crate::ffi::rocksdb_additions::set_r_opts_fill_cache($i.as_mut(), $val);
} let_read_opts! { @let_opts, $i, $( $opt_name, $opt_val, )* }
"fill_cache" => {
$crate::ffi::rocksdb_additions::set_r_opts_fill_cache($i.as_mut(), false);
}
_ => panic!("unknown option to let_read_opts: {}", stringify!($i))
};
)*
}; };
} }
@ -184,8 +185,12 @@ mod tests {
let mut g_opts = Options::new().within_unique_ptr(); let mut g_opts = Options::new().within_unique_ptr();
g_opts.pin_mut().OptimizeForSmallDb(); g_opts.pin_mut().OptimizeForSmallDb();
let_read_opts!(r_opts = []); let lower_bound = "lower".as_bytes();
let_write_opts!(w_opts = [disable_wal]); let upper_bound = "upper".as_bytes();
let should_tail = true;
let_read_opts!(r_opts = { lower_bound => lower_bound, tailing => should_tail, upper_bound => upper_bound });
let_write_opts!(w_opts = { disable_wal => true });
} }
dbg!(size_of::<ReadOptions>()); dbg!(size_of::<ReadOptions>());
} }

Loading…
Cancel
Save