format: read extensible array chunk indexes over Storage
ExtensibleArrayHeader::parse_in reads the header in one read, and read_extensible_array_chunks_in reads each index block, super block and data block as a prefix read and then one window of the whole structure (paged data blocks included); checksums and elements are checked in the window with bounds errors reported as the whole-file checks did. The &[u8] functions are wrappers. New test: an array with inline elements and a data block, cut at every length and damaged in each structure, reads identically through a read_at-only CountingStorage. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
@@ -240,6 +240,16 @@ impl<'a> Window<'a> {
|
||||
})
|
||||
}
|
||||
|
||||
/// A whole in-memory file as one window (base 0).
|
||||
#[cfg(test)]
|
||||
pub fn whole(bytes: &'a [u8]) -> Self {
|
||||
Window {
|
||||
bytes: Cow::Borrowed(bytes),
|
||||
base: 0,
|
||||
file_len: bytes.len(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Check that `[rel, rel + needed)` (relative to `base`) is in the file.
|
||||
pub fn ensure(&self, rel: usize, needed: usize) -> Result<(), FormatError> {
|
||||
match rel.checked_add(needed) {
|
||||
|
||||
Reference in New Issue
Block a user