Skip to main content

sync_quickstart/
sync_quickstart.rs

1use trine_kv::{Db, KeyRange, TransactionOptions, WriteBatch, WriteOptions};
2
3fn main() -> trine_kv::Result<()> {
4    let path =
5        std::env::temp_dir().join(format!("trine-kv-sync-quickstart-{}", std::process::id()));
6    if path.exists() {
7        std::fs::remove_dir_all(&path)?;
8    }
9
10    let db = Db::open_sync(&path)?;
11    let users = db.bucket_sync("users")?;
12
13    users.put_sync(b"user:001", b"Ada")?;
14
15    let mut batch = WriteBatch::new();
16    batch.put_bucket("users", b"user:002", b"Lin")?;
17    batch.put_bucket("users", b"team:core", b"database")?;
18    db.write_sync(batch, WriteOptions::default())?;
19
20    assert_eq!(users.get_sync(b"user:001")?, Some(b"Ada".to_vec()));
21
22    let snapshot = db.snapshot();
23    users.put_sync(b"user:003", b"Grace")?;
24    assert_eq!(snapshot.get_sync(&users, b"user:003")?, None);
25    assert_eq!(users.get_sync(b"user:003")?, Some(b"Grace".to_vec()));
26
27    let user_prefix_keys = users
28        .prefix_sync(b"user:")?
29        .map(|item| item.map(|key_value| display_key(&key_value.key)))
30        .collect::<trine_kv::Result<Vec<_>>>()?;
31    assert_eq!(user_prefix_keys, ["user:001", "user:002", "user:003"]);
32
33    let range = KeyRange::half_open(b"user:001", b"user:004");
34    let range_values = users
35        .range_sync(&range)?
36        .map(|item| item.map(|key_value| display_value(&key_value.value)))
37        .collect::<trine_kv::Result<Vec<_>>>()?;
38    assert_eq!(range_values, ["Ada", "Lin", "Grace"]);
39
40    let mut txn = db.transaction(TransactionOptions::default());
41    assert_eq!(
42        txn.get_bucket_sync("users", b"user:001")?,
43        Some(b"Ada".to_vec())
44    );
45    txn.put_bucket("users", b"user:004", b"Barbara")?;
46    txn.commit_sync()?;
47
48    db.flush_sync()?;
49    drop(users);
50    drop(snapshot);
51    drop(db);
52
53    let reopened = Db::open_sync(&path)?;
54    let users = reopened.bucket_sync("users")?;
55    assert_eq!(users.get_sync(b"user:004")?, Some(b"Barbara".to_vec()));
56
57    let stats = reopened.stats();
58    assert_eq!(stats.live_buckets, 2);
59    assert!(stats.total_tables > 0);
60
61    drop(users);
62    drop(reopened);
63    std::fs::remove_dir_all(path)?;
64    Ok(())
65}
66
67fn display_key(bytes: &[u8]) -> String {
68    String::from_utf8_lossy(bytes).into_owned()
69}
70
71fn display_value(bytes: &[u8]) -> String {
72    String::from_utf8_lossy(bytes).into_owned()
73}