From d6cb4f86136be499e7647ac87c40421ac27ce619 Mon Sep 17 00:00:00 2001 From: Christopher Hotchkiss Date: Fri, 24 Sep 2021 14:57:21 -0400 Subject: [PATCH] Implementation of trait for row data --- src/engine/io/row_formats/row_data.rs | 39 ++++++++++++++------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/src/engine/io/row_formats/row_data.rs b/src/engine/io/row_formats/row_data.rs index da2a6d5..825e230 100644 --- a/src/engine/io/row_formats/row_data.rs +++ b/src/engine/io/row_formats/row_data.rs @@ -5,6 +5,7 @@ use super::super::super::objects::Table; use super::super::super::transactions::TransactionId; use super::null_mask::NullMaskError; use super::{InfoMask, ItemPointer, ItemPointerError, NullMask}; +use crate::engine::io::format_traits::{Parseable, Serializable}; use crate::engine::io::{ConstEncodedSize, EncodedSize, SelfEncodedSize}; use crate::engine::objects::types::{BaseSqlTypes, BaseSqlTypesError, SqlTypeDefinition}; use crate::engine::objects::SqlTuple; @@ -61,24 +62,6 @@ impl RowData { .ok_or_else(|| RowDataError::UnexpectedNull(name.to_string())) } - pub fn serialize(&self, buffer: &mut impl BufMut) { - buffer.put_u64_le(self.min.get_u64()); - buffer.put_u64_le(self.max.unwrap_or_else(|| TransactionId::new(0)).get_u64()); - self.item_pointer.serialize(buffer); - - //If there is null we add it to the flags and write a nullmask - let mut mask = InfoMask::empty(); - if self.user_data.iter().any(|x| x.is_none()) { - mask = InfoMask::HAS_NULL; - buffer.put_u8(mask.bits()); - buffer.put(NullMask::serialize(&self.user_data)); - } else { - buffer.put_u8(mask.bits()); - } - - self.user_data.serialize(buffer); - } - pub fn parse(table: Arc, row_buffer: &mut impl Buf) -> Result { if row_buffer.remaining() < TransactionId::encoded_size() { return Err(RowDataError::MissingMinData( @@ -186,6 +169,26 @@ impl EncodedSize<&SqlTuple> for RowData { } } +impl Serializable for RowData { + fn serialize(&self, buffer: &mut impl BufMut) { + buffer.put_u64_le(self.min.get_u64()); + buffer.put_u64_le(self.max.unwrap_or_else(|| TransactionId::new(0)).get_u64()); + self.item_pointer.serialize(buffer); + + //If there is null we add it to the flags and write a nullmask + let mut mask = InfoMask::empty(); + if self.user_data.iter().any(|x| x.is_none()) { + mask = InfoMask::HAS_NULL; + buffer.put_u8(mask.bits()); + buffer.put(NullMask::serialize(&self.user_data)); + } else { + buffer.put_u8(mask.bits()); + } + + self.user_data.serialize(buffer); + } +} + #[derive(Debug, Error)] pub enum RowDataError { #[error(transparent)]