use std::error::Error;
use heed::types::*;
use heed::{Database, EnvFlags, EnvOpenOptions};
fn main() -> Result<(), Box<dyn Error>> {
let env_path = tempfile::tempdir()?;
let env = unsafe {
EnvOpenOptions::new()
.map_size(10 * 1024 * 1024) .max_dbs(3)
.open(&env_path)?
};
let mut wtxn = env.write_txn()?;
let db: Database<Str, Str> = env.create_database(&mut wtxn, None)?;
db.put(&mut wtxn, "I am here", "to test things")?;
db.put(&mut wtxn, "I am here too", "for the same purpose")?;
wtxn.commit()?;
env.prepare_for_closing().wait();
let env = unsafe {
EnvOpenOptions::new()
.map_size(10 * 1024 * 1024) .max_dbs(3)
.flags(EnvFlags::PREV_SNAPSHOT)
.open(&env_path)?
};
let mut wtxn = env.write_txn()?;
let db: Database<Str, Str> = env.create_database(&mut wtxn, None)?;
assert!(db.is_empty(&wtxn)?);
wtxn.abort();
env.prepare_for_closing().wait();
let env = unsafe {
EnvOpenOptions::new()
.map_size(10 * 1024 * 1024) .max_dbs(3)
.open(&env_path)?
};
let mut wtxn = env.write_txn()?;
let db: Database<Str, Str> = env.create_database(&mut wtxn, None)?;
assert_eq!(db.get(&wtxn, "I am here")?, Some("to test things"));
assert_eq!(db.get(&wtxn, "I am here too")?, Some("for the same purpose"));
db.put(&mut wtxn, "I will fade away", "I am so sad")?;
wtxn.commit()?;
env.prepare_for_closing().wait();
let env = unsafe {
EnvOpenOptions::new()
.map_size(10 * 1024 * 1024) .max_dbs(3)
.flags(EnvFlags::PREV_SNAPSHOT)
.open(&env_path)?
};
let rtxn = env.read_txn()?;
let db: Database<Str, Str> = env.open_database(&rtxn, None)?.unwrap();
assert_eq!(db.get(&rtxn, "I am here")?, Some("to test things"));
assert_eq!(db.get(&rtxn, "I am here too")?, Some("for the same purpose"));
assert_eq!(db.get(&rtxn, "I will fade away")?, None);
Ok(())
}