1use crate::errors::Error;
2
3mod skiplist;
4
5pub(crate) struct Chunk {
6 store: skiplist::SkipList,
7 total_size: usize,
8 used_size: usize,
9 key_nums: usize,
10}
11
12const DEFAULT_MAX_CHUNK_SIZE: usize = 1024;
13
14impl Chunk {
16 pub(crate) fn new() -> Self {
17 Chunk {
18 store: skiplist::SkipList::default(),
19 total_size: DEFAULT_MAX_CHUNK_SIZE,
20 used_size: 0,
21 key_nums: 0,
22 }
23 }
24}
25
26impl Chunk {
40 pub(crate) fn serialize(self) -> (Vec<u8>, Vec<u8>) {
47 let mut buffer = vec![0u8; self.key_nums * (8 + 8 + 8) + 8 + self.used_size];
48 let mut offset = 0;
49 buffer[offset..offset + 8].clone_from_slice(self.key_nums.to_le_bytes().as_ref());
50 offset += 8;
51
52 let mut ptr_pos = offset;
53 offset += 8 * self.key_nums;
54
55 let mut fist_key = None;
56
57 let store_iter = self.store.into_iter();
58 for (key, value) in store_iter {
59 if fist_key.is_none() {
60 fist_key = Some(key.clone());
61 }
62 buffer[ptr_pos..ptr_pos + 8].clone_from_slice(offset.to_le_bytes().as_ref());
63 ptr_pos += 8;
64
65 buffer[offset..offset + 8].clone_from_slice(key.len().to_le_bytes().as_ref());
66 offset += 8;
67
68 buffer[offset..offset + key.len()].clone_from_slice(&key);
69 offset += key.len();
70
71 buffer[offset..offset + 8].clone_from_slice(value.len().to_le_bytes().as_ref());
72 offset += 8;
73
74 buffer[offset..offset + value.len()].clone_from_slice(&value);
75 offset += value.len();
76 }
77
78 (fist_key.unwrap(), buffer)
79 }
80
81 fn deserialize(buffer: &[u8]) -> Result<Vec<(String, String)>, Error> {
83 let mut offset = 0;
84 let key_num = u64::from_le_bytes(buffer[offset..offset + 8].try_into().unwrap());
85 offset += 8;
86 let mut ordered_list = Vec::new();
87
88 offset += 8 * key_num as usize;
89
90 for _ in 0..key_num {
91 let key_size = u64::from_le_bytes(buffer[offset..offset + 8].try_into().unwrap());
92 offset += 8;
93
94 let key = String::from_utf8(buffer[offset..offset + key_size as usize].into()).unwrap();
95 offset += key_size as usize;
96
97 let value_size = u64::from_le_bytes(buffer[offset..offset + 8].try_into().unwrap());
98 offset += 8;
99
100 let value =
101 String::from_utf8(buffer[offset..offset + value_size as usize].into()).unwrap();
102 offset += value_size as usize;
103 ordered_list.push((key, value));
104 }
105 Ok(ordered_list)
106 }
107}
108
109impl Chunk {
111 pub(crate) fn get(&self, key: &[u8]) -> Result<Vec<u8>, Error> {
112 self.store.get(key)
113 }
114
115 pub(crate) fn delete(&mut self, key: &[u8]) -> Result<Vec<u8>, Error> {
116 match self.store.delete(key) {
117 Ok(removed) => {
118 self.key_nums -= 1;
119 self.used_size -= key.len() + removed.len();
120 Ok(removed)
121 }
122 Err(_) => todo!(),
123 }
124 }
125 pub(crate) fn insert(&mut self, key: &[u8], value: &[u8]) -> Result<(), Error> {
126 self.used_size += key.len() + value.len();
127 self.key_nums += 1;
128 self.store.insert(key, value)
129 }
130
131 pub(crate) fn is_overflowed(&self, size: usize) -> bool {
132 self.used_size + size >= self.total_size
133 }
134}
135
136#[cfg(test)]
137mod tests {
138 use super::*;
139
140 #[test]
141 fn test_chunk_new() {
142 let chunk = Chunk::new();
143
144 assert_eq!(chunk.total_size, DEFAULT_MAX_CHUNK_SIZE);
147 assert_eq!(chunk.used_size, 0);
148 assert_eq!(chunk.key_nums, 0);
149 }
150
151 #[test]
152 fn test_chunk_serialize() {
153 let mut chunk = Chunk::new();
154 let key1 = b"key1".to_vec();
155 let value1 = b"value1".to_vec();
156 let key2 = b"key2".to_vec();
157 let value2 = b"value2".to_vec();
158
159 chunk.insert(&key1, &value1).unwrap();
160 chunk.insert(&key2, &value2).unwrap();
161 let key_nums = chunk.key_nums;
162 let used_size = chunk.used_size;
163
164 let (first_key, buffer) = chunk.serialize();
165
166 let expected_buffer_length = key_nums * (8 + 8 + 8) + 8 + used_size;
167 assert_eq!(first_key, key1);
170 assert_eq!(buffer.len(), expected_buffer_length);
171 }
172
173 #[test]
174 fn test_chunk_deserialize() {
175 let mut chunk = Chunk::new();
176 let key1 = b"key1".to_vec();
177 let value1 = b"value1".to_vec();
178 let key2 = b"key2".to_vec();
179 let value2 = b"value2".to_vec();
180 chunk.insert(&key1, &value1).unwrap();
181 chunk.insert(&key2, &value2).unwrap();
182
183 let (_, buffer) = chunk.serialize();
186 let ordered_list = Chunk::deserialize(&buffer).unwrap();
187
188 assert_eq!(ordered_list.len(), 2);
192 assert_eq!(ordered_list[0], ("key1".to_string(), "value1".to_string()));
193 assert_eq!(ordered_list[1], ("key2".to_string(), "value2".to_string()));
194 }
195
196 #[test]
197 fn test_chunk_get() {
198 let mut chunk = Chunk::new();
199 let key1 = b"key1".to_vec();
200 let value1 = b"value1".to_vec();
201 let key2 = b"key2".to_vec();
202 let value2 = b"value2".to_vec();
203
204 chunk.insert(&key1, &value1).unwrap();
205 chunk.insert(&key2, &value2).unwrap();
206
207 let retrieved_value1 = chunk.get(&key1).unwrap();
208 let retrieved_value2 = chunk.get(&key2).unwrap();
209
210 assert_eq!(retrieved_value1, value1);
213 assert_eq!(retrieved_value2, value2);
214 }
215
216 #[test]
217 fn test_chunk_delete() {
218 let mut chunk = Chunk::new();
219 let key1 = b"key1".to_vec();
220 let value1 = b"value1".to_vec();
221
222 chunk.insert(&key1, &value1).unwrap();
223
224 let removed_value = chunk.delete(&key1).unwrap();
225
226 assert_eq!(removed_value, value1);
229 }
230
231 }