use std::mem;
use wdev::Device;
use crate::{
api::garnet_status::GarnetStatus,
storage::session::{
objectstore::common::{OBJ_TAG_HASH, OBJ_TAG_LIST, OBJ_TAG_SET, OBJ_TAG_SORTED_SET},
storage_session::StorageSession,
},
};
impl<'a, D: Device> StorageSession<'a, D> {
pub async fn handle_object_encoding(&self, key: &[u8]) -> wkv::Result<Option<Vec<u8>>> {
let Some(raw) = self.read_string(key).await? else {
return Ok(None);
};
let name = if raw.first().is_none_or(|&t| !is_obj_tag(t)) {
"raw"
} else {
"bitcode"
};
Ok(Some(name.as_bytes().to_vec()))
}
pub async fn handle_object_ref_count(&self, key: &[u8]) -> wkv::Result<Option<u32>> {
Ok((self.exists(key).await? == GarnetStatus::Ok).then_some(1))
}
pub async fn handle_object_idle_time(&self, key: &[u8]) -> wkv::Result<Option<u32>> {
Ok((self.exists(key).await? == GarnetStatus::Ok).then_some(0))
}
pub async fn handle_object_freq(&self, _key: &[u8]) -> wkv::Result<Option<u8>> {
Ok(None)
}
pub async fn handle_memory_usage(&self, key: &[u8]) -> wkv::Result<Option<usize>> {
Ok(
self
.read_string(key)
.await?
.map(|raw| raw.len() + mem::size_of::<u64>()),
)
}
pub async fn handle_type(&self, key: &[u8]) -> wkv::Result<Option<Vec<u8>>> {
let Some(raw) = self.read_string(key).await? else {
return Ok(None);
};
let name = match raw.first() {
Some(&OBJ_TAG_HASH) => "hash",
Some(&OBJ_TAG_LIST) => "list",
Some(&OBJ_TAG_SET) => "set",
Some(&OBJ_TAG_SORTED_SET) => "zset",
_ => "string",
};
Ok(Some(name.as_bytes().to_vec()))
}
pub async fn handle_ttl(&self, key: &[u8]) -> wkv::Result<Option<i64>> {
let pttl = self.pttl_ms(key).await?;
Ok((pttl != -2).then(|| if pttl < 0 { -1 } else { (pttl + 999) / 1000 }))
}
pub async fn handle_expire_time(&self, key: &[u8]) -> wkv::Result<Option<i64>> {
let ms = self.expiretime_ms(key).await?;
Ok((ms != -2).then(|| if ms < 0 { -1 } else { (ms + 999) / 1000 }))
}
pub async fn handle_migrate(&self, key: &[u8]) -> wkv::Result<(GarnetStatus, Option<Vec<u8>>)> {
self.read_main_store(key).await
}
pub async fn handle_rename(&self, old_key: &[u8], new_key: &[u8]) -> wkv::Result<GarnetStatus> {
let (status, _) = self.rename_unified(old_key, new_key, false).await?;
Ok(status)
}
}
fn is_obj_tag(tag: u8) -> bool {
(OBJ_TAG_SORTED_SET..=OBJ_TAG_SET).contains(&tag)
}