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