block-db 0.2.0

Local, multi-threaded, durable byte DB.
Documentation
// Authors: Robert Lopez

use super::{data_block::DataBlock, DataFile};
use crate::error::Error;

impl DataFile {
    pub async fn read(&mut self, id: &str) -> Result<Option<Vec<u8>>, Error> {
        if let Some(data_block) = self.data_blocks.get(id).cloned() {
            let DataBlock {
                padding,
                chunk_offsets,
            } = data_block;

            let mut bytes = Vec::with_capacity(
                (chunk_offsets.len() * self.options_store.chunk_size()) - padding,
            );

            for (index, chunk_offset) in chunk_offsets.iter().enumerate() {
                bytes.append(
                    &mut self
                        .read_chunk(
                            *chunk_offset,
                            if index == chunk_offsets.len() - 1 {
                                padding
                            } else {
                                0
                            },
                        )
                        .await?,
                );
            }

            return Ok(Some(bytes));
        }

        Ok(None)
    }
}