Skip to main content

reifydb_cdc/compact/
block.rs

1// SPDX-License-Identifier: Apache-2.0
2// Copyright (c) 2026 ReifyDB
3
4use 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}