53 lines
1.6 KiB
Rust
53 lines
1.6 KiB
Rust
use std::{convert::AsRef, fmt::Debug, io::Write, sync::Arc};
|
|
|
|
use conduwuit::{arrayvec::ArrayVec, implement, Result};
|
|
use futures::Future;
|
|
use serde::Serialize;
|
|
|
|
use crate::{keyval::KeyBuf, ser, Handle};
|
|
|
|
/// Fetch a value from the database into cache, returning a reference-handle
|
|
/// asynchronously. The key is serialized into an allocated buffer to perform
|
|
/// the query.
|
|
#[implement(super::Map)]
|
|
#[inline]
|
|
pub fn qry<K>(self: &Arc<Self>, key: &K) -> impl Future<Output = Result<Handle<'_>>> + Send
|
|
where
|
|
K: Serialize + ?Sized + Debug,
|
|
{
|
|
let mut buf = KeyBuf::new();
|
|
self.bqry(key, &mut buf)
|
|
}
|
|
|
|
/// Fetch a value from the database into cache, returning a reference-handle
|
|
/// asynchronously. The key is serialized into a fixed-sized buffer to perform
|
|
/// the query. The maximum size is supplied as const generic parameter.
|
|
#[implement(super::Map)]
|
|
#[inline]
|
|
pub fn aqry<const MAX: usize, K>(
|
|
self: &Arc<Self>,
|
|
key: &K,
|
|
) -> impl Future<Output = Result<Handle<'_>>> + Send
|
|
where
|
|
K: Serialize + ?Sized + Debug,
|
|
{
|
|
let mut buf = ArrayVec::<u8, MAX>::new();
|
|
self.bqry(key, &mut buf)
|
|
}
|
|
|
|
/// Fetch a value from the database into cache, returning a reference-handle
|
|
/// asynchronously. The key is serialized into a user-supplied Writer.
|
|
#[implement(super::Map)]
|
|
#[tracing::instrument(skip(self, buf), level = "trace")]
|
|
pub fn bqry<K, B>(
|
|
self: &Arc<Self>,
|
|
key: &K,
|
|
buf: &mut B,
|
|
) -> impl Future<Output = Result<Handle<'_>>> + Send
|
|
where
|
|
K: Serialize + ?Sized + Debug,
|
|
B: Write + AsRef<[u8]>,
|
|
{
|
|
let key = ser::serialize(buf, key).expect("failed to serialize query key");
|
|
self.get(key)
|
|
}
|