From a6e1870b2bb1b4f447561ab8f1e6341e197e0bb2 Mon Sep 17 00:00:00 2001 From: Ming-Hung Tsai Date: Fri, 14 May 2021 21:21:18 +0800 Subject: [PATCH] [array (rust)] Implement Pack for restoration --- src/pdata/array.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/pdata/array.rs b/src/pdata/array.rs index f459d1f..0485d2a 100644 --- a/src/pdata/array.rs +++ b/src/pdata/array.rs @@ -1,3 +1,4 @@ +use byteorder::{LittleEndian, WriteBytesExt}; use nom::{multi::count, number::complete::*, IResult}; use std::fmt; use thiserror::Error; @@ -5,7 +6,7 @@ use thiserror::Error; use crate::checksum; use crate::io_engine::BLOCK_SIZE; use crate::pdata::btree; -use crate::pdata::unpack::Unpack; +use crate::pdata::unpack::{Pack, Unpack}; //------------------------------------------ @@ -44,11 +45,31 @@ impl Unpack for ArrayBlockHeader { } } +impl Pack for ArrayBlockHeader { + fn pack(&self, w: &mut W) -> anyhow::Result<()> { + // csum needs to be calculated right for the whole metadata block. + w.write_u32::(0)?; + w.write_u32::(self.max_entries)?; + w.write_u32::(self.nr_entries)?; + w.write_u32::(self.value_size)?; + w.write_u64::(self.blocknr)?; + Ok(()) + } +} + +//------------------------------------------ + pub struct ArrayBlock { pub header: ArrayBlockHeader, pub values: Vec, } +impl ArrayBlock { + pub fn set_block(&mut self, b: u64) { + self.header.blocknr = b; + } +} + //------------------------------------------ #[derive(Error, Clone, Debug)]