rollblock 0.4.1

A super-fast, block-oriented and rollbackable key-value store.
Documentation
use heed::types::{Bytes, Str};
use heed::Database;

use crate::error::StoreResult;
use crate::runtime::orchestrator::DurabilityMode;

pub(super) fn load_mode(
    env: &heed::Env,
    config_db: &Database<Str, Bytes>,
    key: &str,
) -> StoreResult<Option<DurabilityMode>> {
    let txn = env.read_txn()?;
    if let Some(bytes) = config_db.get(&txn, key)? {
        Ok(Some(bincode::deserialize(bytes)?))
    } else {
        Ok(None)
    }
}

pub(super) fn store_mode(
    env: &heed::Env,
    config_db: &Database<Str, Bytes>,
    key: &str,
    mode: &DurabilityMode,
) -> StoreResult<()> {
    let mut txn = env.write_txn()?;
    let bytes = bincode::serialize(mode)?;
    config_db.put(&mut txn, key, &bytes)?;
    txn.commit()?;
    Ok(())
}

pub(super) fn load_map_size(
    env: &heed::Env,
    config_db: &Database<Str, Bytes>,
    key: &str,
) -> StoreResult<Option<usize>> {
    let txn = env.read_txn()?;
    if let Some(bytes) = config_db.get(&txn, key)? {
        let stored: u64 = bincode::deserialize(bytes)?;
        Ok(Some(stored as usize))
    } else {
        Ok(None)
    }
}

pub(super) fn store_map_size(
    env: &heed::Env,
    config_db: &Database<Str, Bytes>,
    key: &str,
    map_size: usize,
) -> StoreResult<()> {
    let mut txn = env.write_txn()?;
    let encoded = bincode::serialize(&(map_size as u64))?;
    config_db.put(&mut txn, key, &encoded)?;
    txn.commit()?;
    Ok(())
}

pub(super) fn ensure_map_size(
    env: &heed::Env,
    config_db: &Database<Str, Bytes>,
    key: &str,
    map_size: usize,
) -> StoreResult<()> {
    if let Some(stored) = load_map_size(env, config_db, key)? {
        if stored == map_size {
            return Ok(());
        }
    }
    store_map_size(env, config_db, key, map_size)
}