quill_sql/storage/codec/
meta_page.rs

1use crate::error::QuillSQLResult;
2use crate::storage::codec::{CommonCodec, DecodedData};
3use crate::storage::page::MetaPage;
4
5pub struct MetaPageCodec;
6
7impl MetaPageCodec {
8    pub fn encode(page: &MetaPage) -> Vec<u8> {
9        let mut bytes = Vec::new();
10        bytes.extend(CommonCodec::encode_u32(page.major_version));
11        bytes.extend(CommonCodec::encode_u32(page.minor_version));
12        bytes.extend(CommonCodec::encode_u32(page.freelist_page_id));
13        bytes.extend(CommonCodec::encode_u32(
14            page.information_schema_schemas_first_page_id,
15        ));
16        bytes.extend(CommonCodec::encode_u32(
17            page.information_schema_tables_first_page_id,
18        ));
19        bytes.extend(CommonCodec::encode_u32(
20            page.information_schema_columns_first_page_id,
21        ));
22        bytes.extend(CommonCodec::encode_u32(
23            page.information_schema_indexes_first_page_id,
24        ));
25        bytes
26    }
27
28    pub fn decode(bytes: &[u8]) -> QuillSQLResult<DecodedData<MetaPage>> {
29        let mut left_bytes = bytes;
30
31        let (major_version, offset) = CommonCodec::decode_u32(left_bytes)?;
32        left_bytes = &left_bytes[offset..];
33        let (minor_version, offset) = CommonCodec::decode_u32(left_bytes)?;
34        left_bytes = &left_bytes[offset..];
35        let (freelist_page_id, offset) = CommonCodec::decode_u32(left_bytes)?;
36        left_bytes = &left_bytes[offset..];
37        let (information_schema_schemas_first_page_id, offset) =
38            CommonCodec::decode_u32(left_bytes)?;
39        left_bytes = &left_bytes[offset..];
40        let (information_schema_tables_first_page_id, offset) =
41            CommonCodec::decode_u32(left_bytes)?;
42        left_bytes = &left_bytes[offset..];
43        let (information_schema_columns_first_page_id, offset) =
44            CommonCodec::decode_u32(left_bytes)?;
45        left_bytes = &left_bytes[offset..];
46        let (information_schema_indexes_first_page_id, offset) =
47            CommonCodec::decode_u32(left_bytes)?;
48        left_bytes = &left_bytes[offset..];
49
50        Ok((
51            MetaPage {
52                major_version,
53                minor_version,
54                freelist_page_id,
55                information_schema_schemas_first_page_id,
56                information_schema_tables_first_page_id,
57                information_schema_columns_first_page_id,
58                information_schema_indexes_first_page_id,
59            },
60            bytes.len() - left_bytes.len(),
61        ))
62    }
63}
64
65#[cfg(test)]
66mod tests {
67    use crate::storage::codec::MetaPageCodec;
68    use crate::storage::page::MetaPage;
69
70    #[test]
71    fn meta_page_codec() {
72        let page = MetaPage::try_new().unwrap();
73        let (new_page, _) = MetaPageCodec::decode(&MetaPageCodec::encode(&page)).unwrap();
74        assert_eq!(page, new_page);
75    }
76}