use std::{
ops::{Deref, DerefMut},
path::Path,
};
pub use bf_tree::{ScanReturnField, StorageBackend};
use crate::stub::RangeIndexStub;
#[derive(Clone, Debug, Default)]
pub struct BfTreeConfig {
pub(crate) inner: bf_tree::Config,
pub(crate) file_path: Option<String>,
pub(crate) storage_backend: StorageBackendType,
}
impl Deref for BfTreeConfig {
type Target = bf_tree::Config;
#[inline]
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl DerefMut for BfTreeConfig {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl From<BfTreeConfig> for bf_tree::Config {
#[inline]
fn from(cfg: BfTreeConfig) -> Self {
cfg.inner
}
}
impl BfTreeConfig {
pub fn file_path(&mut self, path: impl AsRef<Path>) -> &mut Self {
let p = path.as_ref();
self.file_path = Some(p.to_string_lossy().into_owned());
self.storage_backend = StorageBackendType::Disk;
self.inner.storage_backend(StorageBackend::Std);
self.inner.file_path(p);
self
}
pub fn storage_backend(&mut self, backend: StorageBackend) -> &mut Self {
self.storage_backend = match backend {
StorageBackend::Memory => StorageBackendType::Memory,
_ => StorageBackendType::Disk,
};
self.inner.storage_backend(backend);
self
}
pub fn cache_only(&mut self, cache_only: bool) -> &mut Self {
if cache_only {
self.storage_backend = StorageBackendType::Memory;
}
self.inner.cache_only(cache_only);
self
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Default)]
#[repr(u8)]
pub enum StorageBackendType {
#[default]
Disk = 0,
Memory = 1,
}
impl StorageBackendType {
#[inline]
pub const fn as_str(self) -> &'static str {
match self {
Self::Disk => "Disk",
Self::Memory => "Memory",
}
}
#[inline]
pub const fn from_u8(val: u8) -> Self {
match val {
1 => Self::Memory,
_ => Self::Disk,
}
}
#[inline]
pub const fn to_u8(self) -> u8 {
self as u8
}
}
impl From<StorageBackendType> for StorageBackend {
#[inline]
fn from(t: StorageBackendType) -> Self {
match t {
StorageBackendType::Disk => StorageBackend::Std,
StorageBackendType::Memory => StorageBackend::Memory,
}
}
}
impl From<StorageBackend> for StorageBackendType {
#[inline]
fn from(b: StorageBackend) -> Self {
match b {
StorageBackend::Memory => StorageBackendType::Memory,
_ => StorageBackendType::Disk,
}
}
}
#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
pub struct TreeTuning {
pub cache_size: usize,
pub min_record_size: usize,
pub max_record_size: usize,
pub max_key_len: usize,
pub leaf_page_size: usize,
}
impl From<&RangeIndexStub> for TreeTuning {
fn from(s: &RangeIndexStub) -> Self {
Self {
cache_size: s.cache_size as usize,
min_record_size: s.min_record_size as usize,
max_record_size: s.max_record_size as usize,
max_key_len: s.max_key_len as usize,
leaf_page_size: s.leaf_page_size as usize,
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[repr(i32)]
pub enum BfTreeReadResult {
Found = 0,
NotFound = -1,
Deleted = -2,
InvalidKey = -3,
InvalidArguments = -4,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[repr(i32)]
pub enum BfTreeInsertResult {
Success = 0,
InvalidKV = 1,
InvalidArguments = -1,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
#[repr(i32)]
pub enum BfTreeDeleteResult {
Success = 0,
InvalidArguments = -1,
}
#[derive(Clone, Debug, PartialEq, Eq, Default)]
pub struct ScanRecord {
pub key: Vec<u8>,
pub value: Vec<u8>,
}