quill_sql/storage/codec/
meta_page.rs1use 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}