tinkv 0.10.0

A fast and simple key-value storage engine.
Documentation
use pretty_env_logger;
use std::time;
use tinkv::{self, Store};

fn main() -> tinkv::Result<()> {
    pretty_env_logger::init_timed();
    let mut store = Store::open(".tinkv")?;

    let begin = time::Instant::now();

    const TOTAL_KEYS: usize = 100000;
    for i in 0..TOTAL_KEYS {
        let k = format!("key_{}", i);
        let v = format!(
            "value_{}_{}_hello_world_this_is_a_bad_day",
            i,
            tinkv::util::current_timestamp()
        );
        store.set(k.as_bytes(), v.as_bytes())?;
        store.set(k.as_bytes(), v.as_bytes())?;
    }

    let duration = time::Instant::now().duration_since(begin);
    let speed = (TOTAL_KEYS * 2) as f32 / duration.as_secs_f32();
    println!(
        "{} keys written in {} secs, {} keys/s",
        TOTAL_KEYS * 2,
        duration.as_secs_f32(),
        speed
    );

    println!("initial: {:?}", store.stats());

    let v = store.get("key_1".as_bytes())?.unwrap_or_default();
    println!("key_1 => {:?}", String::from_utf8_lossy(&v));

    store.set("hello".as_bytes(), "tinkv".as_bytes())?;
    println!("after set 1: {:?}", store.stats());

    store.set("hello".as_bytes(), "tinkv 2".as_bytes())?;
    println!("after set 2: {:?}", store.stats());

    store.set("hello 2".as_bytes(), "tinkv".as_bytes())?;
    println!("after set 3: {:?}", store.stats());

    let value = store.get("hello".as_bytes())?;
    assert_eq!(value, Some("tinkv 2".as_bytes().to_vec()));

    store.remove("hello".as_bytes())?;
    println!("after remove: {:?}", store.stats());

    let value_not_found = store.get("hello".as_bytes())?;
    assert_eq!(value_not_found, None);

    store.compact()?;
    println!("after compaction: {:?}", store.stats());

    let v = store.get("key_1".as_bytes())?.unwrap();
    println!("key_1 => {:?}", String::from_utf8_lossy(&v));

    Ok(())
}