storage_manager/backend/disk/
disk_manager.rs1use 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
7pub fn create_page(file: &mut File) -> io::Result<u32> {
9 let mut page = Page::new();
11
12 init_page(&mut page);
14
15 let mut page_count = page_count(file)?;
17
18 let page_num = page_count;
20
21 file.seek(SeekFrom::End(0))?;
23 file.write_all(&page.data)?;
24
25 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
33pub fn read_page(file: &mut File, page: &mut Page, page_num: u32) -> io::Result<()> {
35 let offset = page_num * PAGE_SIZE as u32;
37
38 let file_size = file.metadata()?.len();
40
41 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 file.seek(SeekFrom::Start(offset as u64))?;
51
52 file.read_exact(&mut page.data)?;
54
55 Ok(())
56}
57
58pub fn write_page(file: &mut File, page: &mut Page, page_num: u32) -> io::Result<()> {
60 let offset = page_num as u64 * PAGE_SIZE as u64;
62
63 let file_size = file.metadata()?.len();
65
66 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 file.seek(SeekFrom::Start(offset))?;
76
77 file.write_all(&page.data)?;
79
80 Ok(())
81}