summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustus Winter <justus@sequoia-pgp.org>2018-01-18 17:29:11 +0100
committerJustus Winter <justus@sequoia-pgp.org>2018-01-18 17:32:16 +0100
commitbf633ef27b27c2acbe229f96608a5b04682758b5 (patch)
treedea90f0b819625ce38564f035753c58a60c371f5
parent0c9724de128c70e17ff1f0502266a631d24eb61e (diff)
store: Return tuples from iterators.
- Replace StoreIterItem, BindingIterItem, and KeyIterItem with tuples. - Remove binding counts from the items. If such information is needed, an RPC should be introduced. - Update all callers.
-rw-r--r--store/src/backend/mod.rs14
-rw-r--r--store/src/lib.rs119
-rw-r--r--store/src/store_protocol.capnp6
-rw-r--r--tool/src/main.rs36
4 files changed, 59 insertions, 116 deletions
diff --git a/store/src/backend/mod.rs b/store/src/backend/mod.rs
index 943b3f37..6037c15c 100644
--- a/store/src/backend/mod.rs
+++ b/store/src/backend/mod.rs
@@ -930,12 +930,6 @@ impl node::store_iter::Server for StoreIterServer {
&[&self.n, &self.prefix],
|row| (row.get(0), row.get(1), row.get(2), row.get(3))));
- let count: i64 =
- sry!(self.c.query_row(
- "SELECT count(*) FROM bindings WHERE store = ?1",
- &[&id], |row| row.get(0)));
- assert!(count >= 0);
-
// We cannot implement FromSql and friends for
// core::NetworkPolicy, hence we need to do it by foot.
if network_policy < 0 || network_policy > 3 {
@@ -947,7 +941,6 @@ impl node::store_iter::Server for StoreIterServer {
entry.set_domain(&domain);
entry.set_name(&name);
entry.set_network_policy(network_policy.into());
- entry.set_entries(count as u64);
entry.set_store(node::store::ToClient::new(
StoreServer::new(self.c.clone(), id)).from_server::<capnp_rpc::Server>());
self.n = id;
@@ -1017,15 +1010,8 @@ impl node::key_iter::Server for KeyIterServer {
&[&self.n],
|row| (row.get(0), row.get(1))));
- let count: i64 =
- sry!(self.c.query_row(
- "SELECT count(*) FROM bindings WHERE key = ?1",
- &[&id], |row| row.get(0)));
- assert!(count >= 0);
-
let mut entry = pry!(results.get().get_result()).init_ok();
entry.set_fingerprint(&fingerprint);
- entry.set_bindings(count as u64);
entry.set_key(node::key::ToClient::new(
KeyServer::new(self.c.clone(), id)).from_server::<capnp_rpc::Server>());
self.n = id;
diff --git a/store/src/lib.rs b/store/src/lib.rs
index bdd45929..1537f306 100644
--- a/store/src/lib.rs
+++ b/store/src/lib.rs
@@ -802,18 +802,8 @@ pub struct StoreIter {
iter: node::store_iter::Client,
}
-/// Items returned by `StoreIter`.
-#[derive(Debug)]
-pub struct StoreIterItem {
- pub domain: String,
- pub name: String,
- pub network_policy: core::NetworkPolicy,
- pub entries: usize,
- pub store: Store,
-}
-
impl Iterator for StoreIter {
- type Item = StoreIterItem;
+ type Item = (String, String, core::NetworkPolicy, Store);
fn next(&mut self) -> Option<Self::Item> {
let request = self.iter.next_request();
@@ -821,13 +811,11 @@ impl Iterator for StoreIter {
make_request_map!(
self.core.borrow_mut(), request,
|r: node::store_iter::item::Reader|
- Ok(StoreIterItem{
- domain: r.get_domain()?.into(),
- name: r.get_name()?.into(),
- network_policy: r.get_network_policy()?.into(),
- entries: r.get_entries() as usize,
- store: Store::new(self.core.clone(), r.get_name()?, r.get_store()?),
- }))
+ Ok((
+ r.get_domain()?.into(),
+ r.get_name()?.into(),
+ r.get_network_policy()?.into(),
+ Store::new(self.core.clone(), r.get_name()?, r.get_store()?))))
};
doit().ok()
}
@@ -839,31 +827,18 @@ pub struct BindingIter {
iter: node::binding_iter::Client,
}
-/// Items returned by `BindingIter`.
-#[derive(Debug)]
-pub struct BindingIterItem {
- pub label: String,
- pub fingerprint: openpgp::Fingerprint,
- pub binding: Binding,
-}
-
impl Iterator for BindingIter {
- type Item = BindingIterItem;
+ type Item = (String, openpgp::Fingerprint, Binding);
fn next(&mut self) -> Option<Self::Item> {
let request = self.iter.next_request();
let doit = || {
make_request_map!(
self.core.borrow_mut(), request,
- |r: node::binding_iter::item::Reader| {
- let label = String::from(r.get_label()?);
- let binding = Binding::new(self.core.clone(), &label, r.get_binding()?);
- Ok(BindingIterItem{
- label: label,
- fingerprint: openpgp::Fingerprint::from_hex(r.get_fingerprint()?).unwrap(),
- binding: binding,
- })
- })
+ |r: node::binding_iter::item::Reader|
+ Ok((String::from(r.get_label()?),
+ openpgp::Fingerprint::from_hex(r.get_fingerprint()?).unwrap(),
+ Binding::new(self.core.clone(), r.get_label()?, r.get_binding()?))))
};
doit().ok()
}
@@ -875,29 +850,17 @@ pub struct KeyIter {
iter: node::key_iter::Client,
}
-/// Items returned by `KeyIter`.
-#[derive(Debug)]
-pub struct KeyIterItem {
- pub fingerprint: openpgp::Fingerprint,
- pub bindings: usize,
- pub key: Key,
-}
-
impl Iterator for KeyIter {
- type Item = KeyIterItem;
+ type Item = (openpgp::Fingerprint, Key);
fn next(&mut self) -> Option<Self::Item> {
let request = self.iter.next_request();
let doit = || {
make_request_map!(
self.core.borrow_mut(), request,
- |r: node::key_iter::item::Reader| {
- Ok(KeyIterItem{
- fingerprint: openpgp::Fingerprint::from_hex(r.get_fingerprint()?).unwrap(),
- bindings: r.get_bindings() as usize,
- key: Key::new(self.core.clone(), r.get_key()?),
- })
- })
+ |r: node::key_iter::item::Reader|
+ Ok((openpgp::Fingerprint::from_hex(r.get_fingerprint()?).unwrap(),
+ Key::new(self.core.clone(), r.get_key()?))))
};
doit().ok()
}
@@ -1202,19 +1165,17 @@ mod store_test {
fn store_iterator() {
let ctx = make_some_stores();
let mut iter = Store::list(&ctx, "org.sequoia-pgp.tests.f").unwrap();
- let item = iter.next().unwrap();
- assert_eq!(item.domain, "org.sequoia-pgp.tests.foo");
- assert_eq!(item.name, "default");
- assert_eq!(item.network_policy, core::NetworkPolicy::Offline);
- assert_eq!(item.entries, 2);
+ let (domain, name, network_policy, store) = iter.next().unwrap();
+ assert_eq!(domain, "org.sequoia-pgp.tests.foo");
+ assert_eq!(name, "default");
+ assert_eq!(network_policy, core::NetworkPolicy::Offline);
let fp = Fingerprint::from_bytes(b"bbbbbbbbbbbbbbbbbbbb");
- item.store.add("Mister B.", &fp).unwrap();
- let item = iter.next().unwrap();
- assert_eq!(item.domain, "org.sequoia-pgp.tests.foo");
- assert_eq!(item.name, "another store");
- assert_eq!(item.network_policy, core::NetworkPolicy::Offline);
- assert_eq!(item.entries, 0);
- item.store.add("Mister B.", &fp).unwrap();
+ store.add("Mister B.", &fp).unwrap();
+ let (domain, name, network_policy, store) = iter.next().unwrap();
+ assert_eq!(domain, "org.sequoia-pgp.tests.foo");
+ assert_eq!(name, "another store");
+ assert_eq!(network_policy, core::NetworkPolicy::Offline);
+ store.add("Mister B.", &fp).unwrap();
assert!(iter.next().is_none());
}
@@ -1223,15 +1184,15 @@ mod store_test {
let ctx = make_some_stores();
let store = Store::open(&ctx, "default").unwrap();
let mut iter = store.iter().unwrap();
- let item = iter.next().unwrap();
+ let (label, fingerprint, binding) = iter.next().unwrap();
let fp = Fingerprint::from_bytes(b"bbbbbbbbbbbbbbbbbbbb");
- assert_eq!(item.label, "Mister B.");
- assert_eq!(item.fingerprint, fp);
- item.binding.stats().unwrap();
- let item = iter.next().unwrap();
- assert_eq!(item.label, "B4");
- assert_eq!(item.fingerprint, fp);
- item.binding.stats().unwrap();
+ assert_eq!(label, "Mister B.");
+ assert_eq!(fingerprint, fp);
+ binding.stats().unwrap();
+ let (label, fingerprint, binding) = iter.next().unwrap();
+ assert_eq!(label, "B4");
+ assert_eq!(fingerprint, fp);
+ binding.stats().unwrap();
assert!(iter.next().is_none());
}
@@ -1239,14 +1200,12 @@ mod store_test {
fn key_iterator() {
let ctx = make_some_stores();
let mut iter = Store::list_keys(&ctx).unwrap();
- let item = iter.next().unwrap();
- assert_eq!(item.fingerprint, Fingerprint::from_bytes(b"bbbbbbbbbbbbbbbbbbbb"));
- assert_eq!(item.bindings, 2);
- item.key.stats().unwrap();
- let item = iter.next().unwrap();
- assert_eq!(item.fingerprint, Fingerprint::from_bytes(b"cccccccccccccccccccc"));
- assert_eq!(item.bindings, 1);
- item.key.stats().unwrap();
+ let (fingerprint, key) = iter.next().unwrap();
+ assert_eq!(fingerprint, Fingerprint::from_bytes(b"bbbbbbbbbbbbbbbbbbbb"));
+ key.stats().unwrap();
+ let (fingerprint, key) = iter.next().unwrap();
+ assert_eq!(fingerprint, Fingerprint::from_bytes(b"cccccccccccccccccccc"));
+ key.stats().unwrap();
assert!(iter.next().is_none());
}
}
diff --git a/store/src/store_protocol.capnp b/store/src/store_protocol.capnp
index 039a794c..a2a749dc 100644
--- a/store/src/store_protocol.capnp
+++ b/store/src/store_protocol.capnp
@@ -40,8 +40,7 @@ interface Node {
domain @0 :Text;
name @1 :Text;
networkPolicy @2 :NetworkPolicy;
- entries @3 :UInt64;
- store @4 :Store;
+ store @3 :Store;
}
}
@@ -60,8 +59,7 @@ interface Node {
struct Item {
fingerprint @0 :Text;
- bindings @1 :UInt64;
- key @2 :Key;
+ key @1 :Key;
}
}
diff --git a/tool/src/main.rs b/tool/src/main.rs
index ac79cb7d..c9abcfe4 100644
--- a/tool/src/main.rs
+++ b/tool/src/main.rs
@@ -380,39 +380,39 @@ fn real_main() -> Result<()> {
("stores", Some(m)) => {
let mut table = Table::new();
table.set_format(*prettytable::format::consts::FORMAT_NO_LINESEP_WITH_TITLE);
- table.set_titles(row!["domain", "name", "network policy", "# of entries"]);
+ table.set_titles(row!["domain", "name", "network policy"]);
- for item in Store::list(&ctx, m.value_of("prefix").unwrap_or(""))
+ for (domain, name, network_policy, _)
+ in Store::list(&ctx, m.value_of("prefix").unwrap_or(""))
.expect("Failed to iterate over stores") {
table.add_row(Row::new(vec![
- Cell::new(&item.domain),
- Cell::new(&item.name),
- Cell::new(&format!("{:?}", item.network_policy)),
- Cell::new(&format!("{}", item.entries))])
- );
+ Cell::new(&domain),
+ Cell::new(&name),
+ Cell::new(&format!("{:?}", network_policy))
+ ]));
}
table.printstd();
},
("bindings", Some(m)) => {
- for item in Store::list(&ctx, m.value_of("prefix").unwrap_or(""))
+ for (domain, name, _, store)
+ in Store::list(&ctx, m.value_of("prefix").unwrap_or(""))
.expect("Failed to iterate over stores") {
- println!("Domain {:?} Name {:?}:", item.domain, item.name);
- list_bindings(&item.store);
+ println!("Domain {:?} Name {:?}:", domain, name);
+ list_bindings(&store);
}
},
("keys", Some(_)) => {
let mut table = Table::new();
table.set_format(*prettytable::format::consts::FORMAT_NO_LINESEP_WITH_TITLE);
- table.set_titles(row!["fingerprint", "# of bindings", "updated", "status"]);
+ table.set_titles(row!["fingerprint", "updated", "status"]);
- for item in Store::list_keys(&ctx)
+ for (fingerprint, key) in Store::list_keys(&ctx)
.expect("Failed to iterate over keys") {
- let stats = item.key.stats()
+ let stats = key.stats()
.expect("Failed to get stats");
table.add_row(Row::new(vec![
- Cell::new(&item.fingerprint.to_string()),
- Cell::new(&format!("{}", item.bindings)),
+ Cell::new(&fingerprint.to_string()),
if let Some(ref t) = stats.updated {
Cell::new(&format_time(t))
} else {
@@ -447,10 +447,10 @@ fn list_bindings(store: &Store) {
let mut table = Table::new();
table.set_format(*prettytable::format::consts::FORMAT_NO_LINESEP_WITH_TITLE);
table.set_titles(row!["label", "fingerprint"]);
- for item in store.iter().expect("Failed to iterate over bindings") {
+ for (label, fingerprint, _) in store.iter().expect("Failed to iterate over bindings") {
table.add_row(Row::new(vec![
- Cell::new(&item.label),
- Cell::new(&item.fingerprint.to_string())]));
+ Cell::new(&label),
+ Cell::new(&fingerprint.to_string())]));
}
table.printstd();
}