sqlx_core/common/
statement_cache.rs1use hashlink::lru_cache::LruCache;
2
3#[derive(Debug)]
6pub struct StatementCache<T> {
7 inner: LruCache<String, T>,
8}
9
10impl<T> StatementCache<T> {
11 pub fn new(capacity: usize) -> Self {
13 Self {
14 inner: LruCache::new(capacity),
15 }
16 }
17
18 pub fn get_mut(&mut self, k: &str) -> Option<&mut T> {
21 self.inner.get_mut(k)
22 }
23
24 pub fn insert(&mut self, k: &str, v: T) -> Option<T> {
28 let mut lru_item = None;
29
30 if self.capacity() == self.len() && !self.contains_key(k) {
31 lru_item = self.remove_lru();
32 } else if self.contains_key(k) {
33 lru_item = self.inner.remove(k);
34 }
35
36 self.inner.insert(k.into(), v);
37
38 lru_item
39 }
40
41 pub fn len(&self) -> usize {
43 self.inner.len()
44 }
45
46 pub fn is_empty(&self) -> bool {
47 self.inner.is_empty()
48 }
49
50 pub fn remove_lru(&mut self) -> Option<T> {
52 self.inner.remove_lru().map(|(_, v)| v)
53 }
54
55 pub fn clear(&mut self) {
57 self.inner.clear();
58 }
59
60 pub fn contains_key(&mut self, k: &str) -> bool {
62 self.inner.contains_key(k)
63 }
64
65 pub fn capacity(&self) -> usize {
67 self.inner.capacity()
68 }
69
70 #[allow(dead_code)] pub fn is_enabled(&self) -> bool {
73 self.capacity() > 0
74 }
75}