From cb53559bce3fa4d6c10876566d1283ad94574d21 Mon Sep 17 00:00:00 2001 From: Daniel Akhterov Date: Fri, 14 Jun 2019 19:22:30 -0700 Subject: [PATCH] Add functions to deserialize all datatypes --- mason-mariadb/src/protocol/deserialize.rs | 72 +++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 mason-mariadb/src/protocol/deserialize.rs diff --git a/mason-mariadb/src/protocol/deserialize.rs b/mason-mariadb/src/protocol/deserialize.rs new file mode 100644 index 00000000..05c02922 --- /dev/null +++ b/mason-mariadb/src/protocol/deserialize.rs @@ -0,0 +1,72 @@ +use byteorder::{ByteOrder, LittleEndian}; +use bytes::Bytes; + +#[inline] +pub fn deserialize_int_lenenc(buf: &Vec, index: &usize) -> (Option, usize) { + match buf[*index] { + 0xFB => (None, *index + 1), + 0xFC => (Some(LittleEndian::read_u16(&buf[*index + 1..]) as usize), *index + 2), + 0xFD => (Some((buf[*index + 1] + buf[*index + 2] << 8 + buf[*index + 3] << 16) as usize), *index + 3), + 0xFE => (Some(LittleEndian::read_u64(&buf[*index..]) as usize), *index + 8), + 0xFF => panic!("int unprocessable first byte 0xFF"), + _ => (Some(buf[*index] as usize), *index + 1), + } +} + +#[inline] +pub fn deserialize_int_4(buf: &Vec, index: &usize) -> (u32, usize) { + (LittleEndian::read_u32(&buf[*index..]), index + 3) +} + +#[inline] +pub fn deserialize_int_3(buf: &Vec, index: &usize) -> (u32, usize) { + (LittleEndian::read_u24(&buf[*index..]), index + 3) +} + +#[inline] +pub fn deserialize_int_2(buf: &Vec, index: &usize) -> (u16, usize) { + (LittleEndian::read_u16(&buf[*index..]), index + 2) +} + +#[inline] +pub fn deserialize_int_1(buf: &Vec, index: &usize) -> (u8, usize) { + (buf[*index], index + 1) +} + +#[inline] +pub fn deserialize_string_lenenc(buf: &Vec, index: &usize) -> (Bytes, usize) { + let (length, index) = deserialize_int_3(&buf, &index); + (Bytes::from(&buf[index..index + length as usize]), index + length as usize) +} + +#[inline] +pub fn deserialize_string_fix(buf: &Vec, index: &usize, length: usize) -> (Bytes, usize) { + (Bytes::from(&buf[*index..index + length as usize]), index + length as usize) +} + +#[inline] +pub fn deserialize_string_eof(buf: &Vec, index: &usize) -> (Bytes, usize) { + (Bytes::from(&buf[*index..]), buf.len()) +} + +#[inline] +pub fn deserialize_string_null(buf: &Vec, index: &usize) -> (Bytes, usize) { + let null_index = memchr::memchr(b'\0', &buf[*index..]).unwrap(); + (Bytes::from(&buf[*index..null_index]), null_index + 1) +} + +#[inline] +pub fn deserialize_byte_fix(buf: &Vec, index: &usize, length: usize) -> (Bytes, usize) { + (Bytes::from(&buf[*index..index + length as usize]), index + length as usize) +} + +#[inline] +pub fn deserialize_byte_lenenc(buf: &Vec, index: &usize) -> (Bytes, usize) { + let (length, index) = deserialize_int_3(&buf, &index); + (Bytes::from(&buf[index..index + length as usize]), index + length as usize) +} + +#[inline] +pub fn deserialize_byte_eof(buf: &Vec, index: &usize) -> (Bytes, usize) { + (Bytes::from(&buf[*index..]), buf.len()) +}