use bc_components::ARID;
use bc_envelope::Envelope;
use super::{MemoryKv, SqliteKv};
use crate::KvStore;
#[derive(Clone)]
pub enum ServerKv {
Memory(MemoryKv),
Sqlite(SqliteKv),
}
impl ServerKv {
pub fn memory() -> Self { Self::Memory(MemoryKv::new()) }
pub fn sqlite(store: SqliteKv) -> Self { Self::Sqlite(store) }
pub(super) fn put_sync(
&self,
arid: ARID,
envelope: Envelope,
ttl_seconds: u64,
) -> Result<(), String> {
match self {
ServerKv::Memory(store) => tokio::task::block_in_place(|| {
tokio::runtime::Handle::current().block_on(async {
store
.put(&arid, &envelope, Some(ttl_seconds), false)
.await
.map(|_| ())
.map_err(|e| e.to_string())
})
}),
ServerKv::Sqlite(store) => tokio::task::block_in_place(|| {
tokio::runtime::Handle::current().block_on(async {
store
.put(&arid, &envelope, Some(ttl_seconds), false)
.await
.map(|_| ())
.map_err(|e| e.to_string())
})
}),
}
}
pub(super) fn get_sync(&self, arid: &ARID) -> Option<Envelope> {
match self {
ServerKv::Memory(store) => tokio::task::block_in_place(|| {
tokio::runtime::Handle::current().block_on(async {
store.get(arid, Some(0), false).await.ok().flatten()
})
}),
ServerKv::Sqlite(store) => tokio::task::block_in_place(|| {
tokio::runtime::Handle::current().block_on(async {
store.get(arid, Some(0), false).await.ok().flatten()
})
}),
}
}
}