1use crate::DbError;
2use crate::DbValue;
3use crate::StorageData;
4use crate::collections::vec::DbVec;
5use crate::collections::vec::VecValue;
6use crate::db::db_value_index::DbValueIndex;
7use crate::storage::Storage;
8use crate::storage::StorageIndex;
9use crate::utilities::serialize::Serialize;
10use crate::utilities::serialize::SerializeStatic;
11
12#[derive(Clone, Debug, Default, Eq, PartialEq, PartialOrd, Ord)]
16#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
18#[cfg_attr(feature = "derive", derive(agdb::AgdbDeSerialize))]
19#[cfg_attr(feature = "api", derive(agdb::api::ApiDef))]
20pub struct DbKeyValue {
21 pub key: DbValue,
23
24 pub value: DbValue,
26}
27
28pub struct DbKeyValues<S: StorageData>(DbVec<StorageIndex, S>);
29
30impl<S: StorageData> DbKeyValues<S> {
31 pub fn new(storage: &mut Storage<S>) -> Result<Self, DbError> {
32 Ok(Self(DbVec::new(storage)?))
33 }
34
35 pub fn from_storage(storage: &Storage<S>, index: StorageIndex) -> Result<Self, DbError> {
36 Ok(Self(DbVec::from_storage(storage, index)?))
37 }
38
39 pub fn storage_index(&self) -> StorageIndex {
40 self.0.storage_index()
41 }
42
43 pub fn len(&self) -> u64 {
44 self.0.len()
45 }
46
47 pub fn insert_value(
48 &mut self,
49 storage: &mut Storage<S>,
50 index: u64,
51 value: &DbKeyValue,
52 ) -> Result<(), DbError> {
53 if self.0.len() <= index {
54 self.0
55 .resize(storage, index + 1, &StorageIndex::default())?;
56 }
57
58 let storage_index = self.0.value(storage, index)?;
59
60 let mut kvs = if storage_index.0 == 0 {
61 let kvs = DbVec::<DbKeyValue, S>::new(storage)?;
62 self.0.replace(storage, index, &kvs.storage_index())?;
63 kvs
64 } else {
65 DbVec::from_storage(storage, storage_index)?
66 };
67
68 kvs.push(storage, value)
69 }
70
71 pub fn insert_or_replace(
72 &mut self,
73 storage: &mut Storage<S>,
74 index: u64,
75 value: &DbKeyValue,
76 ) -> Result<Option<DbKeyValue>, DbError> {
77 if !self.valid_index(storage, index)? {
78 self.insert_value(storage, index, value)?;
79 return Ok(None);
80 }
81
82 let mut kvs = self.kvs(storage, index)?;
83
84 if let Some((index, kv)) = kvs
85 .iter(storage)
86 .enumerate()
87 .find(|(_, kv)| kv.key == value.key)
88 {
89 kvs.replace(storage, index as u64, value)?;
90 Ok(Some(kv))
91 } else {
92 kvs.push(storage, value)?;
93 Ok(None)
94 }
95 }
96
97 pub fn key_count(&self, storage: &Storage<S>, index: u64) -> Result<u64, DbError> {
98 if !self.valid_index(storage, index)? {
99 return Ok(0);
100 }
101
102 Ok(self.kvs(storage, index)?.len())
103 }
104
105 pub fn keys(&self, storage: &Storage<S>, index: u64) -> Result<Vec<DbValue>, DbError> {
106 if !self.valid_index(storage, index)? {
107 return Ok(vec![]);
108 }
109
110 let kvs = self.kvs(storage, index)?;
111 Ok(kvs.iter(storage).map(|kv| kv.key).collect())
112 }
113
114 pub fn remove(&mut self, storage: &mut Storage<S>, index: u64) -> Result<(), DbError> {
115 if !self.valid_index(storage, index)? {
116 return Ok(());
117 }
118
119 let kvs = self.kvs(storage, index)?;
120 kvs.remove_from_storage(storage)?;
121
122 if self.0.len() - 1 == index {
123 self.0.remove(storage, index)?;
124 } else {
125 self.0.replace(storage, index, &StorageIndex::default())?;
126 }
127
128 Ok(())
129 }
130
131 pub fn remove_value(
132 &mut self,
133 storage: &mut Storage<S>,
134 index: u64,
135 key: &DbValue,
136 ) -> Result<(), DbError> {
137 if !self.valid_index(storage, index)? {
138 return Ok(());
139 }
140
141 let mut kvs = self.kvs(storage, index)?;
142
143 if let Some((index, _)) = kvs.iter(storage).enumerate().find(|(_, kv)| kv.key == *key) {
144 kvs.remove(storage, index as u64)?;
145 }
146
147 Ok(())
148 }
149
150 pub fn value(
151 &self,
152 storage: &Storage<S>,
153 index: u64,
154 key: &DbValue,
155 ) -> Result<Option<DbValue>, DbError> {
156 if !self.valid_index(storage, index)? {
157 return Ok(None);
158 }
159
160 let kvs = self.kvs(storage, index)?;
161 Ok(kvs
162 .iter(storage)
163 .find(|kv| kv.key == *key)
164 .map(|kv| kv.value))
165 }
166
167 pub fn values(&self, storage: &Storage<S>, index: u64) -> Result<Vec<DbKeyValue>, DbError> {
168 if !self.valid_index(storage, index)? {
169 return Ok(vec![]);
170 }
171
172 let kvs = self.kvs(storage, index)?;
173 Ok(kvs.iter(storage).collect())
174 }
175
176 pub fn values_by_keys(
177 &self,
178 storage: &Storage<S>,
179 index: u64,
180 keys: &[DbValue],
181 ) -> Result<Vec<DbKeyValue>, DbError> {
182 if !self.valid_index(storage, index)? {
183 return Ok(vec![]);
184 }
185
186 let kvs = self.kvs(storage, index)?;
187 let mut values = kvs
188 .iter(storage)
189 .filter_map(|kv| keys.iter().position(|k| k == &kv.key).map(|pos| (pos, kv)))
190 .collect::<Vec<_>>();
191 values.sort_by_key(|(i, _)| *i);
192 Ok(values.into_iter().map(|(_, kv)| kv).collect())
193 }
194
195 fn kvs(&self, storage: &Storage<S>, index: u64) -> Result<DbVec<DbKeyValue, S>, DbError> {
196 let storage_index = self.0.value(storage, index)?;
197 DbVec::from_storage(storage, storage_index)
198 }
199
200 fn valid_index(&self, storage: &Storage<S>, index: u64) -> Result<bool, DbError> {
201 Ok(index < self.0.len() && self.0.value(storage, index)?.0 != 0)
202 }
203}
204
205impl<K, T> From<(K, T)> for DbKeyValue
206where
207 K: Into<DbValue>,
208 T: Into<DbValue>,
209{
210 fn from(value: (K, T)) -> Self {
211 DbKeyValue {
212 key: value.0.into(),
213 value: value.1.into(),
214 }
215 }
216}
217
218impl<D: StorageData> VecValue<D> for DbKeyValue {
219 fn store(&self, storage: &mut Storage<D>) -> Result<Vec<u8>, DbError> {
220 let key_index = self.key.store_db_value(storage)?;
221 let value_index = self.value.store_db_value(storage)?;
222 Ok([key_index.data(), value_index.data()].concat())
223 }
224
225 fn load(storage: &Storage<D>, bytes: &[u8]) -> Result<Self, DbError> {
226 let key_index = DbValueIndex::deserialize(bytes)?;
227 let value_index =
228 DbValueIndex::deserialize(&bytes[key_index.serialized_size() as usize..])?;
229 let key = DbValue::load_db_value(key_index, storage)?;
230 let value = DbValue::load_db_value(value_index, storage)?;
231 Ok(Self { key, value })
232 }
233
234 fn remove(storage: &mut Storage<D>, bytes: &[u8]) -> Result<(), DbError> {
235 let key_index = DbValueIndex::deserialize(bytes)?;
236 let value_index =
237 DbValueIndex::deserialize(&bytes[key_index.serialized_size() as usize..])?;
238
239 if !key_index.is_value() {
240 storage.remove(StorageIndex(key_index.index()))?;
241 }
242
243 if !value_index.is_value() {
244 storage.remove(StorageIndex(value_index.index()))?;
245 }
246
247 Ok(())
248 }
249
250 fn storage_len() -> u64 {
251 DbValueIndex::serialized_size_static() * 2
252 }
253}
254
255#[cfg(test)]
256mod tests {
257 use crate::MemoryStorage;
258
259 use super::*;
260 #[test]
261 fn derived_from_debug() {
262 let _ = format!(
263 "{:?}",
264 DbKeyValue {
265 key: DbValue::I64(0),
266 value: DbValue::I64(0)
267 }
268 );
269 }
270
271 #[test]
272 fn derived_from_partial_eq() {
273 assert_eq!(
274 DbKeyValue {
275 key: DbValue::I64(0),
276 value: DbValue::I64(0)
277 },
278 DbKeyValue {
279 key: DbValue::I64(0),
280 value: DbValue::I64(0)
281 }
282 );
283 }
284
285 #[test]
286 fn derived_from_partial_ord() {
287 let element = DbKeyValue {
288 key: DbValue::I64(0),
289 value: DbValue::I64(0),
290 };
291 let other = DbKeyValue {
292 key: DbValue::I64(0),
293 value: DbValue::I64(0),
294 };
295 assert!(element <= other);
296 }
297
298 #[test]
299 fn derived_from_ord() {
300 let element = DbKeyValue {
301 key: DbValue::I64(0),
302 value: DbValue::I64(0),
303 };
304 assert_eq!(element.cmp(&element), std::cmp::Ordering::Equal);
305 }
306
307 #[test]
308 fn db_key_values_insert() {
309 let mut storage = Storage::<MemoryStorage>::new("test").unwrap();
310 let mut kvs = DbKeyValues(DbVec::new(&mut storage).unwrap());
311 kvs.insert_value(&mut storage, 3, &("key", "value").into())
312 .unwrap();
313
314 assert_eq!(kvs.len(), 4);
315 assert_eq!(
316 kvs.values(&storage, 3).unwrap(),
317 vec![("key", "value").into()]
318 );
319 }
320
321 #[test]
322 fn db_key_values_insert_or_replace() {
323 let mut storage = Storage::<MemoryStorage>::new("test").unwrap();
324 let mut kvs = DbKeyValues(DbVec::new(&mut storage).unwrap());
325 kvs.insert_value(&mut storage, 3, &("key", "value").into())
326 .unwrap();
327 let old = kvs
328 .insert_or_replace(&mut storage, 3, &("key", "value1").into())
329 .unwrap();
330
331 assert_eq!(kvs.len(), 4);
332 assert_eq!(
333 kvs.values(&storage, 3).unwrap(),
334 vec![("key", "value1").into()]
335 );
336 assert_eq!(old, Some(("key", "value").into()));
337 }
338
339 #[test]
340 fn db_key_values_insert_multiple() {
341 let mut storage = Storage::<MemoryStorage>::new("test").unwrap();
342 let mut kvs = DbKeyValues(DbVec::new(&mut storage).unwrap());
343 kvs.insert_value(&mut storage, 3, &("key1", "value1").into())
344 .unwrap();
345 kvs.insert_value(&mut storage, 3, &("key2", "value2").into())
346 .unwrap();
347
348 assert_eq!(kvs.len(), 4);
349 assert_eq!(
350 kvs.values(&storage, 3).unwrap(),
351 vec![("key1", "value1").into(), ("key2", "value2").into()]
352 );
353 }
354
355 #[test]
356 fn db_key_values_insert_to_default_initialized() {
357 let mut storage = Storage::<MemoryStorage>::new("test").unwrap();
358 let mut kvs = DbKeyValues(DbVec::new(&mut storage).unwrap());
359 kvs.insert_value(&mut storage, 3, &("key", "value").into())
360 .unwrap();
361 kvs.insert_value(&mut storage, 1, &("key1", "value1").into())
362 .unwrap();
363
364 assert_eq!(kvs.len(), 4);
365 assert_eq!(
366 kvs.values(&storage, 1).unwrap(),
367 vec![("key1", "value1").into()]
368 );
369 }
370
371 #[test]
372 fn db_key_values_remove_all_values() {
373 let mut storage = Storage::<MemoryStorage>::new("test").unwrap();
374 let mut kvs = DbKeyValues(DbVec::new(&mut storage).unwrap());
375 kvs.insert_value(&mut storage, 3, &("key", "value").into())
376 .unwrap();
377 kvs.insert_value(&mut storage, 1, &("key1", "value1").into())
378 .unwrap();
379 kvs.remove(&mut storage, 1).unwrap();
380
381 assert_eq!(kvs.len(), 4);
382 assert_eq!(kvs.values(&storage, 1).unwrap(), vec![]);
383 }
384
385 #[test]
386 fn db_key_values_remove_key_value() {
387 let mut storage = Storage::<MemoryStorage>::new("test").unwrap();
388 let mut kvs = DbKeyValues(DbVec::new(&mut storage).unwrap());
389 kvs.insert_value(&mut storage, 3, &("key1", "value1").into())
390 .unwrap();
391 kvs.insert_value(&mut storage, 3, &("key2", "value2").into())
392 .unwrap();
393 kvs.insert_value(&mut storage, 3, &("key3", "value3").into())
394 .unwrap();
395 kvs.remove_value(&mut storage, 3, &"key2".into()).unwrap();
396 kvs.remove_value(&mut storage, 3, &"key10".into()).unwrap();
397 kvs.remove_value(&mut storage, 10, &"key10".into()).unwrap();
398
399 assert_eq!(kvs.len(), 4);
400 assert_eq!(
401 kvs.values(&storage, 3).unwrap(),
402 vec![("key1", "value1").into(), ("key3", "value3").into()]
403 );
404 }
405
406 #[test]
407 fn db_key_values_keys() {
408 let mut storage = Storage::<MemoryStorage>::new("test").unwrap();
409 let mut kvs = DbKeyValues(DbVec::new(&mut storage).unwrap());
410 kvs.insert_value(&mut storage, 3, &("key1", "value1").into())
411 .unwrap();
412 kvs.insert_value(&mut storage, 3, &("key2", "value2").into())
413 .unwrap();
414 kvs.insert_value(&mut storage, 3, &("key3", "value3").into())
415 .unwrap();
416
417 assert_eq!(
418 kvs.keys(&storage, 3).unwrap(),
419 vec!["key1".into(), "key2".into(), "key3".into()]
420 );
421 assert_eq!(kvs.key_count(&storage, 3).unwrap(), 3);
422 assert_eq!(kvs.keys(&storage, 1).unwrap(), vec![]);
423 assert_eq!(kvs.key_count(&storage, 1).unwrap(), 0);
424 }
425
426 #[test]
427 fn db_key_values_value() {
428 let mut storage = Storage::<MemoryStorage>::new("test").unwrap();
429 let mut kvs = DbKeyValues(DbVec::new(&mut storage).unwrap());
430 kvs.insert_value(&mut storage, 3, &("key1", "value1").into())
431 .unwrap();
432 kvs.insert_value(&mut storage, 3, &("key2", "value2").into())
433 .unwrap();
434 kvs.insert_value(&mut storage, 3, &("key3", "value3").into())
435 .unwrap();
436
437 assert_eq!(
438 kvs.value(&storage, 3, &"key1".into()).unwrap(),
439 Some("value1".into())
440 );
441 assert_eq!(
442 kvs.value(&storage, 3, &"key2".into()).unwrap(),
443 Some("value2".into())
444 );
445 assert_eq!(
446 kvs.value(&storage, 3, &"key3".into()).unwrap(),
447 Some("value3".into())
448 );
449 assert_eq!(kvs.value(&storage, 3, &"key4".into()).unwrap(), None);
450 }
451
452 #[test]
453 fn db_key_values_values() {
454 let mut storage = Storage::<MemoryStorage>::new("test").unwrap();
455 let mut kvs = DbKeyValues(DbVec::new(&mut storage).unwrap());
456 kvs.insert_value(&mut storage, 3, &("key1", "value1").into())
457 .unwrap();
458
459 assert_eq!(kvs.values(&storage, 1).unwrap(), vec![]);
460 assert_eq!(
461 kvs.values(&storage, 3).unwrap(),
462 vec![("key1", "value1").into()]
463 );
464 }
465
466 #[test]
467 fn db_key_values_values_by_keys() {
468 let mut storage = Storage::<MemoryStorage>::new("test").unwrap();
469 let mut kvs = DbKeyValues(DbVec::new(&mut storage).unwrap());
470 kvs.insert_value(&mut storage, 3, &("key1", "value1").into())
471 .unwrap();
472 kvs.insert_value(&mut storage, 3, &("key2", "value2").into())
473 .unwrap();
474 kvs.insert_value(&mut storage, 3, &("key3", "value3").into())
475 .unwrap();
476
477 assert_eq!(
478 kvs.values_by_keys(&storage, 3, &["key3".into(), "key1".into()])
479 .unwrap(),
480 vec![("key3", "value3").into(), ("key1", "value1").into()]
481 );
482 assert_eq!(
483 kvs.values_by_keys(&storage, 3, &["key4".into()]).unwrap(),
484 vec![]
485 );
486 assert_eq!(
487 kvs.values_by_keys(&storage, 1, &["key4".into()]).unwrap(),
488 vec![]
489 );
490 }
491
492 #[test]
493 fn db_key_values_from_storage() {
494 let mut storage = Storage::<MemoryStorage>::new("test").unwrap();
495 let index;
496 {
497 let mut kvs = DbKeyValues(DbVec::new(&mut storage).unwrap());
498 kvs.insert_value(&mut storage, 3, &("key1", "value1").into())
499 .unwrap();
500 kvs.insert_value(&mut storage, 3, &("key2", "value2").into())
501 .unwrap();
502 kvs.insert_value(&mut storage, 3, &("key3", "value3").into())
503 .unwrap();
504 index = kvs.storage_index();
505 }
506 let kvs = DbKeyValues::from_storage(&storage, index).unwrap();
507 assert_eq!(kvs.len(), 4);
508 }
509}