sqlx_core_oldapi/mysql/io/
buf.rs

1use bytes::{Buf, Bytes};
2
3use crate::error::Error;
4use crate::io::BufExt;
5
6pub trait MySqlBufExt: Buf {
7    // Read a length-encoded integer.
8    // NOTE: 0xfb or NULL is only returned for binary value encoding to indicate NULL.
9    // NOTE: 0xff is only returned during a result set to indicate ERR.
10    // <https://dev.mysql.com/doc/internals/en/integer.html#packet-Protocol::LengthEncodedInteger>
11    fn get_uint_lenenc(&mut self) -> u64;
12
13    // Read a length-encoded string.
14    #[allow(dead_code)]
15    fn get_str_lenenc(&mut self) -> Result<String, Error>;
16
17    // Read a length-encoded byte sequence.
18    fn get_bytes_lenenc(&mut self) -> Bytes;
19}
20
21impl MySqlBufExt for Bytes {
22    fn get_uint_lenenc(&mut self) -> u64 {
23        match self.get_u8() {
24            0xfc => u64::from(self.get_u16_le()),
25            0xfd => self.get_uint_le(3),
26            0xfe => self.get_u64_le(),
27
28            v => u64::from(v),
29        }
30    }
31
32    fn get_str_lenenc(&mut self) -> Result<String, Error> {
33        let size = self.get_uint_lenenc();
34        self.get_str(size as usize)
35    }
36
37    fn get_bytes_lenenc(&mut self) -> Bytes {
38        let size = self.get_uint_lenenc();
39        self.split_to(size as usize)
40    }
41}