vecdb 0.12.2

High-performance mutable persistent vectors built on rawdb
Documentation
use std::{collections::BTreeMap, path::PathBuf, sync::Arc};

use crate::{AnyStoredVec, Stamp, WritableVec};

use super::{MutableRawVec, MutableVec};

impl<V> WritableVec<V::I, V::T> for MutableVec<V>
where
    V: MutableRawVec,
{
    #[inline]
    fn push(&mut self, value: V::T) {
        self.vec.push(value)
    }

    #[inline]
    fn pushed(&self) -> &[V::T] {
        self.vec.pushed()
    }

    fn truncate_if_needed_at(&mut self, index: usize) -> crate::Result<()> {
        self.truncate_mutations_at(index);
        self.vec.truncate_if_needed_at(index)
    }

    fn reset(&mut self) -> crate::Result<()> {
        self.holes.clear();
        self.updated.clear();
        self.vec.reset()?;
        Ok(())
    }

    fn reset_unsaved(&mut self) {
        self.vec.reset_unsaved();
        *self.holes.current_mut() = Arc::clone(&self.published_holes.read());
        self.updated.current_mut().clear();
    }

    #[inline]
    fn is_dirty(&self) -> bool {
        self.vec.is_dirty() || self.holes_changed() || !self.current_updated().is_empty()
    }

    fn stamped_write_with_changes(&mut self, stamp: Stamp) -> crate::Result<()> {
        if self.vec.saved_stamped_changes() == 0 {
            return self.stamped_write(stamp);
        }

        let bytes = self.serialize_changes()?;
        self.vec.save_change_file(stamp, &bytes)?;
        self.update_stamp(stamp);
        self.write_inner(false)?;
        self.vec.save_previous();
        self.holes.save();
        self.updated.clear_previous();
        Ok(())
    }

    fn rollback(&mut self) -> crate::Result<()> {
        let bytes = self.vec.read_current_change_file()?;
        let (modifications, previous_holes) = V::parse_mutable_changes(&bytes)?;

        self.vec.rollback()?;
        self.truncate_mutations_at(self.vec.len());
        for (index, value) in modifications {
            self.update_value_at(index, value)?;
        }
        *self.holes.current_mut() = Arc::new(previous_holes);
        self.holes.save();
        self.updated.save();
        Ok(())
    }

    fn find_rollback_files(&self) -> crate::Result<BTreeMap<Stamp, PathBuf>> {
        self.vec.find_rollback_files()
    }

    fn save_rollback_state(&mut self) {
        self.vec.save_previous_for_rollback();
        self.holes.save();
        self.updated.save();
    }
}