#[derive(Debug, Clone)]
pub struct FileCreate {
pub superblock_version: u8,
pub sizeof_addr: u8,
pub sizeof_size: u8,
pub sym_leaf_k: u16,
pub btree_k: u16,
pub chunk_btree_k: u16,
file_space: (FileSpaceStrategy, bool, u64),
file_space_page_size: u64,
shared_mesg_indexes: Vec<SharedMessageIndex>,
shared_mesg_phase_change: (u32, u32),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FileSpaceStrategy {
None,
Aggregate,
FreeSpaceManager,
Page,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SharedMessageIndex {
pub message_type_flags: u32,
pub minimum_message_size: u32,
}
impl FileCreate {
pub fn from_file(f: &crate::hl::file::File) -> Self {
let sb = f.superblock();
Self {
superblock_version: sb.version,
sizeof_addr: sb.sizeof_addr,
sizeof_size: sb.sizeof_size,
sym_leaf_k: sb.sym_leaf_k,
btree_k: sb.snode_btree_k,
chunk_btree_k: sb.chunk_btree_k,
file_space: (FileSpaceStrategy::Aggregate, false, 1),
file_space_page_size: 4096,
shared_mesg_indexes: Vec::new(),
shared_mesg_phase_change: (50, 40),
}
}
pub fn sizes(&self) -> (u8, u8) {
(self.sizeof_addr, self.sizeof_size)
}
pub fn set_sizes(&mut self, sizeof_addr: u8, sizeof_size: u8) {
self.sizeof_addr = sizeof_addr;
self.sizeof_size = sizeof_size;
}
pub fn sym_k(&self) -> (u16, u16) {
(self.btree_k, self.sym_leaf_k)
}
pub fn set_sym_k(&mut self, ik: u16, lk: u16) {
self.btree_k = ik;
self.sym_leaf_k = lk;
}
pub fn istore_k(&self) -> u16 {
self.chunk_btree_k
}
pub fn set_istore_k(&mut self, ik: u16) {
self.chunk_btree_k = ik;
}
pub fn file_space(&self) -> (FileSpaceStrategy, bool, u64) {
self.file_space
}
pub fn set_file_space(&mut self, strategy: FileSpaceStrategy, persist: bool, threshold: u64) {
self.file_space = (strategy, persist, threshold);
}
pub fn file_space_page_size(&self) -> u64 {
self.file_space_page_size
}
pub fn set_file_space_page_size(&mut self, page_size: u64) {
self.file_space_page_size = page_size;
}
pub fn shared_mesg_nindexes(&self) -> usize {
self.shared_mesg_indexes.len()
}
pub fn set_shared_mesg_nindexes(&mut self, count: usize) {
self.shared_mesg_indexes.resize(
count,
SharedMessageIndex {
message_type_flags: 0,
minimum_message_size: 0,
},
);
}
pub fn shared_mesg_index(&self, _index: usize) -> Option<SharedMessageIndex> {
self.shared_mesg_indexes.get(_index).cloned()
}
pub fn set_shared_mesg_index(&mut self, index: usize, config: SharedMessageIndex) -> bool {
if let Some(slot) = self.shared_mesg_indexes.get_mut(index) {
*slot = config;
true
} else {
false
}
}
pub fn shared_mesg_phase_change(&self) -> (u32, u32) {
self.shared_mesg_phase_change
}
pub fn set_shared_mesg_phase_change(&mut self, max_list: u32, min_btree: u32) {
self.shared_mesg_phase_change = (max_list, min_btree);
}
}