tuwunel_database/map/
contains.rs1use std::{fmt::Debug, io::Write, sync::Arc};
2
3use futures::FutureExt;
4use serde::Serialize;
5use tuwunel_core::{
6 Result,
7 arrayvec::ArrayVec,
8 err, implement,
9 utils::{future::TryExtExt, result::FlatOk},
10};
11
12use crate::{keyval::KeyBuf, ser};
13
14#[inline]
23#[implement(super::Map)]
24pub fn contains<K>(
25 self: &Arc<Self>,
26 key: &K,
27) -> impl Future<Output = bool> + Send + '_ + use<'_, K>
28where
29 K: Serialize + ?Sized + Debug,
30{
31 let mut buf = KeyBuf::new();
32 self.bcontains(key, &mut buf)
33}
34
35#[inline]
44#[implement(super::Map)]
45pub fn acontains<const MAX: usize, K>(
46 self: &Arc<Self>,
47 key: &K,
48) -> impl Future<Output = bool> + Send + '_ + use<'_, MAX, K>
49where
50 K: Serialize + ?Sized + Debug,
51{
52 let mut buf = ArrayVec::<u8, MAX>::new();
53 self.bcontains(key, &mut buf)
54}
55
56#[implement(super::Map)]
66#[tracing::instrument(skip(self, buf), fields(%self), level = "trace")]
67pub fn bcontains<K, B>(
68 self: &Arc<Self>,
69 key: &K,
70 buf: &mut B,
71) -> impl Future<Output = bool> + Send + '_ + use<'_, K, B>
72where
73 K: Serialize + ?Sized + Debug,
74 B: Write + AsRef<[u8]>,
75{
76 let key = ser::serialize(buf, key).expect("failed to serialize query key");
77 self.exists(key).is_ok()
78}
79
80#[inline]
85#[implement(super::Map)]
86pub fn exists<'a, K>(
87 self: &'a Arc<Self>,
88 key: &K,
89) -> impl Future<Output = Result> + Send + 'a + use<'a, K>
90where
91 K: AsRef<[u8]> + ?Sized + Debug + 'a,
92{
93 self.get(key).map(|res| res.map(|_| ()))
94}
95
96#[implement(super::Map)]
102#[tracing::instrument(skip(self, key), fields(%self), level = "trace")]
103pub fn exists_blocking<K>(&self, key: &K) -> Result
104where
105 K: AsRef<[u8]> + ?Sized + Debug,
106{
107 self.maybe_exists(key)
108 .then(|| self.get_blocking(key))
109 .flat_ok()
110 .map(|_| ())
111 .ok_or_else(|| err!(Request(NotFound("Not found in database"))))
112}
113
114#[implement(super::Map)]
119pub(crate) fn maybe_exists<K>(&self, key: &K) -> bool
120where
121 K: AsRef<[u8]> + ?Sized,
122{
123 self.engine
124 .db
125 .key_may_exist_cf_opt(&self.cf(), key, &self.cache_read_options)
126}