use std::time::Duration;
use crate::shard::actor::{RangeItem, ShardError, ShardHandle};
use super::{DatabaseError, DbRange};
pub fn map_shard_error(error: ShardError) -> DatabaseError {
match error {
ShardError::SequenceConflict { expected, actual } => {
DatabaseError::SequenceConflict { expected, actual }
}
ShardError::CasMismatch { expected, actual } => {
DatabaseError::CasMismatch { expected, actual }
}
ShardError::Spawn(message) => DatabaseError::ShardSpawn(message),
ShardError::WriteDuringRootAdvanceEmission => DatabaseError::WriteDuringRootAdvanceEmission,
other => DatabaseError::ShardError(other.to_string()),
}
}
pub fn range_on_handle(
handle: &ShardHandle,
from: &[u8],
to: &[u8],
timeout: Duration,
) -> Result<DbRange, DatabaseError> {
let items = handle
.range(from.to_vec(), to.to_vec(), timeout)
.map_err(map_shard_error)?;
collect_range_items(items)
}
pub(super) fn has_live_events_on_handle(
handle: &ShardHandle,
key: &[u8],
timeout: Duration,
) -> Result<bool, DatabaseError> {
let from = event_range_start(key, 1);
let to = event_range_end(key);
handle
.has_live_in_range(from, to, timeout)
.map_err(map_shard_error)
}
fn collect_range_items(items: Vec<RangeItem>) -> Result<DbRange, DatabaseError> {
let mut entries = Vec::new();
for item in items {
match item {
RangeItem::Entry { key, value } => entries.push((key, value)),
RangeItem::Done => return Ok(entries),
}
}
Err(DatabaseError::ShardError(
"range result missing Done".to_owned(),
))
}
pub(super) fn event_range_start(key: &[u8], seq: u64) -> Vec<u8> {
let mut encoded = Vec::with_capacity(key.len().saturating_add(9));
encoded.extend_from_slice(key);
encoded.push(0);
encoded.extend_from_slice(&seq.to_be_bytes());
encoded
}
pub(super) fn event_range_end(key: &[u8]) -> Vec<u8> {
let mut encoded = Vec::with_capacity(key.len().saturating_add(1));
encoded.extend_from_slice(key);
encoded.push(1);
encoded
}
pub(super) fn event_sequence_key(key: &[u8]) -> Vec<u8> {
let mut encoded = Vec::with_capacity(key.len().saturating_add(4));
encoded.extend_from_slice(key);
encoded.extend_from_slice(&[0xff, b's', b'e', b'q']);
encoded
}