use crate::{
metadata::tables::{
document::DocumentRaw,
types::{RowWritable, TableInfoRef},
},
utils::write_le_at_dyn,
Result,
};
impl RowWritable for DocumentRaw {
fn row_write(
&self,
data: &mut [u8],
offset: &mut usize,
_rid: u32,
sizes: &TableInfoRef,
) -> Result<()> {
write_le_at_dyn(data, offset, self.name, sizes.is_large_blob())?;
write_le_at_dyn(data, offset, self.hash_algorithm, sizes.is_large_guid())?;
write_le_at_dyn(data, offset, self.hash, sizes.is_large_blob())?;
write_le_at_dyn(data, offset, self.language, sizes.is_large_guid())?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{
metadata::tables::types::{RowReadable, TableInfo, TableRow},
metadata::token::Token,
};
#[test]
fn test_round_trip_serialization_small_heaps() {
let original_row = DocumentRaw {
rid: 1,
token: Token::new(0x3000_0001),
offset: 0,
name: 42,
hash_algorithm: 15,
hash: 123,
language: 7,
};
let table_info = std::sync::Arc::new(TableInfo::new_test(&[], false, false, false));
let row_size = <DocumentRaw as TableRow>::row_size(&table_info) as usize;
let mut buffer = vec![0u8; row_size];
let mut offset = 0;
original_row
.row_write(&mut buffer, &mut offset, 1, &table_info)
.expect("Serialization should succeed");
let mut read_offset = 0;
let deserialized_row = DocumentRaw::row_read(&buffer, &mut read_offset, 1, &table_info)
.expect("Deserialization should succeed");
assert_eq!(original_row.name, deserialized_row.name);
assert_eq!(original_row.hash_algorithm, deserialized_row.hash_algorithm);
assert_eq!(original_row.hash, deserialized_row.hash);
assert_eq!(original_row.language, deserialized_row.language);
assert_eq!(offset, row_size, "Offset should match expected row size");
assert_eq!(
read_offset, row_size,
"Read offset should match expected row size"
);
}
#[test]
fn test_round_trip_serialization_large_heaps() {
let original_row = DocumentRaw {
rid: 2,
token: Token::new(0x3000_0002),
offset: 0,
name: 0x1ABCD,
hash_algorithm: 0x2BEEF,
hash: 0x3CAFE,
language: 0x4DEAD,
};
let table_info = std::sync::Arc::new(TableInfo::new_test(&[], false, true, true));
let row_size = <DocumentRaw as TableRow>::row_size(&table_info) as usize;
let mut buffer = vec![0u8; row_size];
let mut offset = 0;
original_row
.row_write(&mut buffer, &mut offset, 2, &table_info)
.expect("Serialization should succeed");
let mut read_offset = 0;
let deserialized_row = DocumentRaw::row_read(&buffer, &mut read_offset, 2, &table_info)
.expect("Deserialization should succeed");
assert_eq!(original_row.name, deserialized_row.name);
assert_eq!(original_row.hash_algorithm, deserialized_row.hash_algorithm);
assert_eq!(original_row.hash, deserialized_row.hash);
assert_eq!(original_row.language, deserialized_row.language);
assert_eq!(offset, row_size, "Offset should match expected row size");
assert_eq!(
read_offset, row_size,
"Read offset should match expected row size"
);
}
#[test]
fn test_known_binary_format_small_heaps() {
let document = DocumentRaw {
rid: 1,
token: Token::new(0x3000_0001),
offset: 0,
name: 0x1234,
hash_algorithm: 0x5678,
hash: 0x9ABC,
language: 0xDEF0,
};
let table_info = std::sync::Arc::new(TableInfo::new_test(&[], false, false, false));
let row_size = <DocumentRaw as TableRow>::row_size(&table_info) as usize;
let mut buffer = vec![0u8; row_size];
let mut offset = 0;
document
.row_write(&mut buffer, &mut offset, 1, &table_info)
.expect("Serialization should succeed");
assert_eq!(row_size, 8, "Row size should be 8 bytes for small heaps");
assert_eq!(buffer[0], 0x34);
assert_eq!(buffer[1], 0x12);
assert_eq!(buffer[2], 0x78);
assert_eq!(buffer[3], 0x56);
assert_eq!(buffer[4], 0xBC);
assert_eq!(buffer[5], 0x9A);
assert_eq!(buffer[6], 0xF0);
assert_eq!(buffer[7], 0xDE);
}
#[test]
fn test_known_binary_format_large_heaps() {
let document = DocumentRaw {
rid: 1,
token: Token::new(0x3000_0001),
offset: 0,
name: 0x12345678,
hash_algorithm: 0x9ABCDEF0,
hash: 0x11223344,
language: 0x55667788,
};
let table_info = std::sync::Arc::new(TableInfo::new_test(&[], false, true, true));
let row_size = <DocumentRaw as TableRow>::row_size(&table_info) as usize;
let mut buffer = vec![0u8; row_size];
let mut offset = 0;
document
.row_write(&mut buffer, &mut offset, 1, &table_info)
.expect("Serialization should succeed");
assert_eq!(row_size, 16, "Row size should be 16 bytes for large heaps");
assert_eq!(buffer[0], 0x78);
assert_eq!(buffer[1], 0x56);
assert_eq!(buffer[2], 0x34);
assert_eq!(buffer[3], 0x12);
assert_eq!(buffer[4], 0xF0);
assert_eq!(buffer[5], 0xDE);
assert_eq!(buffer[6], 0xBC);
assert_eq!(buffer[7], 0x9A);
assert_eq!(buffer[8], 0x44);
assert_eq!(buffer[9], 0x33);
assert_eq!(buffer[10], 0x22);
assert_eq!(buffer[11], 0x11);
assert_eq!(buffer[12], 0x88);
assert_eq!(buffer[13], 0x77);
assert_eq!(buffer[14], 0x66);
assert_eq!(buffer[15], 0x55);
}
}