we_trust_sqlite/reader/
cache.rs1use crate::reader::BTreePage;
2use parking_lot::Mutex;
3use std::collections::{HashMap, VecDeque};
4use tokio::sync::RwLock;
5
6pub struct PageCache {
8 pages: RwLock<HashMap<u32, BTreePage>>,
9 lru_order: Mutex<VecDeque<u32>>,
10 capacity: usize,
11}
12
13impl PageCache {
14 pub fn new(capacity: usize) -> Self {
15 Self {
16 pages: RwLock::new(HashMap::new()),
17 lru_order: Mutex::new(VecDeque::new()),
18 capacity,
19 }
20 }
21
22 pub async fn get(&self, page_id: u32) -> Option<BTreePage> {
23 let pages = self.pages.read().await;
24 if let Some(page) = pages.get(&page_id) {
25 let mut order = self.lru_order.lock();
27 if let Some(pos) = order.iter().position(|&id| id == page_id) {
28 order.remove(pos);
29 }
30 order.push_back(page_id);
31 return Some(page.clone());
32 }
33 None
34 }
35
36 pub async fn insert(&self, page_id: u32, page: BTreePage) {
37 let mut pages = self.pages.write().await;
38 let mut order = self.lru_order.lock();
39
40 if pages.contains_key(&page_id) {
42 if let Some(pos) = order.iter().position(|&id| id == page_id) {
43 order.remove(pos);
44 }
45 } else if pages.len() >= self.capacity {
46 if let Some(oldest_id) = order.pop_front() {
48 pages.remove(&oldest_id);
49 }
50 }
51
52 pages.insert(page_id, page);
53 order.push_back(page_id);
54 }
55
56 pub async fn clear(&self) {
57 let mut pages = self.pages.write().await;
58 let mut order = self.lru_order.lock();
59 pages.clear();
60 order.clear();
61 }
62}