98 lines
3.3 KiB
Rust
98 lines
3.3 KiB
Rust
use radixtree::RadixTree;
|
|
use std::path::PathBuf;
|
|
|
|
fn main() -> Result<(), radixtree::Error> {
|
|
// Create a temporary directory for the database
|
|
let db_path = std::env::temp_dir().join("radixtree_prefix_example");
|
|
std::fs::create_dir_all(&db_path)?;
|
|
|
|
println!("Creating radix tree at: {}", db_path.display());
|
|
|
|
// Create a new radix tree
|
|
let mut tree = RadixTree::new(db_path.to_str().unwrap(), true)?;
|
|
|
|
// Store data with common prefixes
|
|
println!("Storing data with common prefixes...");
|
|
|
|
// User data
|
|
tree.set("user:1:name", b"Alice".to_vec())?;
|
|
tree.set("user:1:email", b"alice@example.com".to_vec())?;
|
|
tree.set("user:2:name", b"Bob".to_vec())?;
|
|
tree.set("user:2:email", b"bob@example.com".to_vec())?;
|
|
|
|
// Post data
|
|
tree.set("post:1:title", b"First Post".to_vec())?;
|
|
tree.set("post:1:content", b"Hello World!".to_vec())?;
|
|
tree.set("post:2:title", b"Second Post".to_vec())?;
|
|
tree.set("post:2:content", b"Another post content".to_vec())?;
|
|
|
|
// Demonstrate listing keys with a prefix
|
|
println!("\nListing keys with prefix 'user:1:'");
|
|
let user1_keys = tree.list("user:1:")?;
|
|
for key in &user1_keys {
|
|
println!(" Key: {}", key);
|
|
}
|
|
|
|
println!("\nListing keys with prefix 'post:'");
|
|
let post_keys = tree.list("post:")?;
|
|
for key in &post_keys {
|
|
println!(" Key: {}", key);
|
|
}
|
|
|
|
// Demonstrate getting all values with a prefix
|
|
println!("\nGetting all values with prefix 'user:1:'");
|
|
let user1_values = tree.getall("user:1:")?;
|
|
for (i, value) in user1_values.iter().enumerate() {
|
|
println!(" Value {}: {}", i + 1, String::from_utf8_lossy(value));
|
|
}
|
|
|
|
// Demonstrate finding all user names
|
|
println!("\nFinding all user names (prefix 'user:*:name')");
|
|
let mut user_names = Vec::new();
|
|
let all_keys = tree.list("user:")?;
|
|
for key in all_keys {
|
|
if key.ends_with(":name") {
|
|
if let Ok(value) = tree.get(&key) {
|
|
user_names.push((key, String::from_utf8_lossy(&value).to_string()));
|
|
}
|
|
}
|
|
}
|
|
|
|
for (key, name) in user_names {
|
|
println!(" {}: {}", key, name);
|
|
}
|
|
|
|
// Demonstrate updating values with a specific prefix
|
|
println!("\nUpdating all post titles...");
|
|
let post_title_keys = tree.list("post:")?.into_iter().filter(|k| k.ends_with(":title")).collect::<Vec<_>>();
|
|
|
|
for key in post_title_keys {
|
|
let old_value = tree.get(&key)?;
|
|
let old_title = String::from_utf8_lossy(&old_value);
|
|
let new_title = format!("UPDATED: {}", old_title);
|
|
|
|
println!(" Updating '{}' to '{}'", old_title, new_title);
|
|
tree.update(&key, new_title.as_bytes().to_vec())?;
|
|
}
|
|
|
|
// Verify updates
|
|
println!("\nVerifying updates:");
|
|
let post_keys = tree.list("post:")?;
|
|
for key in post_keys {
|
|
if key.ends_with(":title") {
|
|
let value = tree.get(&key)?;
|
|
println!(" {}: {}", key, String::from_utf8_lossy(&value));
|
|
}
|
|
}
|
|
|
|
// Clean up (optional)
|
|
if std::env::var("KEEP_DB").is_err() {
|
|
std::fs::remove_dir_all(&db_path)?;
|
|
println!("\nCleaned up database directory");
|
|
} else {
|
|
println!("\nDatabase kept at: {}", db_path.display());
|
|
}
|
|
|
|
Ok(())
|
|
}
|