summaryrefslogtreecommitdiffstats
path: root/store
diff options
context:
space:
mode:
authorJustus Winter <justus@sequoia-pgp.org>2019-08-23 13:26:08 +0200
committerJustus Winter <justus@sequoia-pgp.org>2019-08-23 13:26:08 +0200
commitc678874604b1a48a9aa46276e001ed540a823c06 (patch)
tree56befd03009ed1190b5b2f1e97e0c2b4784c7bff /store
parent919f9823325064f4a6a579a0307775b97706d9ff (diff)
Bump rusqlite to 0.19.
- 0.20 requires a newer rustc.
Diffstat (limited to 'store')
-rw-r--r--store/Cargo.toml2
-rw-r--r--store/src/backend/log.rs30
-rw-r--r--store/src/backend/mod.rs89
3 files changed, 68 insertions, 53 deletions
diff --git a/store/Cargo.toml b/store/Cargo.toml
index c26d5cb1..71d5d5b0 100644
--- a/store/Cargo.toml
+++ b/store/Cargo.toml
@@ -36,7 +36,7 @@ capnp-rpc = "0.10"
failure = "0.1.2"
futures = "0.1.17"
rand = { version = "0.6", default-features = false }
-rusqlite = "0.14"
+rusqlite = "0.19"
time = "0.1.38"
tokio-core = "0.1.10"
tokio-io = "0.1.4"
diff --git a/store/src/backend/log.rs b/store/src/backend/log.rs
index fe06a4e5..a2ddcf4b 100644
--- a/store/src/backend/log.rs
+++ b/store/src/backend/log.rs
@@ -1,9 +1,9 @@
//! Logging for the backend.
// XXX: Implement log levels and trim the log.
-
+use rusqlite::{Connection, types::ToSql};
use super::{
- ID, Timestamp, Connection, Rc, Result, node,
+ ID, Timestamp, Rc, Result, node,
StoreServer, BindingServer, KeyServer,
Promise, capnp, capnp_rpc
};
@@ -61,7 +61,7 @@ fn log(c: &Rc<Connection>, refers: Refers,
c.execute("INSERT INTO log
(timestamp, level, store, binding, key, slug, message, error)
VALUES (?1, 0, ?2, ?3, ?4, ?5, ?6, ?7)",
- &[&Timestamp::now(),
+ &[&Timestamp::now() as &ToSql,
&refers.store, &refers.binding, &refers.key,
&slug, &message, &error])?;
Ok(c.last_insert_rowid().into())
@@ -113,9 +113,9 @@ impl node::log_iter::Server for IterServer {
WHERE id < ?1
ORDER BY id DESC LIMIT 1",
&[&self.n],
- |row| (row.get(0), row.get(1),
- row.get(2), row.get(3), row.get(4),
- row.get(5), row.get(6), row.get(7))),
+ |row| Ok((row.get(0)?, row.get(1)?,
+ row.get(2)?, row.get(3)?, row.get(4)?,
+ row.get(5)?, row.get(6)?, row.get(7)?))),
Selector::Store(store) =>
self.c.query_row(
@@ -129,9 +129,9 @@ impl node::log_iter::Server for IterServer {
OR key IN (SELECT key FROM bindings WHERE store = ?2))
ORDER BY id DESC LIMIT 1",
&[&self.n, &store],
- |row| (row.get(0), row.get(1),
- row.get(2), row.get(3), row.get(4),
- row.get(5), row.get(6), row.get(7))),
+ |row| Ok((row.get(0)?, row.get(1)?,
+ row.get(2)?, row.get(3)?, row.get(4)?,
+ row.get(5)?, row.get(6)?, row.get(7)?))),
Selector::Binding(binding) =>
self.c.query_row(
@@ -144,9 +144,9 @@ impl node::log_iter::Server for IterServer {
OR key IN (SELECT key FROM bindings WHERE id = ?2))
ORDER BY id DESC LIMIT 1",
&[&self.n, &binding],
- |row| (row.get(0), row.get(1),
- row.get(2), row.get(3), row.get(4),
- row.get(5), row.get(6), row.get(7))),
+ |row| Ok((row.get(0)?, row.get(1)?,
+ row.get(2)?, row.get(3)?, row.get(4)?,
+ row.get(5)?, row.get(6)?, row.get(7)?))),
Selector::Key(key) =>
self.c.query_row(
@@ -158,9 +158,9 @@ impl node::log_iter::Server for IterServer {
AND key = ?2
ORDER BY id DESC LIMIT 1",
&[&self.n, &key],
- |row| (row.get(0), row.get(1),
- row.get(2), row.get(3), row.get(4),
- row.get(5), row.get(6), row.get(7))),
+ |row| Ok((row.get(0)?, row.get(1)?,
+ row.get(2)?, row.get(3)?, row.get(4)?,
+ row.get(5)?, row.get(6)?, row.get(7)?))),
});
let mut entry = pry!(results.get().get_result()).init_ok();
diff --git a/store/src/backend/mod.rs b/store/src/backend/mod.rs
index 6351a676..d9b3b62c 100644
--- a/store/src/backend/mod.rs
+++ b/store/src/backend/mod.rs
@@ -15,8 +15,12 @@ use futures::Future;
use futures::future::{self, loop_fn, Loop};
use rand::distributions::{Distribution, Uniform};
use rand::thread_rng;
-use rusqlite::Connection;
-use rusqlite;
+use rusqlite::{
+ self,
+ Connection,
+ NO_PARAMS,
+ types::ToSql,
+};
use tokio_core::reactor::{Handle, Timeout};
use tokio_core;
use tokio_io::io::ReadHalf;
@@ -119,7 +123,7 @@ impl NodeServer {
fn init(&self) -> Result<()> {
let v = self.c.query_row(
"SELECT version FROM version WHERE id=1",
- &[], |row| row.get(0));
+ NO_PARAMS, |row| row.get(0));
if let Ok(v) = v {
match v {
@@ -278,8 +282,10 @@ impl Query for StoreServer {
fn slug(&self) -> String {
self.c.query_row(
"SELECT realm, name FROM stores WHERE id = ?1",
- &[&self.id], |row| -> String {
- format!("{}:{}", row.get::<_, String>(0), row.get::<_, String>(1))
+ &[&self.id], |row| -> rusqlite::Result<String> {
+ Ok(format!("{}:{}",
+ row.get::<_, String>(0)?,
+ row.get::<_, String>(1)?))
})
.unwrap_or(
format!("{}::{}", Self::table_name(), self.id())
@@ -300,10 +306,11 @@ impl StoreServer {
c.execute(
"INSERT OR IGNORE INTO stores (realm, network_policy, name) VALUES (?1, ?2, ?3)",
- &[&realm, &p, &name])?;
+ &[&realm as &ToSql, &p, &name])?;
let (id, store_policy): (ID, i64) = c.query_row(
"SELECT id, network_policy FROM stores WHERE realm = ?1 AND name = ?2",
- &[&realm, &name], |row| (row.get(0), row.get(1)))?;
+ &[&realm, &name],
+ |row| Ok((row.get(0)?, row.get(1)?)))?;
// We cannot implement FromSql and friends for
// core::NetworkPolicy, hence we need to do it by foot.
@@ -362,7 +369,7 @@ impl node::store::Server for StoreServer {
let binding_id: ID = sry!(
self.c.query_row(
"SELECT id FROM bindings WHERE store = ?1 AND label = ?2",
- &[&self.id, &label], |row| row.get(0)));
+ &[&self.id as &ToSql, &label], |row| row.get(0)));
pry!(pry!(results.get().get_result()).set_ok(
node::binding::ToClient::new(
@@ -452,7 +459,11 @@ impl BindingServer {
let key_id = KeyServer::lookup_or_create(c, fp)?;
if let Ok((binding, key)) = c.query_row(
"SELECT id, key FROM bindings WHERE store = ?1 AND label = ?2",
- &[&store, &label], |row| -> (ID, ID) {(row.get(0), row.get(1))}) {
+ &[&store as &ToSql, &label],
+ |row| -> rusqlite::Result<(ID, ID)> {
+ Ok((row.get(0)?, row.get(1)?))
+ })
+ {
if key == key_id {
Ok((binding, key_id, false))
} else {
@@ -462,7 +473,7 @@ impl BindingServer {
let r = c.execute(
"INSERT INTO bindings (store, label, key, created)
VALUES (?, ?, ?, ?)",
- &[&store, &label, &key_id, &Timestamp::now()]);
+ &[&store as &ToSql, &label, &key_id, &Timestamp::now()]);
// Some other mutator might race us to the insertion.
match r {
@@ -471,7 +482,8 @@ impl BindingServer {
rusqlite::ErrorCode::ConstraintViolation => {
let (binding, key): (ID, ID) = c.query_row(
"SELECT id, key FROM bindings WHERE store = ?1 AND label = ?2",
- &[&store, &label], |row| (row.get(0), row.get(1)))?;
+ &[&store as &ToSql, &label],
+ |row| Ok((row.get(0)?, row.get(1)?)))?;
if key == key_id {
Ok((binding, key_id, false))
} else {
@@ -504,7 +516,7 @@ impl Query for BindingServer {
fn slug(&self) -> String {
self.c.query_row(
"SELECT label FROM bindings WHERE id = ?1",
- &[&self.id], |row| -> String {
+ &[&self.id], |row| -> rusqlite::Result<String> {
row.get(0)
})
.unwrap_or(
@@ -552,7 +564,7 @@ impl node::binding::Server for BindingServer {
= sry!(self.c.query_row(
"SELECT fingerprint, key FROM keys WHERE id = ?1",
&[&key_id],
- |row| (row.get(0), row.get_checked(1).ok())));
+ |row| Ok((row.get(0)?, row.get(1).ok()))));
// If we found one, convert it to TPK.
let current = if let Some(current) = key {
@@ -590,7 +602,7 @@ impl node::binding::Server for BindingServer {
sry!(new.serialize(&mut blob));
sry!(self.c.execute("UPDATE keys SET key = ?1 WHERE id = ?2",
- &[&blob, &key_id]));
+ &[&blob as &ToSql, &key_id]));
sry!(KeyServer::reindex_subkeys(&self.c, key_id, &new));
pry!(pry!(results.get().get_result()).set_ok(&blob[..]));
@@ -621,14 +633,14 @@ impl node::binding::Server for BindingServer {
encryption_first = coalesce(encryption_first, ?2),
encryption_last = ?2
WHERE id = ?1",
- &[&self.id, &now]));
+ &[&self.id as &ToSql, &now]));
sry!(self.c
.execute("UPDATE keys
SET encryption_count = encryption_count + 1,
encryption_first = coalesce(encryption_first, ?2),
encryption_last = ?2
WHERE id = ?1",
- &[&key, &now]));
+ &[&key as &ToSql, &now]));
sry!(self.query_stats( pry!(results.get().get_result()).init_ok()));
Promise::ok(())
@@ -648,14 +660,14 @@ impl node::binding::Server for BindingServer {
verification_first = coalesce(verification_first, ?2),
verification_last = ?2
WHERE id = ?1",
- &[&self.id, &now]));
+ &[&self.id as &ToSql, &now]));
sry!(self.c
.execute("UPDATE keys
SET verification_count = verification_count + 1,
verification_first = coalesce(verification_first, ?2),
verification_last = ?2
WHERE id = ?1",
- &[&key, &now]));
+ &[&key as &ToSql, &now]));
sry!(self.query_stats( pry!(results.get().get_result()).init_ok()));
Promise::ok(())
@@ -679,7 +691,7 @@ impl node::binding::Server for BindingServer {
bind_results!(results);
let label = sry!(self.c.query_row(
"SELECT label FROM bindings WHERE id = ?1",
- &[&self.id], |row| -> String {
+ &[&self.id], |row| -> rusqlite::Result<String> {
row.get(0)
}));
@@ -733,7 +745,7 @@ impl KeyServer {
} else {
let r = c.execute(
"INSERT INTO keys (fingerprint, created, update_at) VALUES (?1, ?2, ?2)",
- &[&fp, &Timestamp::now()]);
+ &[&fp as &ToSql, &Timestamp::now()]);
// Some other mutator might race us to the insertion.
match r {
@@ -763,7 +775,7 @@ impl KeyServer {
= self.c.query_row(
"SELECT fingerprint, key FROM keys WHERE id = ?1",
&[&self.id],
- |row| (row.get(0), row.get_checked(1).ok()))?;
+ |row| Ok((row.get(0)?, row.get(1).ok())))?;
// If there was a key stored there, merge it.
if let Some(current) = key {
@@ -786,7 +798,7 @@ impl KeyServer {
new.serialize(&mut blob)?;
self.c.execute("UPDATE keys SET key = ?1 WHERE id = ?2",
- &[&blob, &self.id])?;
+ &[&blob as &ToSql, &self.id])?;
KeyServer::reindex_subkeys(&self.c, self.id, &new)?;
Ok(blob)
@@ -800,7 +812,7 @@ impl KeyServer {
let r = c.execute(
"INSERT INTO key_by_keyid (keyid, key) VALUES (?1, ?2)",
- &[&(keyid as i64), &key_id]);
+ &[&(keyid as i64) as &ToSql, &key_id]);
// The mapping might already be present. This is not an error.
match r {
@@ -825,7 +837,7 @@ impl KeyServer {
self.c.execute("UPDATE keys
SET updated = ?2, update_at = ?3
WHERE id = ?1",
- &[&self.id, &Timestamp::now(),
+ &[&self.id as &ToSql, &Timestamp::now(),
&(Timestamp::now() + next)])?;
Ok(())
}
@@ -837,7 +849,7 @@ impl KeyServer {
self.c.execute("UPDATE keys
SET update_at = ?2
WHERE id = ?1",
- &[&self.id,
+ &[&self.id as &ToSql,
&(Timestamp::now() + next)])?;
Ok(())
}
@@ -854,7 +866,9 @@ impl KeyServer {
JOIN stores on stores.id = bindings.store
WHERE stores.network_policy = ?1
ORDER BY keys.update_at LIMIT 1",
- &[&network_policy_u8], |row| -> Timestamp {row.get(0)}).ok()
+ &[&network_policy_u8], |row| -> rusqlite::Result<Timestamp> {
+ row.get(0)
+ }).ok()
}
/// Returns the number of keys using the given policy.
@@ -889,8 +903,8 @@ impl KeyServer {
WHERE stores.network_policy >= ?1
AND keys.update_at < ?2
ORDER BY keys.update_at LIMIT 1",
- &[&network_policy_u8, &Timestamp::now()], |row| (row.get(0),
- row.get(1)))?;
+ &[&network_policy_u8 as &ToSql, &Timestamp::now()],
+ |row| Ok((row.get(0)?, row.get(1)?)))?;
let fingerprint = openpgp::Fingerprint::from_hex(&fingerprint)
.map_err(|_| node::Error::SystemError)?;
@@ -990,7 +1004,7 @@ impl Query for KeyServer {
fn slug(&self) -> String {
self.c.query_row(
"SELECT fingerprint FROM keys WHERE id = ?1",
- &[&self.id], |row| -> String { row.get(0) })
+ &[&self.id], |row| -> rusqlite::Result<String> { row.get(0) })
.ok()
.and_then(|fp| Fingerprint::from_hex(&fp).ok())
.map(|fp| fp.to_keyid().to_string())
@@ -1019,7 +1033,7 @@ impl node::key::Server for KeyServer {
self.c.query_row(
"SELECT key FROM keys WHERE id = ?1",
&[&self.id],
- |row| row.get_checked(0).unwrap_or(vec![])));
+ |row| Ok(row.get(0).unwrap_or(vec![]))));
pry!(pry!(results.get().get_result()).set_ok(key.as_slice()));
Promise::ok(())
}
@@ -1080,9 +1094,10 @@ trait Query {
verification_last
FROM {0}
WHERE id = ?1", Self::table_name()),
- &[&self.id()], |row| (row.get(0), row.get(1),
- row.get(2), row.get(3), row.get(4),
- row.get(5), row.get(6), row.get(7)))?;
+ &[&self.id()],
+ |row| Ok((row.get(0)?, row.get(1)?,
+ row.get(2)?, row.get(3)?, row.get(4)?,
+ row.get(5)?, row.get(6)?, row.get(7)?)))?;
macro_rules! set_some {
( $object: ident) => {
macro_rules! set {
@@ -1133,8 +1148,8 @@ impl node::store_iter::Server for StoreIterServer {
"SELECT id, realm, name, network_policy FROM stores
WHERE id > ?1 AND realm like ?2
ORDER BY id LIMIT 1",
- &[&self.n, &self.prefix],
- |row| (row.get(0), row.get(1), row.get(2), row.get(3))));
+ &[&self.n as &ToSql, &self.prefix],
+ |row| Ok((row.get(0)?, row.get(1)?, row.get(2)?, row.get(3)?))));
// We cannot implement FromSql and friends for
// core::NetworkPolicy, hence we need to do it by foot.
@@ -1179,7 +1194,7 @@ impl node::binding_iter::Server for BindingIterServer {
WHERE bindings.id > ?1 AND bindings.store = ?2
ORDER BY bindings.id LIMIT 1",
&[&self.n, &self.store_id],
- |row| (row.get(0), row.get(1), row.get(2))));
+ |row| Ok((row.get(0)?, row.get(1)?, row.get(2)?))));
let mut entry = pry!(results.get().get_result()).init_ok();
entry.set_label(&label);
@@ -1214,7 +1229,7 @@ impl node::key_iter::Server for KeyIterServer {
WHERE keys.id > ?1
ORDER BY id LIMIT 1",
&[&self.n],
- |row| (row.get(0), row.get(1))));
+ |row| Ok((row.get(0)?, row.get(1)?))));
let mut entry = pry!(results.get().get_result()).init_ok();
entry.set_fingerprint(&fingerprint);