From 84ac3652415b662aae9580c008a5aa996d58c9f4 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Sat, 3 May 2025 00:15:02 +0300 Subject: Rename to AutereDB --- autere_db/src/row.rs | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 autere_db/src/row.rs (limited to 'autere_db/src/row.rs') diff --git a/autere_db/src/row.rs b/autere_db/src/row.rs new file mode 100644 index 0000000..d8140d2 --- /dev/null +++ b/autere_db/src/row.rs @@ -0,0 +1,70 @@ +use super::*; + +#[derive(Debug, Clone)] +pub struct Row { + pub values: Vec, + pub tombstone: bool, +} + +impl Row { + pub fn serialize(&self) -> Vec { + let mut bytes = Vec::new(); + + if self.tombstone { + bytes.extend(&[B_TOMBSTONE]); + } else { + bytes.extend(&[B_LIVE]); + } + + for value in &self.values { + bytes.extend(value.serialize()); + } + bytes + } + + pub fn deserialize(bytes: &[u8]) -> Row { + assert!(bytes.len() > 0); + + let mut values = Vec::new(); + + let tombstone = bytes[0] == B_TOMBSTONE; + + let mut start = 1; + while start < bytes.len() { + let (rv, consumed) = Value::deserialize(&bytes[start..]); + values.push(rv); + start += consumed; + } + Row { values, tombstone } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_record_serialize_deserialize() { + let record = Row { + values: vec![ + Value::Int(1), + Value::String("hello".to_string()), + Value::Bytes(vec![0, 1, 2, 3]), + ], + tombstone: true, + }; + + let serialized = record.serialize(); + let deserialized = Row::deserialize(&serialized); + let reserialized = deserialized.serialize(); + + assert_eq!(serialized.len(), reserialized.len()); + assert_eq!(record.values, deserialized.values); + } +} + +#[derive(Clone, Debug)] +pub enum TxEntry { + Upsert { row: Row }, + Delete { row: Row }, +} -- cgit v1.3