use std::cmp::Ordering;
use std::error::Error;
use std::str;
use heed::EnvOpenOptions;
use heed_traits::Comparator;
use heed_types::{Str, Unit};
enum StringAsIntCmp {}
impl Comparator for StringAsIntCmp {
fn compare(a: &[u8], b: &[u8]) -> Ordering {
let a: i32 = str::from_utf8(a).unwrap().parse().unwrap();
let b: i32 = str::from_utf8(b).unwrap().parse().unwrap();
a.cmp(&b)
}
}
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 = env
.database_options()
.types::<Str, Unit>()
.key_comparator::<StringAsIntCmp>()
.create(&mut wtxn)?;
wtxn.commit()?;
let mut wtxn = env.write_txn()?;
db.put(&mut wtxn, "-100000", &())?;
db.put(&mut wtxn, "-10000", &())?;
db.put(&mut wtxn, "-1000", &())?;
db.put(&mut wtxn, "-100", &())?;
db.put(&mut wtxn, "100", &())?;
let mut iter = db.iter(&wtxn)?;
assert_eq!(iter.next().transpose()?, Some(("-100000", ())));
assert_eq!(iter.next().transpose()?, Some(("-10000", ())));
assert_eq!(iter.next().transpose()?, Some(("-1000", ())));
assert_eq!(iter.next().transpose()?, Some(("-100", ())));
assert_eq!(iter.next().transpose()?, Some(("100", ())));
drop(iter);
Ok(())
}