small_db/btree/page/
base_page.rs

1use super::{BTreePage, BTreePageID, PageCategory};
2use crate::btree::{page_cache::PageCache, tuple::Schema};
3
4const EMPTY_PAGE_TOKEN: [u8; 4] = [55, 55, 55, 55];
5
6pub struct BTreeBasePage {
7    pid: BTreePageID,
8    parent_page_index: u32,
9}
10
11impl BTreeBasePage {
12    pub fn new(pid: &BTreePageID) -> BTreeBasePage {
13        BTreeBasePage {
14            pid: pid.clone(),
15            parent_page_index: 0,
16        }
17    }
18
19    /// Static method to generate a byte array corresponding to an
20    /// empty BTreePage.
21    ///
22    /// Used to add new, empty pages to the file.
23    ///
24    /// Passing the results of this method to the following
25    /// constructors will create a BTreePage with no valid entries
26    /// in it.
27    /// - `BTreeInternalPage`
28    /// - `BTreeLeafPage`
29    pub fn empty_page_data() -> Vec<u8> {
30        let mut data: Vec<u8> = vec![0; PageCache::get_page_size()];
31
32        // write the empty page token to the first 4 bytes of the page
33        data[0..4].copy_from_slice(&EMPTY_PAGE_TOKEN);
34
35        data
36    }
37
38    pub fn is_empty_page(bytes: &[u8]) -> bool {
39        bytes[0..4] == EMPTY_PAGE_TOKEN
40    }
41}
42
43impl BTreePage for BTreeBasePage {
44    fn new(
45        pid: &BTreePageID,
46        _bytes: &[u8],
47        _tuple_scheme: &Schema,
48        _key_field: usize,
49    ) -> Self {
50        Self::new(pid)
51    }
52
53    fn get_pid(&self) -> BTreePageID {
54        self.pid
55    }
56
57    fn get_parent_pid(&self) -> BTreePageID {
58        let category: PageCategory;
59        if self.parent_page_index == 0 {
60            category = PageCategory::RootPointer;
61        } else {
62            category = PageCategory::Internal;
63        }
64        BTreePageID::new(
65            category,
66            self.pid.get_table_id(),
67            self.parent_page_index,
68        )
69    }
70
71    fn set_parent_pid(&mut self, pid: &BTreePageID) {
72        self.parent_page_index = pid.page_index;
73    }
74
75    fn get_page_data(&self) -> Vec<u8> {
76        unimplemented!()
77    }
78
79    fn set_before_image(&mut self) {
80        unimplemented!()
81    }
82
83    fn get_before_image(&self) -> Vec<u8> {
84        unimplemented!()
85    }
86
87    fn peek(&self) {
88        unimplemented!()
89    }
90}