Skip to main content

MessageReader

Struct MessageReader 

Source
pub struct MessageReader { /* private fields */ }
Expand description

Cancellation-safe backend message reader.

PostgreSQL backend messages span multiple read operations (5-byte header, then a variable payload). A naive implementation using read_exact is not cancellation-safe: if the future is dropped between reads (e.g. by tokio::select! or tokio::time::timeout), bytes already pulled from the underlying stream are lost and the next read mis-parses the wire stream.

MessageReader externalizes the partial-read state so it survives across dropped futures. Each call to read uses one-shot AsyncReadExt::read (which is cancel-safe) and accumulates progress on self. If the returned future is dropped, no bytes are lost; the next invocation resumes from where the previous one left off.

Implementations§

Source§

impl MessageReader

Source

pub fn new() -> Self

Source

pub fn with_capacity(capacity: usize) -> Self

Source

pub fn with_max_message_size(self, max: usize) -> Self

Refuse any message whose payload is larger than max bytes.

max is compared against the message’s length field minus 4, so it excludes the tag and the length field itself. The payload buffer is sized from the length the server announces, so this bounds the memory one message can take. It can only lower the limit: a value above MAX_MESSAGE_SIZE, the default, is capped to it.

A refused message is terminal. Its payload is left on the wire, so the reader cannot resynchronize and every later read returns the same PgWireError::MessageTooLarge. Discard the reader and the connection.

Source

pub async fn read<R: AsyncRead + Unpin>( &mut self, rd: &mut R, ) -> Result<BackendMessage>

Read the next complete backend message.

Cancellation-safe: dropping the returned future preserves all progress so far on self. Re-call to resume.

Trait Implementations§

Source§

impl Default for MessageReader

Source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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 = !

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

fn try_from(value: U) -> Result<T, !>

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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