diff options
Diffstat (limited to 'autere_db/src/row.rs')
| -rw-r--r-- | autere_db/src/row.rs | 70 |
1 files changed, 70 insertions, 0 deletions
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<Value>, + pub tombstone: bool, +} + +impl Row { + pub fn serialize(&self) -> Vec<u8> { + 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 }, +} |
