in crates/core/src/file_group/log_file/reader.rs [162:195]
fn read_block_metadata(
&mut self,
metadata_type: BlockMetadataType,
format_version: &LogFormatVersion,
) -> Result<HashMap<BlockMetadataKey, String>> {
match metadata_type {
BlockMetadataType::Header if !format_version.has_header() => {
return Ok(HashMap::new());
}
BlockMetadataType::Footer if !format_version.has_footer() => {
return Ok(HashMap::new());
}
_ => {}
}
let mut num_entries_buf = [0u8; 4];
self.reader.read_exact(&mut num_entries_buf)?;
let num_entries = u32::from_be_bytes(num_entries_buf);
let mut metadata: HashMap<BlockMetadataKey, String> =
HashMap::with_capacity(num_entries as usize);
for _ in 0..num_entries {
let mut key_buf = [0u8; 4];
self.reader.read_exact(&mut key_buf)?;
let key = BlockMetadataKey::try_from(key_buf)?;
let mut value_len_buf = [0u8; 4];
self.reader.read_exact(&mut value_len_buf)?;
let value_len = u32::from_be_bytes(value_len_buf);
let mut value_buf = vec![0u8; value_len as usize];
self.reader.read_exact(&mut value_buf)?;
let value =
String::from_utf8(value_buf).map_err(|e| CoreError::Utf8Error(e.utf8_error()))?;
metadata.insert(key, value);
}
Ok(metadata)
}