use super::engines::AnyCursor;
use super::Store;
use super::{boundary_key, typed_keys};
use crate::backend::ReadCursor;
use crate::facade::{Blob, EntryMeta};
use crate::keys::Key;
use crate::Error;
impl Store {
pub async fn get(&self, key: &[u8]) -> Result<Option<(u64, Blob)>, Error> {
let key = boundary_key(key)?;
let bytes = key.key_bytes();
let cursor = if let Some(cursor) = self.kv().get(&bytes).await? {
cursor
} else if let Some(cursor) = self.large_get(&bytes).await? {
cursor
} else {
return Ok(None);
};
match cursor {
AnyCursor::Kv(kv) => {
let value = kv.read_at(0, kv.len()).await?;
let derived = key.algorithm().derive(&value, value.len() as u64);
if &derived != key.digest() {
return Err(Error::Verification);
}
Ok(Some((value.len() as u64, Blob::new(AnyCursor::Kv(kv)))))
}
AnyCursor::Large(large) => Ok(Some((large.len(), Blob::new(AnyCursor::Large(large))))),
}
}
async fn large_get(&self, bytes: &[u8]) -> Result<Option<AnyCursor>, Error> {
match self.large() {
Some(large) => large.get(bytes).await,
None => Ok(None),
}
}
pub async fn stat(&self, key: &[u8]) -> Result<Option<EntryMeta>, Error> {
let key = boundary_key(key)?;
let bytes = key.key_bytes();
let len = match self.kv().size(&bytes).await? {
Some(len) => Some(len),
None => match self.large() {
Some(large) => large.size(&bytes).await?,
None => None,
},
};
Ok(len.map(|len| EntryMeta {
len,
algorithm: key.algorithm(),
}))
}
pub async fn read_range(
&self,
key: &[u8],
offset: u64,
len: u64,
) -> Result<(Vec<u8>, [u8; 32]), Error> {
let key = boundary_key(key)?;
let bytes = key.key_bytes();
if let Some(cursor) = self.kv().get(&bytes).await? {
return cursor.read_range(offset, len).await;
}
match self.large_get(&bytes).await? {
Some(cursor) => cursor.read_range(offset, len).await,
None => Err(Error::Missing),
}
}
pub async fn has(&self, key: &[u8]) -> Result<bool, Error> {
let key = boundary_key(key)?;
let bytes = key.key_bytes();
if self.kv().has(&bytes).await? {
return Ok(true);
}
match self.large() {
Some(large) => large.has(&bytes).await,
None => Ok(false),
}
}
pub async fn list(&self) -> Result<Vec<Key>, Error> {
let mut keys = typed_keys(self.kv().list().await?)?;
if let Some(large) = self.large() {
keys.extend(typed_keys(large.list().await?)?);
}
keys.sort();
Ok(keys)
}
}