use std::time::Duration;
use solistore::{Db, Direction, Durability, IteratorMode, Options, WriteBatch};
fn main() -> solistore::Result<()> {
let dir = tempfile::tempdir()?;
let db = Db::open(
dir.path(),
Options {
durability: Durability::Eventual {
sync_interval: Duration::from_millis(100),
},
..Options::default()
},
)?;
let users = db.create_cf("users")?;
let index = db.create_cf("users_by_email")?;
let mut batch = WriteBatch::new();
batch.put(
&users,
b"u:1",
br#"{"name":"Ada","email":"ada@example.com"}"#,
);
batch.put(&index, b"ada@example.com", b"u:1");
batch.put(
&users,
b"u:2",
br#"{"name":"Linus","email":"linus@example.com"}"#,
);
batch.put(&index, b"linus@example.com", b"u:2");
db.write(batch)?;
let id = db.get(&index, b"ada@example.com")?.expect("indexed");
assert_eq!(&id[..], b"u:1");
for item in db.iterator(&users, IteratorMode::From(b"u:", Direction::Forward))? {
let (key, value) = item?;
println!(
"{} = {}",
String::from_utf8_lossy(&key),
String::from_utf8_lossy(&value)
);
}
let mut batch = WriteBatch::new();
batch.delete_range(&users, b"u:", b"u;");
db.write(batch)?;
assert!(db.get(&users, b"u:1")?.is_none());
db.checkpoint(dir.path().join("backup"))?;
Ok(())
}