mod data;
mod header;
mod index;
mod space_info;
mod ty;
mod util;
use data_bucket_codegen::SizeMeasure;
use derive_more::{Display, From, Into};
use rkyv::{Archive, Deserialize, Serialize};
use crate::{align, SizeMeasurable};
pub use data::DataPage;
pub use header::{GeneralHeader, DATA_VERSION};
pub use index::{
get_index_page_size_from_data_length, IndexPage, IndexPageUtility, IndexValue,
TableOfContentsPage, UnsizedIndexPage, UnsizedIndexPageUtility,
};
pub use space_info::{Interval, SpaceInfoPage};
pub use ty::PageType;
pub use util::{
map_data_pages_to_general, parse_data_page, parse_data_pages_batch,
parse_general_header_by_index, parse_page, parse_pages_batch, parse_space_info, persist_page,
persist_pages_batch, seek_by_link, seek_to_page_start, update_at,
};
pub const PAGE_SIZE: usize = 4096 * 4;
pub const GENERAL_HEADER_SIZE: usize = 28;
pub const INNER_PAGE_SIZE: usize = PAGE_SIZE - GENERAL_HEADER_SIZE;
#[derive(
Archive,
Copy,
Clone,
Deserialize,
Debug,
Default,
Display,
Eq,
From,
Hash,
Into,
Ord,
PartialEq,
PartialOrd,
Serialize,
SizeMeasure,
)]
#[rkyv(derive(Debug, PartialOrd, PartialEq, Eq, Ord))]
pub struct PageId(u32);
impl PageId {
pub fn next(self) -> Self {
PageId(self.0 + 1)
}
pub fn is_empty(&self) -> bool {
self.0 == 0
}
}
impl From<PageId> for usize {
fn from(value: PageId) -> Self {
value.0 as usize
}
}
#[derive(
Archive, Copy, Clone, Deserialize, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize,
)]
pub struct GeneralPage<Inner> {
pub header: GeneralHeader,
pub inner: Inner,
}
#[cfg(test)]
mod tests {
use crate::page::ty::PageType;
use crate::page::{GeneralHeader, DATA_VERSION, GENERAL_HEADER_SIZE};
use crate::PAGE_SIZE;
fn get_general_header() -> GeneralHeader {
GeneralHeader {
data_version: DATA_VERSION,
page_id: 1.into(),
previous_id: 2.into(),
next_id: 4.into(),
page_type: PageType::Index,
space_id: 5.into(),
data_length: PAGE_SIZE as u32,
}
}
#[test]
fn general_header_length_valid() {
let header = get_general_header();
let bytes = rkyv::to_bytes::<rkyv::rancor::Error>(&header).unwrap();
assert_eq!(bytes.len(), GENERAL_HEADER_SIZE)
}
}