storage_manager/backend/disk/
disk_manager.rs

1use std::fs::File;
2use std::io::{self, Error, ErrorKind, Read, Seek, SeekFrom, Write};
3
4use crate::page::{PAGE_SIZE, Page, init_page};
5use crate::table::page_count;
6
7// Create a new page on disk and return its page number
8pub fn create_page(file: &mut File) -> io::Result<u32> {
9    // Create a zeroed page buffer
10    let mut page = Page::new();
11
12    // Initialize page header (lower & upper pointers)
13    init_page(&mut page);
14
15    // Read current number of pages from table header
16    let mut page_count = page_count(file)?;
17
18    // New page ID is the current page count
19    let page_num = page_count;
20
21    // Append page at the end of the file
22    file.seek(SeekFrom::End(0))?;
23    file.write_all(&page.data)?;
24
25    // Update page count in table header (page 0)
26    page_count += 1;
27    file.seek(SeekFrom::Start(0))?;
28    file.write_all(&page_count.to_le_bytes())?;
29
30    Ok(page_num)
31}
32
33// Read a page from disk into the provided page buffer
34pub fn read_page(file: &mut File, page: &mut Page, page_num: u32) -> io::Result<()> {
35    // Calculate byte offset for the page
36    let offset = page_num * PAGE_SIZE as u32;
37
38    // Get total file size
39    let file_size = file.metadata()?.len();
40
41    // Validate page existence
42    if offset > file_size as u32 {
43        return Err(Error::new(
44            ErrorKind::UnexpectedEof,
45            format!("Page {} does not exist in the file", page_num),
46        ));
47    }
48
49    // Seek to page offset
50    file.seek(SeekFrom::Start(offset as u64))?;
51
52    // Read full page data
53    file.read_exact(&mut page.data)?;
54
55    Ok(())
56}
57
58// Write a page buffer to disk at the given page number
59pub fn write_page(file: &mut File, page: &mut Page, page_num: u32) -> io::Result<()> {
60    // Calculate byte offset for the page
61    let offset = page_num as u64 * PAGE_SIZE as u64;
62
63    // Get total file size
64    let file_size = file.metadata()?.len();
65
66    // Validate page existence
67    if offset > file_size {
68        return Err(Error::new(
69            ErrorKind::UnexpectedEof,
70            format!("Page {} does not exist in the file", page_num),
71        ));
72    }
73
74    // Seek to page offset
75    file.seek(SeekFrom::Start(offset))?;
76
77    // Write page data to disk
78    file.write_all(&page.data)?;
79
80    Ok(())
81}