use std::io;
use crate::error::IoError;
#[derive(Debug, Clone, Copy)]
pub struct DecodeLimits {
pub max_frame_bytes: usize,
pub max_n_rows: usize,
pub max_buffers: usize,
pub max_fields: usize,
pub max_dictionary_entries: usize,
pub max_string_bytes: usize,
pub max_decompressed_bytes: usize,
}
impl Default for DecodeLimits {
fn default() -> Self {
Self {
max_frame_bytes: 2 * 1024 * 1024 * 1024,
max_n_rows: 256_000_000,
max_buffers: 65_536,
max_fields: 65_536,
max_dictionary_entries: 256_000_000,
max_string_bytes: 2 * 1024 * 1024 * 1024,
max_decompressed_bytes: 4 * 1024 * 1024 * 1024,
}
}
}
impl DecodeLimits {
pub const fn unlimited() -> Self {
Self {
max_frame_bytes: usize::MAX,
max_n_rows: usize::MAX,
max_buffers: usize::MAX,
max_fields: usize::MAX,
max_dictionary_entries: usize::MAX,
max_string_bytes: usize::MAX,
max_decompressed_bytes: usize::MAX,
}
}
#[inline]
pub fn check(&self, requested: usize, cap: usize, what: &str) -> io::Result<()> {
if requested > cap {
return Err(io::Error::new(
io::ErrorKind::InvalidData,
format!(
"resource limit exceeded: {} requested {} (cap {})",
what, requested, cap
),
));
}
Ok(())
}
#[inline]
pub fn check_io(&self, requested: usize, cap: usize, what: &str) -> Result<(), IoError> {
if requested > cap {
return Err(IoError::InputDataError(format!(
"resource limit exceeded: {} requested {} (cap {})",
what, requested, cap
)));
}
Ok(())
}
}