apt_swarm/db/
proto.rs

1#[cfg(unix)]
2use super::unix::DatabaseUnixClient;
3use super::{Database, DatabaseClient};
4use crate::db;
5use crate::errors::*;
6use crate::signed::Signed;
7use crate::sync;
8use async_trait::async_trait;
9use bstr::BString;
10use sequoia_openpgp::Fingerprint;
11use serde::{Deserialize, Serialize};
12
13#[derive(Serialize, Deserialize)]
14pub enum Query {
15    AddRelease(String, Signed),
16    IndexFromScan(SyncQuery),
17    // Delete(BString),
18    Count(BString),
19}
20
21#[derive(Serialize, Deserialize)]
22pub struct SyncQuery {
23    pub fp: String,
24    pub hash_algo: String,
25    pub prefix: Option<String>,
26}
27
28#[derive(Debug, Serialize, Deserialize)]
29pub enum Response {
30    Ok,
31    Inserted(String),
32    Num(u64),
33    Index((String, usize)),
34    Error(ErrorResponse),
35}
36
37#[derive(Debug, Serialize, Deserialize)]
38pub struct ErrorResponse {
39    pub err: String,
40}
41
42impl ErrorResponse {
43    pub fn new(err: &anyhow::Error) -> Self {
44        Self {
45            err: format!("{:#}", err),
46        }
47    }
48}
49
50pub enum DatabaseHandle {
51    Direct(Database),
52    #[cfg(unix)]
53    Unix(DatabaseUnixClient),
54}
55
56#[async_trait]
57impl DatabaseClient for DatabaseHandle {
58    async fn add_release(&mut self, fp: &Fingerprint, signed: &Signed) -> Result<String> {
59        match self {
60            Self::Direct(db) => db.add_release(fp, signed).await,
61            #[cfg(unix)]
62            Self::Unix(unix) => unix.add_release(fp, signed).await,
63        }
64    }
65
66    async fn index_from_scan(&mut self, query: &sync::TreeQuery) -> Result<(String, usize)> {
67        match self {
68            Self::Direct(db) => db.index_from_scan(query).await,
69            #[cfg(unix)]
70            Self::Unix(unix) => unix.index_from_scan(query).await,
71        }
72    }
73
74    async fn spill(&self, prefix: &[u8]) -> Result<Vec<(db::Key, db::Value)>> {
75        match self {
76            Self::Direct(db) => db.spill(prefix).await,
77            #[cfg(unix)]
78            Self::Unix(db) => db.spill(prefix).await,
79        }
80    }
81
82    async fn get_value(&self, key: &[u8]) -> Result<db::Value> {
83        match self {
84            Self::Direct(db) => db.get_value(key).await,
85            #[cfg(unix)]
86            Self::Unix(unix) => unix.get_value(key).await,
87        }
88    }
89
90    async fn count(&mut self, prefix: &[u8]) -> Result<u64> {
91        match self {
92            Self::Direct(db) => db.count(prefix).await,
93            #[cfg(unix)]
94            Self::Unix(unix) => unix.count(prefix).await,
95        }
96    }
97}