MCPcopy Create free account
hub / github.com/erans/pgsqlite / decode_normal_message

Function decode_normal_message

src/protocol/codec.rs:113–203  ·  view source on GitHub ↗
(src: &mut BytesMut)

Source from the content-addressed store, hash-verified

111}
112
113fn decode_normal_message(src: &mut BytesMut) -> io::Result<Option<FrontendMessage>> {
114 if src.len() < 5 {
115 return Ok(None);
116 }
117
118 let msg_type = src[0];
119 let len = (&src[1..5]).get_i32() as usize;
120
121 if src.len() < len + 1 {
122 return Ok(None);
123 }
124
125 let msg_bytes = src.split_to(len + 1);
126 let mut msg_buf = &msg_bytes[5..]; // Skip type and length
127
128 match msg_type {
129 b'Q' => {
130 let query = read_cstring(&mut msg_buf)?;
131 Ok(Some(FrontendMessage::Query(query)))
132 }
133 b'P' => {
134 let name = read_cstring(&mut msg_buf)?;
135 let query = read_cstring(&mut msg_buf)?;
136 let param_count = msg_buf.get_i16();
137 let mut param_types = Vec::new();
138 for _ in 0..param_count {
139 param_types.push(msg_buf.get_i32());
140 }
141 Ok(Some(FrontendMessage::Parse { name, query, param_types }))
142 }
143 b'B' => {
144 let portal = read_cstring(&mut msg_buf)?;
145 let statement = read_cstring(&mut msg_buf)?;
146
147 let format_count = msg_buf.get_i16();
148 let mut formats = Vec::new();
149 for _ in 0..format_count {
150 formats.push(msg_buf.get_i16());
151 }
152
153 let value_count = msg_buf.get_i16();
154 let mut values = Vec::new();
155 for _ in 0..value_count {
156 let len = msg_buf.get_i32();
157 if len == -1 {
158 values.push(None);
159 } else {
160 let mut value = vec![0u8; len as usize];
161 msg_buf.copy_to_slice(&mut value);
162 values.push(Some(value));
163 }
164 }
165
166 let result_format_count = msg_buf.get_i16();
167 let mut result_formats = Vec::new();
168 for _ in 0..result_format_count {
169 result_formats.push(msg_buf.get_i16());
170 }

Callers 1

decodeMethod · 0.85

Calls 3

read_cstringFunction · 0.85
QueryClass · 0.85
lenMethod · 0.45

Tested by

no test coverage detected