use mkit::Cborize;
use std::{ffi, path};
use crate::files::{IndexFileName, VlogFileName};
pub const ZBLOCKSIZE: usize = 4 * 1024; pub const MBLOCKSIZE: usize = 4 * 1024; pub const VBLOCKSIZE: usize = 4 * 1024;
pub const FLUSH_QUEUE_SIZE: usize = 64;
const STATS_VER1: u32 = 0x0001;
pub fn to_index_file(dir: &ffi::OsStr, name: &str) -> ffi::OsString {
let file_path: path::PathBuf = [
dir.to_os_string(),
IndexFileName::from(name.to_string()).into(),
]
.iter()
.collect();
file_path.into_os_string()
}
pub fn to_vlog_file(dir: &ffi::OsStr, name: &str) -> ffi::OsString {
let file_path: path::PathBuf = [
dir.to_os_string(),
VlogFileName::from(name.to_string()).into(),
]
.iter()
.collect();
file_path.into_os_string()
}
#[derive(Clone, Debug)]
pub struct Config {
pub dir: ffi::OsString,
pub name: String,
pub z_blocksize: usize,
pub m_blocksize: usize,
pub v_blocksize: usize,
pub delta_ok: bool,
pub value_in_vlog: bool,
pub flush_queue_size: usize,
}
impl From<Stats> for Config {
fn from(val: Stats) -> Config {
Config {
dir: ffi::OsString::default(),
name: val.name,
z_blocksize: val.z_blocksize,
m_blocksize: val.m_blocksize,
v_blocksize: val.v_blocksize,
delta_ok: val.delta_ok,
value_in_vlog: val.value_in_vlog,
flush_queue_size: FLUSH_QUEUE_SIZE,
}
}
}
impl Config {
pub fn new(dir: &ffi::OsStr, name: &str) -> Config {
Config {
dir: dir.to_os_string(),
name: name.to_string(),
z_blocksize: ZBLOCKSIZE,
m_blocksize: MBLOCKSIZE,
v_blocksize: VBLOCKSIZE,
delta_ok: true,
value_in_vlog: false,
flush_queue_size: FLUSH_QUEUE_SIZE,
}
}
pub fn set_blocksize(&mut self, z: usize, v: usize, m: usize) -> &mut Self {
self.z_blocksize = z;
self.v_blocksize = v;
self.m_blocksize = m;
self
}
pub fn set_delta(&mut self, delta_ok: bool) -> &mut Self {
self.delta_ok = delta_ok;
self
}
pub fn set_value_log(&mut self, value_log: bool) -> &mut Self {
self.value_in_vlog = value_log;
self
}
pub fn set_flush_queue_size(&mut self, size: usize) -> &mut Self {
self.flush_queue_size = size;
self
}
}
impl Config {
pub fn to_index_file_location(&self) -> ffi::OsString {
to_index_file(&self.dir, &self.name)
}
pub fn to_vlog_file_location(&self) -> ffi::OsString {
to_vlog_file(&self.dir, &self.name)
}
}
#[derive(Clone, Default, Debug, Cborize)]
pub struct Stats {
pub name: String,
pub z_blocksize: usize,
pub m_blocksize: usize,
pub v_blocksize: usize,
pub delta_ok: bool,
pub value_in_vlog: bool,
pub vlog_file: Option<ffi::OsString>,
pub n_count: u64,
pub n_deleted: usize,
pub seqno: u64,
pub n_abytes: u64,
pub build_time: u64,
pub epoch: u64,
}
impl Stats {
const ID: u32 = STATS_VER1;
}
impl From<Config> for Stats {
fn from(config: Config) -> Stats {
Stats {
name: config.name.clone(),
z_blocksize: config.z_blocksize,
m_blocksize: config.m_blocksize,
v_blocksize: config.v_blocksize,
delta_ok: config.delta_ok,
vlog_file: Option::default(),
value_in_vlog: config.value_in_vlog,
n_count: u64::default(),
n_deleted: usize::default(),
seqno: u64::default(),
n_abytes: u64::default(),
build_time: u64::default(),
epoch: u64::default(),
}
}
}