reifydb_cdc/compact/
block.rs1use postcard::{from_bytes, to_stdvec};
5use reifydb_core::{common::CommitVersion, interface::cdc::Cdc};
6use zstd::{decode_all, encode_all};
7
8use crate::error::CdcError;
9
10#[derive(Debug, Clone)]
11pub struct CompactBlockSummary {
12 pub min_version: CommitVersion,
13 pub max_version: CommitVersion,
14 pub num_entries: usize,
15 pub compressed_bytes: usize,
16}
17
18pub fn encode(entries: &[Cdc], zstd_level: u8) -> Result<Vec<u8>, CdcError> {
19 debug_assert!(!entries.is_empty(), "cannot encode an empty block");
20 debug_assert!(
21 entries.windows(2).all(|w| w[0].version < w[1].version),
22 "block entries must be strictly ascending by version"
23 );
24 let raw = to_stdvec(entries).map_err(|e| CdcError::Codec(format!("postcard encode block: {e}")))?;
25 let compressed = encode_all(&raw[..], zstd_level as i32)
26 .map_err(|e| CdcError::Codec(format!("zstd encode block: {e}")))?;
27 Ok(compressed)
28}
29
30pub fn decode(bytes: &[u8]) -> Result<Vec<Cdc>, CdcError> {
31 let raw = decode_all(bytes).map_err(|e| CdcError::Codec(format!("zstd decode block: {e}")))?;
32 let entries: Vec<Cdc> = from_bytes(&raw).map_err(|e| CdcError::Codec(format!("postcard decode block: {e}")))?;
33 Ok(entries)
34}