pub fn format_sys_from(sys_from_ms: i64) -> String {
format!("{sys_from_ms:020}")
}
pub fn versioned_doc_key(
database_id: u64,
tenant: u64,
coll: &str,
doc_id: &str,
sys_from_ms: i64,
) -> crate::Result<String> {
if doc_id.as_bytes().contains(&0) {
return Err(crate::Error::BadRequest {
detail: "document id may not contain NUL byte".into(),
});
}
Ok(format!(
"{database_id}:{tenant}:{coll}:{doc_id}\x00{}",
format_sys_from(sys_from_ms)
))
}
pub fn doc_prefix(database_id: u64, tenant: u64, coll: &str, doc_id: &str) -> String {
format!("{database_id}:{tenant}:{coll}:{doc_id}\x00")
}
pub fn doc_prefix_end(database_id: u64, tenant: u64, coll: &str, doc_id: &str) -> String {
format!("{database_id}:{tenant}:{coll}:{doc_id}\x01")
}
pub fn coll_prefix(database_id: u64, tenant: u64, coll: &str) -> String {
format!("{database_id}:{tenant}:{coll}:")
}
pub fn coll_prefix_end(database_id: u64, tenant: u64, coll: &str) -> String {
format!("{database_id}:{tenant}:{coll};")
}
pub fn tenant_prefix(database_id: u64, tenant: u64) -> String {
format!("{database_id}:{tenant}:")
}
pub fn tenant_prefix_end(database_id: u64, tenant: u64) -> String {
format!("{database_id}:{tenant};")
}
pub fn parse_sys_from(key: &str) -> Option<i64> {
let (_, suffix) = key.rsplit_once('\x00')?;
suffix.parse().ok()
}
pub fn parse_doc_id<'a>(
key: &'a str,
database_id: u64,
tenant: u64,
coll: &str,
) -> Option<&'a str> {
let prefix = format!("{database_id}:{tenant}:{coll}:");
let rest = key.strip_prefix(&prefix)?;
let (id, _) = rest.rsplit_once('\x00')?;
Some(id)
}