From 1867d1af22c5753175730a1738612d1b9e67fc61 Mon Sep 17 00:00:00 2001 From: Christopher Hotchkiss Date: Fri, 24 Sep 2021 14:29:09 -0400 Subject: [PATCH] Pusing up the first page code --- src/engine/io/index_formats.rs | 4 ++ .../io/index_formats/btree_first_page.rs | 57 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/engine/io/index_formats/btree_first_page.rs diff --git a/src/engine/io/index_formats.rs b/src/engine/io/index_formats.rs index 1a4eb5b..e918227 100644 --- a/src/engine/io/index_formats.rs +++ b/src/engine/io/index_formats.rs @@ -6,6 +6,10 @@ mod btree_branch; pub use btree_branch::BTreeBranch; pub use btree_branch::BTreeBranchError; +mod btree_first_page; +pub use btree_first_page::BTreeFirstPage; +pub use btree_first_page::BTreeFirstPageError; + mod btree_leaf; pub use btree_leaf::BTreeLeaf; pub use btree_leaf::BTreeLeafError; diff --git a/src/engine/io/index_formats/btree_first_page.rs b/src/engine/io/index_formats/btree_first_page.rs new file mode 100644 index 0000000..c5eba72 --- /dev/null +++ b/src/engine/io/index_formats/btree_first_page.rs @@ -0,0 +1,57 @@ +use crate::engine::io::{ + format_traits::{Parseable, Serializable}, + page_formats::{PageOffset, PageOffsetError}, +}; +use bytes::BufMut; +use thiserror::Error; + +/// Special page that points to where the root page of the index is really located +#[derive(Debug, PartialEq)] +pub struct BTreeFirstPage { + pub root_offset: PageOffset, +} + +impl Parseable for BTreeFirstPage { + type Output = Self; + fn parse(buffer: &mut impl bytes::Buf) -> Result { + let root_offset = PageOffset::parse(buffer)?; + Ok(BTreeFirstPage { root_offset }) + } +} + +impl Serializable for BTreeFirstPage { + fn serialize(&self, buffer: &mut impl BufMut) { + self.root_offset.serialize(buffer); + } +} + +#[derive(Debug, Error)] +pub enum BTreeFirstPageError { + #[error(transparent)] + PageOffsetError(#[from] PageOffsetError), +} + +#[cfg(test)] +mod tests { + use bytes::BytesMut; + + use crate::constants::PAGE_SIZE; + + use super::*; + + #[test] + fn test_roundtrip() -> Result<(), Box> { + let first = BTreeFirstPage { + root_offset: PageOffset(1), + }; + + let mut buffer = BytesMut::with_capacity(PAGE_SIZE as usize); + first.serialize(&mut buffer); + + let result = BTreeFirstPage::parse(&mut buffer)?; + + assert_eq!(first, result); + + Ok(()) + } +}