block-db 0.2.0

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

use crate::{data_file::DataFile, error::Error};
use std::io::SeekFrom;
use tokio::io::{AsyncReadExt, AsyncSeekExt, AsyncWriteExt};

impl DataFile {
    pub async fn seek(&mut self, offset: usize) -> Result<(), Error> {
        self.file.seek(SeekFrom::Start(offset as u64)).await?;

        Ok(())
    }

    pub async fn flush(&mut self) -> Result<(), Error> {
        self.file.flush().await?;

        Ok(())
    }

    pub async fn truncate(&mut self, length: usize) -> Result<(), Error> {
        self.file.set_len(length as u64).await?;

        Ok(())
    }

    pub async fn read_chunk(&mut self, offset: usize, padding: usize) -> Result<Vec<u8>, Error> {
        self.seek(offset).await?;

        let mut buffer = vec![0; self.options_store.chunk_size() - padding];
        self.file.read_exact(&mut buffer).await?;

        Ok(buffer)
    }

    pub async fn read_chunk_with_padding(&mut self, offset: usize) -> Result<Vec<u8>, Error> {
        self.seek(offset).await?;

        let mut buffer = vec![0; self.options_store.chunk_size()];
        self.file.read_exact(&mut buffer).await?;

        Ok(buffer)
    }

    pub async fn write_chunk(&mut self, offset: usize, chunk: &[u8]) -> Result<(), Error> {
        self.seek(offset).await?;
        self.file.write_all(chunk).await?;

        Ok(())
    }
}