use std::ptr::NonNull;
use std::sync::Arc;
use crate::env::Env;
use crate::ffi;
pub(crate) struct SstFileManagerWrapper {
pub(crate) inner: NonNull<ffi::rocksdb_sst_file_manager_t>,
pub(crate) _env: Env,
}
unsafe impl Send for SstFileManagerWrapper {}
unsafe impl Sync for SstFileManagerWrapper {}
impl Drop for SstFileManagerWrapper {
fn drop(&mut self) {
unsafe {
ffi::rocksdb_sst_file_manager_destroy(self.inner.as_ptr());
}
}
}
#[derive(Clone)]
pub struct SstFileManager(pub(crate) Arc<SstFileManagerWrapper>);
impl SstFileManager {
pub fn new() -> Self {
let env = Env::new().expect("Could not create default Env");
let inner = NonNull::new(unsafe { ffi::rocksdb_sst_file_manager_create(env.0.inner) })
.expect("Could not create RocksDB sst file manager");
SstFileManager(Arc::new(SstFileManagerWrapper { inner, _env: env }))
}
pub fn set_max_allowed_space_usage(&self, bytes: u64) {
unsafe {
ffi::rocksdb_sst_file_manager_set_max_allowed_space_usage(self.0.inner.as_ptr(), bytes);
}
}
pub fn set_compaction_buffer_size(&self, bytes: u64) {
unsafe {
ffi::rocksdb_sst_file_manager_set_compaction_buffer_size(self.0.inner.as_ptr(), bytes);
}
}
pub fn is_max_allowed_space_reached(&self) -> bool {
unsafe { ffi::rocksdb_sst_file_manager_is_max_allowed_space_reached(self.0.inner.as_ptr()) }
}
pub fn is_max_allowed_space_reached_including_compactions(&self) -> bool {
unsafe {
ffi::rocksdb_sst_file_manager_is_max_allowed_space_reached_including_compactions(
self.0.inner.as_ptr(),
)
}
}
pub fn get_total_size(&self) -> u64 {
unsafe { ffi::rocksdb_sst_file_manager_get_total_size(self.0.inner.as_ptr()) }
}
pub fn get_delete_rate_bytes_per_second(&self) -> i64 {
unsafe {
ffi::rocksdb_sst_file_manager_get_delete_rate_bytes_per_second(self.0.inner.as_ptr())
}
}
pub fn set_delete_rate_bytes_per_second(&self, rate: i64) {
unsafe {
ffi::rocksdb_sst_file_manager_set_delete_rate_bytes_per_second(
self.0.inner.as_ptr(),
rate,
);
}
}
pub fn get_max_trash_db_ratio(&self) -> f64 {
unsafe { ffi::rocksdb_sst_file_manager_get_max_trash_db_ratio(self.0.inner.as_ptr()) }
}
pub fn set_max_trash_db_ratio(&self, ratio: f64) {
unsafe {
ffi::rocksdb_sst_file_manager_set_max_trash_db_ratio(self.0.inner.as_ptr(), ratio);
}
}
pub fn get_total_trash_size(&self) -> u64 {
unsafe { ffi::rocksdb_sst_file_manager_get_total_trash_size(self.0.inner.as_ptr()) }
}
}
impl Default for SstFileManager {
fn default() -> Self {
Self::new()
}
}