use nodedb_types::Namespace;
use crate::error::LiteError;
use crate::storage::engine::{StorageEngine, WriteOp};
use super::super::key::{format_sys_from, latest_version_key, versioned_doc_key};
use super::super::value::{VersionTag, encode_value};
pub async fn versioned_put<S: StorageEngine>(
storage: &S,
collection: &str,
doc_id: &str,
body: &[u8],
system_from_ms: i64,
valid_from_ms: Option<i64>,
valid_until_ms: Option<i64>,
) -> Result<(), LiteError> {
let history_key = versioned_doc_key(collection, doc_id, system_from_ms)?;
let vf = valid_from_ms.unwrap_or(system_from_ms);
let vu = valid_until_ms.unwrap_or(i64::MAX);
let history_value = encode_value(VersionTag::Live, vf, vu, body);
let pointer_key = latest_version_key(collection, doc_id);
let pointer_value = format_sys_from(system_from_ms).into_bytes();
storage
.batch_write(&[
WriteOp::Put {
ns: Namespace::DocumentHistory,
key: history_key,
value: history_value,
},
WriteOp::Put {
ns: Namespace::LatestVersion,
key: pointer_key,
value: pointer_value,
},
])
.await
}
pub async fn versioned_tombstone<S: StorageEngine>(
storage: &S,
collection: &str,
doc_id: &str,
system_from_ms: i64,
valid_from_ms: Option<i64>,
) -> Result<(), LiteError> {
let history_key = versioned_doc_key(collection, doc_id, system_from_ms)?;
let vf = valid_from_ms.unwrap_or(system_from_ms);
let history_value = encode_value(VersionTag::Tombstone, vf, i64::MAX, &[]);
let pointer_key = latest_version_key(collection, doc_id);
storage
.batch_write(&[
WriteOp::Put {
ns: Namespace::DocumentHistory,
key: history_key,
value: history_value,
},
WriteOp::Delete {
ns: Namespace::LatestVersion,
key: pointer_key,
},
])
.await
}