mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			76 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
// Any copyright is dedicated to the Public Domain.
 | 
						|
// http://creativecommons.org/publicdomain/zero/1.0/
 | 
						|
 | 
						|
//! A demo that showcases the basic usage of iterators in rkv.
 | 
						|
//!
 | 
						|
//! You can test this out by running:
 | 
						|
//!
 | 
						|
//!     cargo run --example iterator
 | 
						|
 | 
						|
use std::{fs, str};
 | 
						|
 | 
						|
use tempfile::Builder;
 | 
						|
 | 
						|
use rkv::{
 | 
						|
    backend::{SafeMode, SafeModeDatabase, SafeModeEnvironment},
 | 
						|
    Manager, Rkv, SingleStore, StoreError, StoreOptions, Value,
 | 
						|
};
 | 
						|
 | 
						|
fn main() {
 | 
						|
    let root = Builder::new().prefix("iterator").tempdir().unwrap();
 | 
						|
    fs::create_dir_all(root.path()).unwrap();
 | 
						|
    let p = root.path();
 | 
						|
 | 
						|
    let mut manager = Manager::<SafeModeEnvironment>::singleton().write().unwrap();
 | 
						|
    let created_arc = manager.get_or_create(p, Rkv::new::<SafeMode>).unwrap();
 | 
						|
    let k = created_arc.read().unwrap();
 | 
						|
    let store = k.open_single("store", StoreOptions::create()).unwrap();
 | 
						|
 | 
						|
    populate_store(&k, store).unwrap();
 | 
						|
 | 
						|
    let reader = k.read().unwrap();
 | 
						|
 | 
						|
    println!("Iterating from the beginning...");
 | 
						|
    // Reader::iter_start() iterates from the first item in the store, and
 | 
						|
    // returns the (key, value) tuples in order.
 | 
						|
    let mut iter = store.iter_start(&reader).unwrap();
 | 
						|
    while let Some(Ok((country, city))) = iter.next() {
 | 
						|
        let country = str::from_utf8(country).unwrap();
 | 
						|
        println!("{country}, {city:?}");
 | 
						|
    }
 | 
						|
 | 
						|
    println!();
 | 
						|
    println!("Iterating from the given key...");
 | 
						|
    // Reader::iter_from() iterates from the first key equal to or greater
 | 
						|
    // than the given key.
 | 
						|
    let mut iter = store.iter_from(&reader, "Japan").unwrap();
 | 
						|
    while let Some(Ok((country, city))) = iter.next() {
 | 
						|
        println!("{}, {city:?}", str::from_utf8(country).unwrap());
 | 
						|
    }
 | 
						|
 | 
						|
    println!();
 | 
						|
    println!("Iterating from the given prefix...");
 | 
						|
    let mut iter = store.iter_from(&reader, "Un").unwrap();
 | 
						|
    while let Some(Ok((country, city))) = iter.next() {
 | 
						|
        println!("{}, {city:?}", str::from_utf8(country).unwrap());
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
fn populate_store(
 | 
						|
    k: &Rkv<SafeModeEnvironment>,
 | 
						|
    store: SingleStore<SafeModeDatabase>,
 | 
						|
) -> Result<(), StoreError> {
 | 
						|
    let mut writer = k.write()?;
 | 
						|
    for (country, city) in vec![
 | 
						|
        ("Canada", Value::Str("Ottawa")),
 | 
						|
        ("United States of America", Value::Str("Washington")),
 | 
						|
        ("Germany", Value::Str("Berlin")),
 | 
						|
        ("France", Value::Str("Paris")),
 | 
						|
        ("Italy", Value::Str("Rome")),
 | 
						|
        ("United Kingdom", Value::Str("London")),
 | 
						|
        ("Japan", Value::Str("Tokyo")),
 | 
						|
    ] {
 | 
						|
        store.put(&mut writer, country, &city)?;
 | 
						|
    }
 | 
						|
    writer.commit()
 | 
						|
}
 |