use crate::disk_loc::DiskLoc;
use crate::entry::EntryHeader;
use crate::error::DbResult;
use crate::shard::ShardInner;
#[derive(Debug)]
pub enum ApplyOutcome {
NotMatched,
Inserted,
Replaced(DiskLoc),
TombstoneRemoved(DiskLoc),
}
pub trait ReplicationTarget: Send + Sync {
#[allow(clippy::too_many_arguments)]
fn apply_entry(
&self,
shard_inner: &mut ShardInner,
shard_id: u8,
file_id: u32,
entry_offset: u64,
header: &EntryHeader,
key: &[u8],
value: &[u8],
) -> DbResult<ApplyOutcome>;
fn try_apply_entry(
&self,
shard_inner: &mut ShardInner,
shard_id: u8,
file_id: u32,
entry_offset: u64,
header: &EntryHeader,
raw_after_header: &[u8],
) -> DbResult<ApplyOutcome>;
fn key_len(&self) -> usize;
}
impl<T: ReplicationTarget + ?Sized> ReplicationTarget for std::sync::Arc<T> {
#[allow(clippy::too_many_arguments)]
fn apply_entry(
&self,
shard_inner: &mut ShardInner,
shard_id: u8,
file_id: u32,
entry_offset: u64,
header: &EntryHeader,
key: &[u8],
value: &[u8],
) -> DbResult<ApplyOutcome> {
(**self).apply_entry(
shard_inner,
shard_id,
file_id,
entry_offset,
header,
key,
value,
)
}
fn try_apply_entry(
&self,
shard_inner: &mut ShardInner,
shard_id: u8,
file_id: u32,
entry_offset: u64,
header: &EntryHeader,
raw_after_header: &[u8],
) -> DbResult<ApplyOutcome> {
(**self).try_apply_entry(
shard_inner,
shard_id,
file_id,
entry_offset,
header,
raw_after_header,
)
}
fn key_len(&self) -> usize {
(**self).key_len()
}
}