sync_quickstart/
sync_quickstart.rs1use 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}