ps-datalake 0.1.0-16

Encrypted flat storage
Documentation
use ps_mmap::{DerefError, WriteGuard};

use crate::error::{AlignmentError, OffsetError};

use super::{DataStore, DataStoreHeader, DataStoreIndex, DataStorePager};

#[derive(Debug)]
pub struct DataStoreWriteGuard {
    inner: WriteGuard,
}

impl DataStoreWriteGuard {
    #[inline]
    pub fn get_header(&mut self) -> Result<&mut DataStoreHeader, AlignmentError> {
        let ptr: *mut DataStoreHeader = self.inner.as_mut_ptr().cast();

        if !ptr.is_aligned() {
            return Err(AlignmentError);
        }

        Ok(unsafe { &mut *ptr })
    }

    #[inline]
    pub fn get_index(&mut self) -> Result<&mut DataStoreIndex<'_>, OffsetError> {
        Ok(unsafe {
            DataStoreIndex::at_offset_mut(
                self.inner.as_mut_ptr(),
                usize::try_from(self.get_header()?.index_offset)?,
            )
        })
    }

    #[inline]
    pub fn get_pager(&mut self) -> Result<&mut DataStorePager<'_>, OffsetError> {
        Ok(unsafe {
            DataStorePager::at_offset_mut(
                self.inner.as_mut_ptr(),
                usize::try_from(self.get_header()?.data_offset)?,
            )
        })
    }
}

impl From<WriteGuard> for DataStoreWriteGuard {
    fn from(inner: WriteGuard) -> Self {
        Self { inner }
    }
}

impl TryFrom<&DataStore<'_>> for DataStoreWriteGuard {
    type Error = DerefError;

    fn try_from(value: &DataStore) -> Result<Self, Self::Error> {
        Ok(value.mmap.try_write()?.into())
    }
}