Skip to main content

elefant_client/protocol/
messages.rs

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}