Skip to main content

wp_knowledge/
cache_util.rs

1use crate::cache::CacheAble;
2use wp_error::KnowledgeResult;
3use wp_log::warn_kdb;
4use wp_model_core::model::DataField;
5
6use crate::mem::RowData;
7
8/// Generic cache wrapper: fetch from cache by `c_params`, otherwise run `query_fn` and save.
9pub fn cache_query_impl<const N: usize>(
10    c_params: &[DataField; N],
11    cache: &mut impl CacheAble<DataField, RowData, N>,
12    query_fn: impl FnOnce() -> KnowledgeResult<RowData>,
13) -> RowData {
14    if let Some(hit) = cache.fetch(c_params) {
15        return hit.clone();
16    }
17    match query_fn() {
18        Ok(rows) => {
19            cache.save(c_params, rows.clone());
20            rows
21        }
22        Err(e) => {
23            warn_kdb!("[kdb] query error: {}", e);
24            Vec::new()
25        }
26    }
27}