1use crate::protocol::frontend_p_message::FrontendPMessage;
2use std::borrow::Cow;
3
4#[derive(Debug, PartialEq, Eq)]
5pub enum BackendMessage<'a> {
6 AuthenticationOk,
7 AuthenticationKerberosV5,
8 AuthenticationCleartextPassword,
9 AuthenticationMD5Password(AuthenticationMD5Password),
10 AuthenticationGSS,
11 AuthenticationGSSContinue(AuthenticationGSSContinue<'a>),
12 AuthenticationSSPI,
13 AuthenticationSASL(AuthenticationSASL<'a>),
14 AuthenticationSASLContinue(AuthenticationSASLContinue<'a>),
15 AuthenticationSASLFinal(AuthenticationSASLFinal<'a>),
16 BackendKeyData(BackendKeyData),
17 BindComplete,
18 CloseComplete,
19 CommandComplete(CommandComplete<'a>),
20 CopyData(CopyData<'a>),
21 CopyDone,
22 CopyInResponse(CopyResponse),
23 CopyOutResponse(CopyResponse),
24 CopyBothResponse(CopyResponse),
25 DataRow(DataRow<'a>),
26 EmptyQueryResponse,
27 ErrorResponse(ErrorResponse<'a>),
28 FunctionCallResponse(FunctionCallResponse<'a>),
29 NegotiateProtocolVersion(NegotiateProtocolVersion<'a>),
30 NoData,
31 NoticeResponse(ErrorResponse<'a>),
32 NotificationResponse(NotificationResponse<'a>),
33 ParameterDescription(ParameterDescription),
34 ParameterStatus(ParameterStatus<'a>),
35 ParseComplete,
36 PortalSuspended,
37 ReadyForQuery(ReadyForQuery),
38 RowDescription(RowDescription),
39}
40
41#[derive(Debug, PartialEq, Eq)]
42pub struct AuthenticationMD5Password {
43 pub salt: [u8; 4],
44}
45
46#[derive(Debug, PartialEq, Eq)]
47pub struct AuthenticationGSSContinue<'a> {
48 pub data: &'a [u8],
49}
50
51#[derive(Debug, PartialEq, Eq)]
52pub struct AuthenticationSASL<'a> {
53 pub mechanisms: Vec<Cow<'a, str>>,
54}
55
56#[derive(Debug, PartialEq, Eq)]
57pub struct AuthenticationSASLContinue<'a> {
58 pub data: &'a [u8],
59}
60
61#[derive(Debug, PartialEq, Eq)]
62pub struct AuthenticationSASLFinal<'a> {
63 pub outcome: &'a [u8],
64}
65
66#[derive(Debug, PartialEq, Eq)]
67pub struct BackendKeyData {
68 pub process_id: i32,
69 pub secret_key: i32,
70}
71
72#[derive(Debug, PartialEq, Eq)]
73pub struct CommandComplete<'a> {
74 pub tag: Cow<'a, str>,
75}
76
77#[derive(Debug, PartialEq, Eq)]
78pub struct CopyResponse {
79 pub format: ValueFormat,
80 pub column_formats: Vec<ValueFormat>,
81}
82
83#[derive(Debug, PartialEq, Eq)]
84pub struct DataRow<'a> {
85 pub values: Vec<Option<&'a [u8]>>,
86}
87
88#[derive(Debug, PartialEq, Eq)]
89pub struct ErrorResponse<'a> {
90 pub fields: Vec<ErrorField<'a>>,
91}
92
93#[derive(Debug, PartialEq, Eq)]
94pub struct ErrorField<'a> {
95 pub field_type: u8,
96 pub value: Cow<'a, str>,
97}
98
99#[derive(Debug, PartialEq, Eq)]
100pub struct FunctionCallResponse<'a> {
101 pub value: Option<&'a [u8]>,
102}
103
104#[derive(Debug, PartialEq, Eq)]
105pub struct NegotiateProtocolVersion<'a> {
106 pub newest_protocol_version: i32,
107 pub protocol_options: Vec<Cow<'a, str>>,
108}
109
110#[derive(Debug, PartialEq, Eq)]
111pub struct NotificationResponse<'a> {
112 pub process_id: i32,
113 pub channel: Cow<'a, str>,
114 pub payload: Cow<'a, str>,
115}
116
117#[derive(Debug, PartialEq, Eq, Clone)]
118pub struct ParameterDescription {
119 pub types: Vec<i32>,
120}
121
122#[derive(Debug, PartialEq, Eq)]
123pub struct ReadyForQuery {
124 pub current_transaction_status: CurrentTransactionStatus,
125}
126
127#[derive(Debug, Clone, Copy, PartialEq, Eq)]
128pub enum CurrentTransactionStatus {
129 Idle,
130 InTransaction,
131 InFailedTransaction,
132}
133
134#[derive(Debug, PartialEq, Eq)]
135pub struct ParameterStatus<'a> {
136 pub name: Cow<'a, str>,
137 pub value: Cow<'a, str>,
138}
139
140#[derive(Debug, PartialEq, Eq, Clone)]
141pub struct RowDescription {
142 pub fields: Vec<FieldDescription>,
143}
144
145#[derive(Debug, PartialEq, Eq, Clone)]
146pub struct FieldDescription {
147 pub name: String,
148 pub table_oid: i32,
149 pub column_attribute_number: i16,
150 pub data_type_oid: i32,
151 pub data_type_size: i16,
152 pub type_modifier: i32,
153 pub format: ValueFormat,
154}
155
156#[derive(Debug, PartialEq, Eq)]
157pub enum FrontendMessage<'a> {
158 Bind(Bind<'a>),
159 CancelRequest(CancelRequest),
160 Close(Close<'a>),
161 CopyData(CopyData<'a>),
162 CopyDone,
163 CopyFail(CopyFail<'a>),
164 Describe(Describe<'a>),
165 Execute(Execute<'a>),
166 Flush,
167 FunctionCall(FunctionCall<'a>),
168 GSSENCRequest,
169 FrontendPMessage(FrontendPMessage<'a>),
170 Parse(Parse<'a>),
171 Query(Query<'a>),
172 SSLRequest,
173 StartupMessage(StartupMessage<'a>),
174 Sync,
175 Terminate,
176}
177
178#[derive(Debug, PartialEq, Eq)]
179pub struct Bind<'a> {
180 pub destination_portal_name: Cow<'a, str>,
181 pub source_statement_name: Cow<'a, str>,
182 pub parameter_formats: Vec<ValueFormat>,
183 pub parameter_values: Vec<Option<&'a [u8]>>,
184 pub result_column_formats: Vec<ValueFormat>,
185}
186
187#[derive(Debug, PartialEq, Eq, Clone)]
188pub enum ValueFormat {
189 Text,
190 Binary,
191}
192
193#[derive(Debug, PartialEq, Eq)]
194pub struct CancelRequest {
195 pub process_id: i32,
196 pub secret_key: i32,
197}
198
199#[derive(Debug, PartialEq, Eq)]
200pub struct Close<'a> {
201 pub target: CloseType,
202 pub name: Cow<'a, str>,
203}
204
205#[derive(Debug, PartialEq, Eq)]
206pub enum CloseType {
207 Statement,
208 Portal,
209}
210
211#[derive(Debug, PartialEq, Eq)]
212pub struct CopyData<'a> {
213 pub data: &'a [u8],
214}
215
216#[derive(Debug, PartialEq, Eq)]
217pub struct CopyFail<'a> {
218 pub message: Cow<'a, str>,
219}
220
221#[derive(Debug, PartialEq, Eq)]
222pub struct Describe<'a> {
223 pub target: DescribeTarget,
224 pub name: Cow<'a, str>,
225}
226
227#[derive(Debug, PartialEq, Eq)]
228pub enum DescribeTarget {
229 Statement,
230 Portal,
231}
232
233#[derive(Debug, PartialEq, Eq)]
234pub struct Execute<'a> {
235 pub portal_name: Cow<'a, str>,
236 pub max_rows: i32,
237}
238
239#[derive(Debug, PartialEq, Eq)]
240pub struct FunctionCall<'a> {
241 pub object_id: i32,
242 pub argument_formats: Vec<ValueFormat>,
243 pub arguments: Vec<Option<&'a [u8]>>,
244 pub result_format: ValueFormat,
245}
246
247#[derive(Debug, PartialEq, Eq)]
248pub struct Parse<'a> {
249 pub destination: Cow<'a, str>,
250 pub query: Cow<'a, str>,
251 pub parameter_types: Vec<i32>,
252}
253
254#[derive(Debug, PartialEq, Eq)]
255pub struct Query<'a> {
256 pub query: Cow<'a, str>,
257}
258
259#[derive(Debug, PartialEq, Eq)]
260pub struct StartupMessage<'a> {
261 pub parameters: Vec<StartupMessageParameter<'a>>,
262}
263
264#[derive(Debug, PartialEq, Eq)]
265pub struct StartupMessageParameter<'a> {
266 pub name: Cow<'a, str>,
267 pub value: Cow<'a, str>,
268}
269
270impl StartupMessageParameter<'_> {
271 pub fn new<'a>(name: &'a str, value: &'a str) -> StartupMessageParameter<'a> {
272 StartupMessageParameter {
273 name: Cow::Borrowed(name),
274 value: Cow::Borrowed(value),
275 }
276 }
277}