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::>(); 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(()) }