Skip to main content

reifydb_cdc/compact/
block.rs

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