summaryrefslogtreecommitdiffstats
path: root/third_party/rust/rkv/examples/iterator.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /third_party/rust/rkv/examples/iterator.rs
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/rkv/examples/iterator.rs')
-rw-r--r--third_party/rust/rkv/examples/iterator.rs76
1 files changed, 76 insertions, 0 deletions
diff --git a/third_party/rust/rkv/examples/iterator.rs b/third_party/rust/rkv/examples/iterator.rs
new file mode 100644
index 0000000000..445dc37c28
--- /dev/null
+++ b/third_party/rust/rkv/examples/iterator.rs
@@ -0,0 +1,76 @@
+// 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()
+}