zero_postgres/protocol/backend/
copy.rs1use crate::error::Result;
4use crate::protocol::codec::{read_u8, read_u16};
5use crate::protocol::types::FormatCode;
6
7#[derive(Debug, Clone)]
9pub struct CopyInResponse {
10 pub format: FormatCode,
12 pub column_formats: Vec<FormatCode>,
14}
15
16impl CopyInResponse {
17 pub fn parse(payload: &[u8]) -> Result<Self> {
19 let (format_byte, rest) = read_u8(payload)?;
20 let format = FormatCode::from_u16(format_byte as u16);
21
22 let (num_columns, mut rest) = read_u16(rest)?;
23 let mut column_formats = Vec::with_capacity(num_columns as usize);
24
25 for _ in 0..num_columns {
26 let (fmt, remaining) = read_u16(rest)?;
27 column_formats.push(FormatCode::from_u16(fmt));
28 rest = remaining;
29 }
30
31 Ok(Self {
32 format,
33 column_formats,
34 })
35 }
36
37 pub fn is_binary(&self) -> bool {
39 matches!(self.format, FormatCode::Binary)
40 }
41}
42
43#[derive(Debug, Clone)]
45pub struct CopyOutResponse {
46 pub format: FormatCode,
48 pub column_formats: Vec<FormatCode>,
50}
51
52impl CopyOutResponse {
53 pub fn parse(payload: &[u8]) -> Result<Self> {
55 let (format_byte, rest) = read_u8(payload)?;
56 let format = FormatCode::from_u16(format_byte as u16);
57
58 let (num_columns, mut rest) = read_u16(rest)?;
59 let mut column_formats = Vec::with_capacity(num_columns as usize);
60
61 for _ in 0..num_columns {
62 let (fmt, remaining) = read_u16(rest)?;
63 column_formats.push(FormatCode::from_u16(fmt));
64 rest = remaining;
65 }
66
67 Ok(Self {
68 format,
69 column_formats,
70 })
71 }
72
73 pub fn is_binary(&self) -> bool {
75 matches!(self.format, FormatCode::Binary)
76 }
77}
78
79#[derive(Debug, Clone)]
81pub struct CopyBothResponse {
82 pub format: FormatCode,
84 pub column_formats: Vec<FormatCode>,
86}
87
88impl CopyBothResponse {
89 pub fn parse(payload: &[u8]) -> Result<Self> {
91 let (format_byte, rest) = read_u8(payload)?;
92 let format = FormatCode::from_u16(format_byte as u16);
93
94 let (num_columns, mut rest) = read_u16(rest)?;
95 let mut column_formats = Vec::with_capacity(num_columns as usize);
96
97 for _ in 0..num_columns {
98 let (fmt, remaining) = read_u16(rest)?;
99 column_formats.push(FormatCode::from_u16(fmt));
100 rest = remaining;
101 }
102
103 Ok(Self {
104 format,
105 column_formats,
106 })
107 }
108}