#![allow(
clippy::type_complexity,
clippy::collapsible_if,
reason = "V3 cache types are complex by design; collapsed let-chains reduce readability"
)]
#[path = "edge_compat/core_support.rs"]
mod core_support;
#[path = "edge_cluster_support.rs"]
mod edge_cluster_support;
#[path = "edge_disk_support.rs"]
mod edge_disk_support;
#[path = "edge_mutation_support.rs"]
mod edge_mutation_support;
#[path = "edge_query_support.rs"]
mod edge_query_support;
#[cfg(feature = "v3-forensics")]
use crate::backend::native::v3::forensics::{
FORENSIC_COUNTERS, PageType as ForensicPageType, Subsystem,
};
use crate::backend::native::v3::{
allocator::PageAllocator, btree::BTreeManager, file_coordinator::FileCoordinator,
header::PersistentHeaderV3, wal::WALWriter,
};
use crate::backend::native::{
types::{NativeBackendError, NativeResult},
v3::compact_edge_record::Direction as V2Direction,
};
pub(crate) use core_support::edge_key;
pub use core_support::{Direction, PageType};
pub use edge_cluster_support::V3EdgeCluster;
pub(crate) use edge_cluster_support::{decode_edge_cluster_page_header, decode_packed_edge_page};
use edge_cluster_support::{encode_edge_cluster_pages, encode_packed_edge_page};
use parking_lot::RwLock;
use std::collections::HashMap;
use std::fs::OpenOptions;
use std::io::{Seek, SeekFrom, Write};
use std::path::{Path, PathBuf};
use std::sync::Arc;
use std::sync::atomic::AtomicU64;
pub(crate) use core_support::{
EDGE_CLUSTER_PAGE_HEADER_SIZE, EDGE_CLUSTER_PAGE_MAGIC, PACKED_EDGE_PAGE_HEADER_SIZE,
PACKED_EDGE_PAGE_MAGIC, PACKED_EDGE_PAGE_SLOT_SIZE,
};
pub struct V3EdgeStore {
#[cfg(test)]
pub btree: Arc<parking_lot::RwLock<BTreeManager>>,
#[cfg(not(test))]
btree: Arc<parking_lot::RwLock<BTreeManager>>,
#[cfg(test)]
pub wal: Option<Arc<RwLock<WALWriter>>>,
#[cfg(not(test))]
wal: Option<Arc<RwLock<WALWriter>>>,
cache: Arc<RwLock<HashMap<(i64, Direction), Arc<[i64]>>>>,
cache_weighted: Arc<RwLock<HashMap<(i64, Direction), Arc<[(i64, f32)]>>>>,
edge_types: Arc<RwLock<HashMap<(i64, i64, Direction), String>>>,
cache_hits: AtomicU64,
cache_misses: AtomicU64,
hit_time_ns: AtomicU64,
miss_time_ns: AtomicU64,
#[cfg(test)]
pub dirty_clusters: RwLock<HashMap<(i64, Direction), V3EdgeCluster>>,
#[cfg(not(test))]
dirty_clusters: RwLock<HashMap<(i64, Direction), V3EdgeCluster>>,
db_path: Option<PathBuf>,
allocator: Arc<RwLock<PageAllocator>>,
page_size: u32,
file_coordinator: Option<Arc<FileCoordinator>>,
}
#[cfg(test)]
#[path = "edge_compat_tests.rs"]
mod tests;