use ahash::RandomState;
use crossbeam_skiplist::SkipMap;
use parking_lot::RwLock;
use scc::HashMap;
use std::sync::Arc;
use crate::core::record::Record;
use crate::core::ttl_sweep::TtlSweeper;
use crate::stats::Statistics;
use crate::storage::free_space::FreeSpaceManager;
use crate::storage::metadata::Metadata;
use crate::storage::write_buffer::WriteBuffer;
pub use self::builder::{StoreBuilder, StoreConfig};
pub mod atomic;
pub mod builder;
pub mod init;
pub mod internal;
pub mod json_patch;
pub mod operations;
pub mod persistence;
pub mod range;
pub mod recovery;
pub mod ttl;
pub struct FeoxStore {
pub(super) hash_table: HashMap<Vec<u8>, Arc<Record>, RandomState>,
pub(super) tree: Arc<SkipMap<Vec<u8>, Arc<Record>>>,
pub(super) stats: Arc<Statistics>,
pub(super) write_buffer: Option<Arc<WriteBuffer>>,
pub(super) free_space: Arc<RwLock<FreeSpaceManager>>,
pub(super) _metadata: Arc<RwLock<Metadata>>,
pub(super) memory_only: bool,
pub(super) enable_caching: bool,
pub(super) max_memory: Option<usize>,
pub(super) cache: Option<Arc<super::cache::ClockCache>>,
#[cfg(unix)]
pub(super) device_fd: Option<i32>,
pub(super) device_size: u64,
pub(super) device_file: Option<std::fs::File>,
pub(super) disk_io: Option<Arc<RwLock<crate::storage::io::DiskIO>>>,
pub(super) ttl_sweeper: Arc<RwLock<Option<TtlSweeper>>>,
pub(super) enable_ttl: bool,
}
impl FeoxStore {
pub fn builder() -> StoreBuilder {
StoreBuilder::new()
}
pub fn contains_key(&self, key: &[u8]) -> bool {
self.hash_table.contains(key)
}
pub fn len(&self) -> usize {
self.stats
.record_count
.load(std::sync::atomic::Ordering::Acquire) as usize
}
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn memory_usage(&self) -> usize {
self.stats
.memory_usage
.load(std::sync::atomic::Ordering::Acquire)
}
pub fn stats(&self) -> crate::stats::StatsSnapshot {
self.stats.snapshot()
}
pub fn flush(&self) {
self.flush_all()
}
}