gistools/data_store/kv/
file.rs1use 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#[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 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