storage_manager/backend/page/
mod.rs

1// Page size in bytes (8 KB)
2pub const PAGE_SIZE: usize = 8192;
3
4// Page header size: stores lower & upper pointers
5pub const PAGE_HEADER_SIZE: u32 = 8;
6
7// Size of one item slot
8pub const ITEM_ID_SIZE: u32 = 8;
9
10// Represents a single database page
11pub struct Page {
12    // Raw page bytes
13    pub data: Vec<u8>,
14}
15
16impl Page {
17    // Create an empty page
18    pub fn new() -> Self {
19        Self {
20            data: vec![0; PAGE_SIZE],
21        }
22    }
23}
24
25// Initialize page header pointers
26pub fn init_page(page: &mut Page) {
27    // Lower starts after header
28    page.data[0..4].copy_from_slice(&PAGE_HEADER_SIZE.to_le_bytes());
29
30    // Upper starts at page end
31    page.data[4..8].copy_from_slice(&(PAGE_SIZE as u32).to_le_bytes());
32}
33
34// Return available free space in the page
35pub fn page_free_space(page: &Page) -> std::io::Result<u32> {
36    let lower = u32::from_le_bytes(page.data[0..4].try_into().unwrap());
37    let upper = u32::from_le_bytes(page.data[4..8].try_into().unwrap());
38    Ok(upper - lower)
39}