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 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}