vecdb 0.12.2

High-performance mutable persistent vectors built on rawdb
Documentation
use tempfile::tempdir;
use vecdb::{AnyStoredVec, BytesVec, Database, ImportableVec, MutableVec, Version, WritableVec};

#[test]
fn update_many_matches_individual_updates() -> vecdb::Result<()> {
    let directory = tempdir()?;
    let database = Database::open(directory.path())?;
    let mut vec =
        MutableVec::<BytesVec<usize, u32>>::forced_import(&database, "values", Version::ONE)?;
    for _ in 0..10 {
        vec.push(0);
    }
    vec.write()?;

    vec.delete(2);
    vec.delete(4);
    vec.update(1, 11)?;
    vec.push(100);
    vec.push(101);
    vec.update_many([(2, 20), (1, 10), (4, 40), (10, 110), (11, 111), (1, 12)])?;

    assert!(vec.holes().is_empty());
    assert_eq!(
        vec.collect_holed(),
        vec![
            Some(0),
            Some(12),
            Some(20),
            Some(0),
            Some(40),
            Some(0),
            Some(0),
            Some(0),
            Some(0),
            Some(0),
            Some(110),
            Some(111),
        ]
    );

    vec.write()?;
    assert_eq!(
        vec.collect_holed(),
        vec![
            Some(0),
            Some(12),
            Some(20),
            Some(0),
            Some(40),
            Some(0),
            Some(0),
            Some(0),
            Some(0),
            Some(0),
            Some(110),
            Some(111),
        ]
    );
    Ok(())
}

#[test]
fn update_many_rejects_the_whole_out_of_range_batch() -> vecdb::Result<()> {
    let directory = tempdir()?;
    let database = Database::open(directory.path())?;
    let mut vec =
        MutableVec::<BytesVec<usize, u32>>::forced_import(&database, "values", Version::ONE)?;
    vec.push(1);

    assert!(vec.update_many([(0, 2), (1, 3)]).is_err());
    assert_eq!(vec.collect_holed(), vec![Some(1)]);
    Ok(())
}