use crate::dio::Dio;
use crate::scenery::table::RowStatusSummary;
#[derive(Debug, Clone)]
pub struct SceneryDiagnostic {
pub key: String,
pub refcount: usize,
pub row_count: usize,
pub status: RowStatusSummary,
}
#[derive(Debug, Clone)]
pub struct DioDiagnostics {
pub cache_rows: usize,
pub query_indexes: usize,
pub sceneries: Vec<SceneryDiagnostic>,
}
impl DioDiagnostics {
pub fn augmented_rows(&self) -> usize {
self.sceneries.iter().map(|s| s.status.fresh).sum()
}
}
impl Dio {
pub async fn diagnostics(&self) -> DioDiagnostics {
let cache_rows = self.inner.cache.count().await.unwrap_or(0).max(0) as usize;
let query_indexes = self.inner.query_indexes.lock().unwrap().len();
let mut sceneries = Vec::new();
{
let mut reg = self.inner.table_sceneries.lock().unwrap();
reg.retain(|_, weak| weak.strong_count() > 0);
for (key, weak) in reg.iter() {
let refcount = weak.strong_count();
if let Some(scenery) = weak.upgrade() {
sceneries.push(SceneryDiagnostic {
key: key.clone(),
refcount,
row_count: scenery.row_count(),
status: scenery.status_summary(),
});
}
}
}
sceneries.sort_by(|a, b| a.key.cmp(&b.key));
DioDiagnostics {
cache_rows,
query_indexes,
sceneries,
}
}
}