use std::{
fs::File,
io::{self, Cursor, Seek, SeekFrom, Write},
};
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
pub struct TableHeader {
pub(crate) total_file_length: u64, pub(crate) shard_number: u32, pub(crate) compressed: bool, pub(crate) first_row_id: u64, pub(crate) last_row_id: u64, pub(crate) immutable: bool, }
impl TableHeader {
pub(crate) fn new(
total_file_length: u64, shard_number: u32, compressed: bool, first_row_id: u64, last_row_id: u64, immutable: bool, ) -> Self {
Self {
total_file_length,
shard_number,
compressed,
first_row_id,
last_row_id,
immutable: immutable,
}
}
pub(crate) fn to_bytes(&self) -> io::Result<Vec<u8>> {
let mut buffer = Vec::new();
buffer
.write_u64::<LittleEndian>(self.total_file_length)
.unwrap();
buffer.write_u32::<LittleEndian>(self.shard_number).unwrap();
buffer
.write_u8(if self.compressed { 1 } else { 0 })
.unwrap();
buffer.write_u64::<LittleEndian>(self.first_row_id).unwrap();
buffer.write_u64::<LittleEndian>(self.last_row_id).unwrap();
buffer.write_u8(if self.immutable { 1 } else { 0 }).unwrap();
Ok(buffer)
}
pub(crate) fn _save_header(&self, file_name: &str) -> io::Result<()> {
let mut file = File::options().write(true).open(file_name).unwrap();
let header_bytes = self.to_bytes().unwrap();
file.seek(SeekFrom::Start(0)).unwrap();
file.write_all(&header_bytes).unwrap();
Ok(())
}
pub(crate) fn from_buffer(buffer: Vec<u8>) -> io::Result<TableHeader> {
let mut cursor = Cursor::new(buffer);
let total_file_length = cursor.read_u64::<LittleEndian>().unwrap();
let shard_number = cursor.read_u32::<LittleEndian>().unwrap();
let compressed = cursor.read_u8().unwrap();
let first_row_id = cursor.read_u64::<LittleEndian>().unwrap();
let last_row_id = cursor.read_u64::<LittleEndian>().unwrap();
let immutable = cursor.read_u8().unwrap();
Ok(TableHeader {
total_file_length: total_file_length,
shard_number: shard_number,
compressed: if compressed == 1 { true } else { false },
first_row_id: first_row_id,
last_row_id: last_row_id,
immutable: if immutable == 1 { true } else { false },
})
}
}