From 7942c651a707521d6bd3271b93f67c2c8dac43c3 Mon Sep 17 00:00:00 2001 From: Almog Gavra Date: Wed, 4 Jun 2025 09:35:42 -0700 Subject: [PATCH] remove optionality of field dictionary --- FORMAT.md | 2 +- README.md | 3 +-- src/serde.rs | 40 ++++++++++++++++------------------------ src/types.rs | 9 ++------- src/writer.rs | 2 +- 5 files changed, 21 insertions(+), 35 deletions(-) diff --git a/FORMAT.md b/FORMAT.md index b334ede..742d004 100644 --- a/FORMAT.md +++ b/FORMAT.md @@ -21,7 +21,7 @@ Byte: 0 1 2 3-6 7-10 11-14 ``` Flags: -- `0x01`: Field directory is present +- Reserved, currently there are no active flags ## Field Directory diff --git a/README.md b/README.md index 986bbf3..4417af1 100644 --- a/README.md +++ b/README.md @@ -93,8 +93,7 @@ record: | Bit | Name | Meaning | |-----|------------------------|--------------------------------------| -| 0 | `FLAG_FIELD_DIRECTORY` | Whether a field directory is present | -| 1-7 | _reserved_ | Must be `0` in v1 | +| 0-7 | _reserved_ | Must be `0` in v1 | Schemas in Imprint have two components: diff --git a/src/serde.rs b/src/serde.rs index fc210d6..e54a976 100644 --- a/src/serde.rs +++ b/src/serde.rs @@ -428,22 +428,16 @@ impl Write for ImprintRecord { let header_size = HEADER_BYTES; let dir_count_size = DIR_COUNT_BYTES; - let dir_entries_size = if self.header.flags.has_field_directory() { - self.directory.len() * DIR_ENTRY_BYTES - } else { - 0 - }; + let dir_entries_size = self.directory.len() * DIR_ENTRY_BYTES; let payload_size = self.payload.len(); buf.reserve(header_size + dir_count_size + dir_entries_size + payload_size); self.header.write(buf)?; - if self.header.flags.has_field_directory() { - varint::encode(self.directory.len() as u32, buf); - for entry in &self.directory { - entry.write(buf)?; - } + varint::encode(self.directory.len() as u32, buf); + for entry in &self.directory { + entry.write(buf)?; } buf.put_slice(&self.payload); @@ -461,17 +455,15 @@ impl Read for ImprintRecord { bytes_read += header_size; let mut directory = Vec::new(); - if header.flags.has_field_directory() { - let (count, count_size) = varint::decode(bytes.clone())?; - bytes.advance(count_size); - bytes_read += count_size; - - for _ in 0..count { - let (entry, entry_size) = DirectoryEntry::read(bytes.clone())?; - bytes.advance(entry_size); - bytes_read += entry_size; - directory.push(entry); - } + let (count, count_size) = varint::decode(bytes.clone())?; + bytes.advance(count_size); + bytes_read += count_size; + + for _ in 0..count { + let (entry, entry_size) = DirectoryEntry::read(bytes.clone())?; + bytes.advance(entry_size); + bytes_read += entry_size; + directory.push(entry); } let payload = bytes.slice(..header.payload_size as usize); @@ -627,7 +619,7 @@ mod tests { // Then the outer record metadata should be preserved assert_eq!(deserialized_record.header.schema_id.fieldspace_id, 1); assert_eq!(deserialized_record.header.schema_id.schema_hash, 0xdeadbeef); - assert_eq!(deserialized_record.header.flags.0, Flags::FIELD_DIRECTORY); + assert_eq!(deserialized_record.header.flags, Flags::new(0)); assert_eq!(deserialized_record.directory.len(), 2); // And the outer record values should match @@ -639,7 +631,7 @@ mod tests { if let Value::Row(inner) = got_row { assert_eq!(inner.header.schema_id.fieldspace_id, 2); assert_eq!(inner.header.schema_id.schema_hash, 0xcafebabe); - assert_eq!(inner.header.flags.0, Flags::FIELD_DIRECTORY); + assert_eq!(inner.header.flags, Flags::new(0)); assert_eq!(inner.directory.len(), 2); let got_inner_int = inner.get_value(1).unwrap().unwrap(); @@ -690,7 +682,7 @@ mod tests { // Verify metadata prop_assert_eq!(record.header.schema_id.fieldspace_id, 1); prop_assert_eq!(record.header.schema_id.schema_hash, 0xdeadbeef); - prop_assert_eq!(record.header.flags.0, Flags::FIELD_DIRECTORY); + prop_assert_eq!(record.header.flags, Flags::new(0)); prop_assert_eq!(record.directory.len(), 8); // Verify all values are preserved diff --git a/src/types.rs b/src/types.rs index d45cf6d..7900a55 100644 --- a/src/types.rs +++ b/src/types.rs @@ -10,20 +10,15 @@ pub const MAGIC: u8 = 0x49; pub const VERSION: u8 = 0x01; /// Flags that control how to deserialize the record +/// There are currently no flags but this is reserved +/// for future use. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Flags(pub(crate) u8); impl Flags { - /// Whether a field directory is present in the record - pub const FIELD_DIRECTORY: u8 = 0x01; - pub fn new(flags: u8) -> Self { Self(flags) } - - pub fn has_field_directory(&self) -> bool { - self.0 & Self::FIELD_DIRECTORY != 0 - } } /// Type codes for field values diff --git a/src/writer.rs b/src/writer.rs index e9d0c75..b959040 100644 --- a/src/writer.rs +++ b/src/writer.rs @@ -43,7 +43,7 @@ impl ImprintWriter { } let header = Header { - flags: Flags::new(Flags::FIELD_DIRECTORY), + flags: Flags::new(0), schema_id: self.schema_id, payload_size: payload.len() as u32, };