use std::sync::Arc;
use crate::wal::WalManager;
pub trait SurrogateWalAppender: Send + Sync {
fn record_alloc_to_wal(&self, hi: u32) -> crate::Result<()>;
fn record_bind_to_wal(
&self,
surrogate: u32,
collection: &str,
pk_bytes: &[u8],
) -> crate::Result<()>;
}
pub struct WalSurrogateAppender {
wal: Arc<WalManager>,
}
impl WalSurrogateAppender {
pub fn new(wal: Arc<WalManager>) -> Self {
Self { wal }
}
}
impl SurrogateWalAppender for WalSurrogateAppender {
fn record_alloc_to_wal(&self, hi: u32) -> crate::Result<()> {
self.wal.append_surrogate_alloc(hi).map(|_| ())
}
fn record_bind_to_wal(
&self,
surrogate: u32,
collection: &str,
pk_bytes: &[u8],
) -> crate::Result<()> {
self.wal
.append_surrogate_bind(surrogate, collection, pk_bytes)?;
self.wal.sync()
}
}
pub struct NoopWalAppender;
impl SurrogateWalAppender for NoopWalAppender {
fn record_alloc_to_wal(&self, _hi: u32) -> crate::Result<()> {
Ok(())
}
fn record_bind_to_wal(
&self,
_surrogate: u32,
_collection: &str,
_pk_bytes: &[u8],
) -> crate::Result<()> {
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn noop_appender_succeeds() {
let a = NoopWalAppender;
a.record_alloc_to_wal(123).unwrap();
a.record_alloc_to_wal(u32::MAX).unwrap();
}
}