zero_postgres/protocol/backend/
extended.rs1use zerocopy::{FromBytes, Immutable, KnownLayout};
4
5use crate::error::{Error, Result};
6use crate::protocol::codec::read_u32;
7use crate::protocol::types::Oid;
8use zerocopy::byteorder::big_endian::U16 as U16BE;
9
10#[derive(Debug, Clone, Copy)]
12pub struct ParseComplete;
13
14impl ParseComplete {
15 pub fn parse(_payload: &[u8]) -> Result<Self> {
17 Ok(Self)
18 }
19}
20
21#[derive(Debug, Clone, Copy)]
23pub struct BindComplete;
24
25impl BindComplete {
26 pub fn parse(_payload: &[u8]) -> Result<Self> {
28 Ok(Self)
29 }
30}
31
32#[derive(Debug, Clone, Copy)]
34pub struct CloseComplete;
35
36impl CloseComplete {
37 pub fn parse(_payload: &[u8]) -> Result<Self> {
39 Ok(Self)
40 }
41}
42
43#[derive(Debug, Clone, Copy)]
45pub struct NoData;
46
47impl NoData {
48 pub fn parse(_payload: &[u8]) -> Result<Self> {
50 Ok(Self)
51 }
52}
53
54#[derive(Debug, Clone, Copy)]
56pub struct PortalSuspended;
57
58impl PortalSuspended {
59 pub fn parse(_payload: &[u8]) -> Result<Self> {
61 Ok(Self)
62 }
63}
64
65#[derive(Debug, Clone, Copy, FromBytes, KnownLayout, Immutable)]
67#[repr(C, packed)]
68pub struct ParameterDescriptionHead {
69 pub num_params: U16BE,
71}
72
73#[derive(Debug, Clone)]
75pub struct ParameterDescription {
76 param_oids: Vec<Oid>,
78}
79
80impl ParameterDescription {
81 pub fn parse(payload: &[u8]) -> Result<Self> {
83 let head = ParameterDescriptionHead::ref_from_bytes(&payload[..2])
84 .map_err(|e| Error::Protocol(format!("ParameterDescription header: {e:?}")))?;
85
86 let num_params = head.num_params.get() as usize;
87 let mut param_oids = Vec::with_capacity(num_params);
88 let mut data = &payload[2..];
89
90 for _ in 0..num_params {
91 let (oid, rest) = read_u32(data)?;
92 param_oids.push(oid);
93 data = rest;
94 }
95
96 Ok(Self { param_oids })
97 }
98
99 pub fn len(&self) -> usize {
101 self.param_oids.len()
102 }
103
104 pub fn is_empty(&self) -> bool {
106 self.param_oids.is_empty()
107 }
108
109 pub fn oids(&self) -> &[Oid] {
111 &self.param_oids
112 }
113
114 pub fn iter(&self) -> impl Iterator<Item = &Oid> {
116 self.param_oids.iter()
117 }
118}