gistools/data_store/kv/
file.rs

1use super::KVStore;
2use crate::data_store::{
3    U64,
4    file::{FileOptions, S2FileStore},
5};
6use core::{
7    cell::{RefCell, RefMut},
8    ops::{Deref, DerefMut},
9};
10use s2json::Properties;
11use serde::{Serialize, de::DeserializeOwned};
12
13/// File based reader that implements the KVStore trait
14#[derive(Debug, Clone)]
15pub struct FileKV<K: U64 = u64, V: Serialize + DeserializeOwned + Clone = Properties> {
16    store: RefCell<S2FileStore<K, V>>,
17    tmp_val: RefCell<Option<V>>,
18}
19impl<K: U64, V: Serialize + DeserializeOwned + Clone> FileKV<K, V> {
20    /// Builds a new File based KV with defined options
21    pub fn new_with_options(file_name: Option<&str>, opts: Option<FileOptions>) -> FileKV<K, V> {
22        FileKV { store: S2FileStore::new(file_name, opts).into(), tmp_val: None.into() }
23    }
24}
25impl<K: U64, V: Serialize + DeserializeOwned + Clone> KVStore<K, V> for FileKV<K, V> {
26    fn new(file_name: Option<&str>) -> FileKV<K, V> {
27        FileKV { store: S2FileStore::new(file_name, None).into(), tmp_val: None.into() }
28    }
29    fn len(&self) -> u64 {
30        self.store.borrow().len()
31    }
32    fn is_empty(&self) -> bool {
33        self.store.borrow().is_empty()
34    }
35    fn get(&self, key: K) -> Option<&V> {
36        let mut store = self.store.borrow_mut();
37        if let Some(vec) = store.get(key, Some(1)) {
38            if vec.1.is_empty() {
39                return None;
40            }
41            self.tmp_val.borrow_mut().replace(vec.1[0].clone());
42            if let Some(val_ref) = self.tmp_val.borrow().as_ref() {
43                return Some(unsafe { &*(val_ref as *const V) });
44            }
45        }
46        None
47    }
48    fn get_mut(&mut self, key: K) -> Option<&mut V> {
49        let mut store = self.store.borrow_mut();
50        if let Some(vec) = store.get(key, Some(1)) {
51            if vec.1.is_empty() {
52                return None;
53            }
54            self.tmp_val.borrow_mut().replace(vec.1[0].clone());
55            if let Some(val_ref) = self.tmp_val.borrow_mut().as_mut() {
56                return Some(unsafe { &mut *(val_ref as *mut V) });
57            }
58        }
59        None
60    }
61    fn set(&mut self, key: K, value: V) {
62        self.store.borrow_mut().set(key, value);
63    }
64    fn has(&self, key: K) -> bool {
65        self.store.borrow_mut().has(key)
66    }
67    fn iter<'a>(&'a self) -> impl Iterator<Item = (&'a K, &'a V)>
68    where
69        V: 'a,
70    {
71        KVStoreIterator { store: self.store.borrow_mut(), curr_kv: RefCell::new(None), index: 0 }
72    }
73
74    fn iter_mut<'a>(&'a mut self) -> impl Iterator<Item = (&'a K, &'a mut V)>
75    where
76        V: 'a,
77    {
78        KVStoreMutIterator { store: self.store.borrow_mut(), curr_kv: RefCell::new(None), index: 0 }
79    }
80    fn cleanup(&mut self) {
81        self.store.borrow_mut().cleanup();
82    }
83}
84struct KVStoreIterator<'a, K: U64, V: Serialize + DeserializeOwned + Clone> {
85    store: RefMut<'a, S2FileStore<K, V>>,
86    curr_kv: RefCell<Option<(K, V)>>,
87    index: u64,
88}
89impl<'a, K: U64, V: Serialize + DeserializeOwned + Clone> Iterator for KVStoreIterator<'a, K, V> {
90    type Item = (&'a K, &'a V);
91
92    fn next(&mut self) -> Option<Self::Item> {
93        let next_kv = self.store.get_index(self.index);
94        self.index += 1;
95
96        if let Some(kv) = next_kv {
97            *self.curr_kv.borrow_mut() = Some(kv);
98            if let Some((k, v)) = self.curr_kv.borrow().deref() {
99                unsafe {
100                    let k_ptr: *const K = k;
101                    let v_ptr: *const V = v;
102                    Some((&(*k_ptr), &(*v_ptr)))
103                }
104            } else {
105                None
106            }
107        } else {
108            *self.curr_kv.borrow_mut() = None;
109            None
110        }
111    }
112}
113struct KVStoreMutIterator<'a, K: U64, V: Serialize + DeserializeOwned + Clone> {
114    store: RefMut<'a, S2FileStore<K, V>>,
115    curr_kv: RefCell<Option<(K, V)>>,
116    index: u64,
117}
118impl<'a, K: U64, V: Serialize + DeserializeOwned + Clone> Iterator
119    for KVStoreMutIterator<'a, K, V>
120{
121    type Item = (&'a K, &'a mut V);
122
123    fn next(&mut self) -> Option<Self::Item> {
124        let next_kv = self.store.get_index(self.index);
125        self.index += 1;
126
127        if let Some(kv) = next_kv {
128            *self.curr_kv.borrow_mut() = Some(kv);
129            if let Some((k, v)) = self.curr_kv.borrow_mut().deref_mut() {
130                unsafe {
131                    let k_ptr: *const K = k;
132                    let v_ptr: *mut V = v;
133                    Some((&(*k_ptr), &mut (*v_ptr)))
134                }
135            } else {
136                None
137            }
138        } else {
139            *self.curr_kv.borrow_mut() = None;
140            None
141        }
142    }
143}
144
145// struct DroppableV<V: Clone> {
146//     value: V,
147//     callback: Box<dyn FnOnce(V)>,
148// }
149
150// impl<V: Clone> Drop for DroppableV<V> {
151//     fn drop(&mut self) {
152//         (self.callback)(self.value.clone());
153//     }
154// }