pub struct LazyWalReader { /* private fields */ }Expand description
Lazy WAL reader that separates header reading from payload reading.
Implementations§
Source§impl LazyWalReader
impl LazyWalReader
Sourcepub fn open(path: &Path, keys: Option<&KeyRing>) -> Result<Self>
pub fn open(path: &Path, keys: Option<&KeyRing>) -> Result<Self>
Open a WAL file for lazy reading.
A leading WALP preamble is consumed so headers are read from the first
real record; segments written without encryption have none and start at
offset 0.
keys must be the key ring this segment was written under, or None
for a segment that was never encrypted.
Sourcepub fn segment_preamble(&self) -> Option<&SegmentPreamble>
pub fn segment_preamble(&self) -> Option<&SegmentPreamble>
The preamble read from this segment file, if present.
Returns None for unencrypted segments (no preamble written).
Sourcepub fn stop_reason(&self) -> Option<StopReason>
pub fn stop_reason(&self) -> Option<StopReason>
Why iteration stopped, or None while headers are still being read.
Feed this to crate::torn_tail::verify_committed_prefix to tell an
unfsynced tail apart from a hole with committed records behind it.
Sourcepub fn next_header(&mut self) -> Result<Option<RecordHeader>>
pub fn next_header(&mut self) -> Result<Option<RecordHeader>>
Read the next record header without reading the payload.
Returns None at EOF or first corruption. Returns Err for a format
version this build cannot read at the segment’s first record, and the
caller must stop at that Err. After a header, use either
read_payload() to get the payload or skip_payload() to seek past it.
Alignment padding records are consumed internally — the caller only ever sees real records.
Sourcepub fn read_payload(&mut self, header: &RecordHeader) -> Result<Vec<u8>>
pub fn read_payload(&mut self, header: &RecordHeader) -> Result<Vec<u8>>
Read the payload for a header that was just returned by next_header(),
decrypting it if the record is encrypted.
Must be called exactly once after next_header() returns Some,
and before calling next_header() again (unless skip_payload()
was called instead).
Sourcepub fn read_record(&mut self, header: &RecordHeader) -> Result<WalRecord>
pub fn read_record(&mut self, header: &RecordHeader) -> Result<WalRecord>
Read the payload and return a full plaintext WalRecord.
The returned record is indistinguishable from one written without
encryption: the flag is cleared and the CRC is recomputed, so downstream
logical_record_type() dispatch and verify_checksum() both hold.
Sourcepub fn skip_payload(&mut self, header: &RecordHeader) -> Result<()>
pub fn skip_payload(&mut self, header: &RecordHeader) -> Result<()>
Skip the payload for a header, seeking forward without reading.
This is the key optimization: non-matching records skip I/O entirely.
Auto Trait Implementations§
impl !Sync for LazyWalReader
impl Freeze for LazyWalReader
impl RefUnwindSafe for LazyWalReader
impl Send for LazyWalReader
impl Unpin for LazyWalReader
impl UnsafeUnpin for LazyWalReader
impl UnwindSafe for LazyWalReader
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.