use crate::api::{KeyEncodingId, TreeId};
use crate::database::manifest::{ManifestRec, ManifestRec::*};
use crate::keyfmt::KeyFormat;
use std::collections::HashMap;
#[derive(Clone)]
pub struct TreeMeta {
pub id: TreeId,
pub name: String,
pub key_encoding: KeyEncodingId,
pub keyfmt_id: KeyFormat,
pub format_version: u16,
pub meta_a: u64,
pub meta_b: u64,
pub root_id: u64,
pub height: u64,
pub size: u64,
pub order: u64,
pub last_seq: u64,
}
#[derive(Clone)]
pub struct Catalog {
pub by_name: HashMap<String, TreeId>,
pub metas: HashMap<TreeId, TreeMeta>,
pub next_seq: u64,
}
impl Default for Catalog {
fn default() -> Self {
Self {
by_name: HashMap::new(),
metas: HashMap::new(),
next_seq: 1,
}
}
}
impl Catalog {
pub fn new() -> Self {
Self::default()
}
pub fn get_by_name(&self, name: &str) -> Option<&TreeMeta> {
self.by_name.get(name).and_then(|id| self.metas.get(id))
}
pub fn get_by_id(&self, id: &TreeId) -> Option<&TreeMeta> {
self.metas.get(id)
}
pub fn replay_record(&mut self, rec: &ManifestRec) {
match rec.clone() {
CreateTree {
seq,
id,
name,
key_encoding,
key_limits,
key_format,
encoding_version,
meta_a,
meta_b,
root_id,
order,
height,
size,
} => {
self.by_name.insert(name.clone(), id);
self.metas.insert(
id,
TreeMeta {
id,
name: name.clone(),
key_encoding,
keyfmt_id: key_format,
format_version: encoding_version,
meta_a,
meta_b,
root_id,
height,
size,
order,
last_seq: seq,
},
);
let _key_limits = key_limits; self.next_seq = self.next_seq.max(seq + 1);
}
RenameTree { seq, id, new_name } => {
if let Some(m) = self.metas.get_mut(&id) {
self.by_name.remove(&m.name);
m.name = new_name.clone();
self.by_name.insert(new_name.clone(), id);
m.last_seq = seq;
self.next_seq = self.next_seq.max(seq + 1);
}
}
DeleteTree { seq, id } => {
if let Some(m) = self.metas.remove(&id) {
self.by_name.remove(&m.name);
self.next_seq = self.next_seq.max(seq + 1);
}
}
}
}
}