use holt::TreeBuilder;
fn session_key(user_id: u64, session_id: &str) -> Vec<u8> {
let mut k = format!("u{user_id:016x}/").into_bytes();
k.extend_from_slice(session_id.as_bytes());
k
}
fn main() {
println!("=== holt session_store example ===\n");
let tree = TreeBuilder::new("scratch").memory().open().expect("open");
let rows: &[(u64, &str, &str)] = &[
(1, "abc123", "last_seen=1715817600 ip=10.0.0.1 ua=Chrome"),
(1, "def456", "last_seen=1715818000 ip=10.0.0.2 ua=Safari"),
(2, "ghi789", "last_seen=1715819000 ip=10.0.0.5 ua=Firefox"),
(2, "jkl012", "last_seen=1715819100 ip=10.0.0.6 ua=Chrome"),
(3, "mno345", "last_seen=1715819200 ip=10.0.0.9 ua=Edge"),
];
for (user, sid, state) in rows {
tree.put(&session_key(*user, sid), state.as_bytes())
.unwrap();
}
println!("seeded {} sessions across 3 users", rows.len());
let touched_state = b"last_seen=1715820000 ip=10.0.0.2 ua=Safari";
tree.put(&session_key(1, "def456"), touched_state).unwrap();
println!(
"touched session 1/def456 -> {:?}",
std::str::from_utf8(touched_state).unwrap(),
);
let s = tree
.get(&session_key(2, "ghi789"))
.unwrap()
.expect("present");
println!("lookup 2/ghi789 -> {:?}", std::str::from_utf8(&s).unwrap(),);
let prev = tree.remove(&session_key(1, "abc123")).unwrap();
println!(
"revoked 1/abc123 -> previous = {:?}",
prev.as_deref().map(String::from_utf8_lossy),
);
assert!(tree.get(&session_key(1, "abc123")).unwrap().is_none());
assert!(tree.get(&session_key(2, "ghi789")).unwrap().is_some());
tree.checkpoint().unwrap();
println!("\ndone");
}