Skip to main content

PackReader

Struct PackReader 

Source
pub struct PackReader<'a> { /* private fields */ }

Implementations§

Source§

impl PackReader<'static>

Source

pub fn open( pack_path: &Path, index_path: &Path, ) -> Result<PackReader<'static>, HeddleError>

Open a pack file. mmap-backed when the pack is large enough to benefit (the same threshold the loose-blob path uses for its own mmap decision); read-into-heap otherwise.

Source

pub fn from_bytes( pack_data: impl Into<Bytes>, index_data: impl AsRef<[u8]>, ) -> Result<PackReader<'static>, HeddleError>

Source§

impl<'a> PackReader<'a>

Source

pub fn from_slice( pack_data: &'a [u8], index_data: impl AsRef<[u8]>, ) -> Result<PackReader<'a>, HeddleError>

Source

pub fn list_ids(&self) -> Result<Vec<PackObjectId>, HeddleError>

List all object ids in this pack.

Source

pub fn logical_id(&self) -> Result<PackLogicalId, HeddleError>

Compute this pack’s root-spool-scoped logical identity.

Every logical object is decoded so delta and compact-frame physical choices cannot affect the result. The visit also validates exact index membership before an identity is returned.

Source

pub fn representation_hash(&self) -> PackRepresentationHash

Hash the exact finalized pack bytes used by this reader.

Source

pub fn list_hashes(&self) -> Result<Vec<ContentHash>, HeddleError>

Source

pub fn has_object(&self, id: &PackObjectId) -> Result<bool, HeddleError>

Source

pub fn encoded_payload_bytes( &self, obj_type: ObjectType, ) -> Result<u64, HeddleError>

Compressed payload bytes used by unique physical records of obj_type.

Shared compact frames have one record offset indexed by many logical ids, so offsets are deduplicated before bytes are counted.

Source

pub fn visit_objects( &self, visitor: impl FnMut(PackObjectId, ObjectType, &[u8]) -> Result<(), HeddleError>, ) -> Result<(), HeddleError>

Visit every logical object while decoding each shared frame once.

The index-to-frame membership is checked exactly before objects are yielded, closing both missing-entry and stale-alias corruption paths.

Source

pub fn copy_hosted_encoded_subset( &self, expected: &[(PackObjectId, ObjectType, u64)], ) -> Result<Option<EncodedPackSubset>, HeddleError>

Copy a validated subset of non-delta encoded entries into a standalone hosted transport pack without decoding or recompressing their bodies.

Ok(None) is a safe fallback signal: an expected object is absent, duplicated, has a different type/size, is delta encoded, or names a repository-local entry that may not cross the hosted pack boundary.

Source

pub fn get_object( &self, id: &PackObjectId, ) -> Result<Option<(ObjectType, Vec<u8>)>, HeddleError>

Get an object from the pack.

Verifies that the tagged id at the indexed offset matches id before returning. A stale .idx file (e.g., overwritten in place after a pack rebuild) can otherwise route a request for hash A to a record physically located at hash B’s offset — same shape, different content, no error signal. This cheap 32-byte id comparison catches that without paying a full content-hash recompute on every read; corruption strictly inside the record body is a separate failure mode surfaced via the consumer-side hash verify (see FsStore::loose_blob_path for the blob equivalent).

Source

pub fn get_hashed_object( &self, hash: &ContentHash, ) -> Result<Option<(ObjectType, Vec<u8>)>, HeddleError>

Source

pub fn get_hashed_object_type( &self, hash: &ContentHash, ) -> Result<Option<ObjectType>, HeddleError>

Read an object’s logical type from pack headers without reading or decoding its payload.

Delta entries inherit the type of their base, so this follows only the tagged base ids and headers until it reaches a non-delta entry. No compressed or delta payload bytes are decoded. Missing hashes return Ok(None).

Source

pub fn get_object_bytes( &self, id: &PackObjectId, ) -> Result<Option<(ObjectType, Bytes)>, HeddleError>

Zero-copy fast path: when the entry is non-delta and stored uncompressed, returns Bytes::slice into the pack’s (mmap-backed) buffer — no allocation, no memcpy. Compressed or delta entries fall back to get_object and wrap the resulting Vec<u8> in a Bytes (one Arc, no body copy).

Use this from the hot read path. The 10 MB benchmark gap between the mount and vanilla FS at the 1 MB+ tier is the per-blob memcpy this method eliminates.

Source

pub fn get_hashed_object_bytes( &self, hash: &ContentHash, ) -> Result<Option<(ObjectType, Bytes)>, HeddleError>

Source

pub fn get_hashed_object_size( &self, hash: &ContentHash, ) -> Result<Option<u64>, HeddleError>

Read just the type+size header for an object without decompressing its payload. Returns Ok(None) when the object isn’t in this pack.

For non-delta entries this is one varint decode at the indexed offset — much cheaper than get_object. Delta entries fall back to a full read because their resolved size requires chasing the base; in practice deltas are rare in the directory listing hot path so the fallback is acceptable.

Auto Trait Implementations§

§

impl<'a> !Freeze for PackReader<'a>

§

impl<'a> RefUnwindSafe for PackReader<'a>

§

impl<'a> Send for PackReader<'a>

§

impl<'a> Sync for PackReader<'a>

§

impl<'a> Unpin for PackReader<'a>

§

impl<'a> UnsafeUnpin for PackReader<'a>

§

impl<'a> UnwindSafe for PackReader<'a>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more