1use std::{
12 collections::{HashMap, HashSet},
13 marker::PhantomData,
14};
15
16use serde::{Deserialize, Serialize};
17use serde_bare::{from_slice, to_vec};
18
19use crate::errors::StorageError;
20#[allow(unused_imports)]
21use crate::log::*;
22
23pub fn prop<A>(prop: u8, props: &HashMap<u8, Vec<u8>>) -> Result<A, StorageError>
24where
25 A: for<'a> Deserialize<'a>,
26{
27 Ok(from_slice(
28 &props.get(&prop).ok_or(StorageError::PropertyNotFound)?,
29 )?)
30}
31
32pub fn col<A>(
33 column: &dyn ISingleValueColumn,
34 props: &HashMap<u8, Vec<u8>>,
35) -> Result<A, StorageError>
36where
37 A: for<'a> Deserialize<'a>,
38{
39 Ok(from_slice(
40 &props
41 .get(&column.suffix())
42 .ok_or(StorageError::PropertyNotFound)?,
43 )?)
44}
45
46pub struct Class<'a> {
47 prefix: Option<u8>,
48 pub name: &'static str,
49 existential_column: Option<&'a dyn ISingleValueColumn>,
50 columns: &'a [&'a dyn ISingleValueColumn],
51 multi_value_columns: &'a [&'a dyn IMultiValueColumn],
52}
53
54impl<'a> Class<'a> {
55 pub const fn new(
56 name: &'static str,
57 prefix: Option<u8>,
58 existential_column: Option<&'a dyn ISingleValueColumn>,
59 columns: &'a [&'a dyn ISingleValueColumn],
60 multi_value_columns: &'a [&'a dyn IMultiValueColumn],
61 ) -> Self {
62 if prefix.is_none() {
63 if existential_column.is_some() {
64 panic!("cannot have an existential_column without a prefix");
65 }
66 if columns.len() > 0 {
67 panic!("cannot have some property columns without a prefix");
68 }
69 }
70 Self {
71 columns,
72 name,
73 multi_value_columns,
74 prefix,
75 existential_column,
76 }
77 }
78
79 #[cfg(debug_assertions)]
81 pub fn check(&self) {
82 let mut prefixes = if self.prefix.is_some() {
83 HashSet::from([self.prefix.unwrap()])
84 } else {
85 HashSet::new()
86 };
87
88 let mut suffixes = if self.existential_column.is_some() {
89 HashSet::from([self.existential_column.unwrap().suffix()])
90 } else {
91 HashSet::new()
92 };
93 let name = self.name;
94 for column in self.columns.iter() {
96 if !suffixes.insert(column.suffix()) {
98 panic!(
99 "duplicate suffix {} in {name}!!! check the code",
100 column.suffix() as char
101 );
102 }
103 }
104 for mvc in self.multi_value_columns.iter() {
106 if !prefixes.insert(mvc.prefix()) {
108 panic!(
109 "duplicate prefix {} in {name}!!! check the code",
110 mvc.prefix() as char
111 );
112 }
113 }
114 }
116
117 pub fn prefixes(&self) -> Vec<u8> {
118 let mut res: Vec<u8> = self
119 .multi_value_columns
120 .iter()
121 .map(|c| c.prefix())
122 .collect();
123 if self.prefix.is_some() {
124 res.push(self.prefix.unwrap());
125 }
126 res
127 }
128 fn suffices(&self) -> Vec<u8> {
129 let mut res: Vec<u8> = self.columns.iter().map(|c| c.suffix()).collect();
130 if self.existential_column.is_some() {
131 res.push(self.existential_column.unwrap().suffix());
132 }
133 res
134 }
135}
136
137pub fn format_type_of<T>(_: &T) -> String {
138 format!("{}", std::any::type_name::<T>())
139}
140
141pub trait IModel {
142 fn key(&self) -> &Vec<u8>;
143 fn prefix(&self) -> u8 {
144 self.class().prefix.unwrap()
145 }
146 fn check_exists(&mut self) -> Result<(), StorageError> {
147 if !self.exists() {
148 return Err(StorageError::NotFound);
149 }
150 Ok(())
151 }
152 fn existential(&mut self) -> Option<&mut dyn IExistentialValue>;
153 fn exists(&mut self) -> bool {
154 if self.existential().is_none() || self.class().existential_column.is_none() {
155 return true;
156 }
157 if self.existential().as_mut().unwrap().exists() {
158 return true;
159 }
160 let prefix = self.prefix();
161 let key = self.key();
162 let suffix = self.class().existential_column.unwrap().suffix();
163 match self.storage().get(prefix, key, Some(suffix), &None) {
170 Ok(res) => {
171 self.existential().as_mut().unwrap().process_exists(res);
173 true
174 }
175 Err(_e) => false,
176 }
177 }
178 fn storage(&self) -> &dyn KCVStorage;
179 fn load_props(&self) -> Result<HashMap<u8, Vec<u8>>, StorageError> {
180 if self.class().prefix.is_none() {
181 panic!("cannot call load_props on a Class without prefix");
182 }
183 self.storage().get_all_properties_of_key(
184 self.prefix(),
185 self.key().to_vec(),
186 self.class().suffices(),
187 &None,
188 )
189 }
190 fn class(&self) -> &Class;
191 fn del(&self) -> Result<(), StorageError> {
192 self.storage().write_transaction(&mut |tx| {
193 if self.class().prefix.is_some() {
194 tx.del_all(self.prefix(), self.key(), &self.class().suffices(), &None)?;
195 }
196 for mvc in self.class().multi_value_columns.iter() {
197 let size = mvc.value_size()?;
198 tx.del_all_values(mvc.prefix(), self.key(), size, None, &None)?;
199 }
200 Ok(())
201 })?;
202 Ok(())
203 }
204}
205use std::hash::Hash;
206pub struct MultiValueColumn<
207 Model: IModel,
208 Column: std::fmt::Debug + Eq + PartialEq + Hash + Serialize + Default + for<'a> Deserialize<'a>,
209> {
210 prefix: u8,
211 phantom: PhantomData<Column>,
212 model: PhantomData<Model>,
213 }
215
216impl<
217 Model: IModel,
218 Column: std::fmt::Debug + Eq + PartialEq + Hash + Serialize + Default + for<'d> Deserialize<'d>,
219 > MultiValueColumn<Model, Column>
220{
221 pub const fn new(prefix: u8) -> Self {
222 MultiValueColumn {
223 prefix,
224 phantom: PhantomData,
225 model: PhantomData,
226 }
227 }
228
229 fn compute_key(model: &Model, column: &Column) -> Result<Vec<u8>, StorageError> {
230 let model_key = model.key();
231 let mut column_ser = to_vec(column)?;
232 let mut key = Vec::with_capacity(model_key.len() + column_ser.len());
233 key.append(&mut model_key.to_vec());
234 key.append(&mut column_ser);
235 Ok(key)
236 }
237
238 pub fn add(&self, model: &mut Model, column: &Column) -> Result<(), StorageError> {
239 model.check_exists()?;
240 let key = Self::compute_key(model, column)?;
241 model.storage().put(self.prefix, &key, None, &vec![], &None)
242 }
243
244 pub fn add_lazy(&self, model: &mut Model, column: &Column) -> Result<(), StorageError> {
245 model.check_exists()?;
246 let key = Self::compute_key(model, column)?;
247 model.storage().write_transaction(&mut |tx| {
248 match tx.has_property_value(self.prefix, &key, None, &vec![], &None) {
249 Ok(_) => {}
250 Err(StorageError::NotFound) => {
251 tx.put(self.prefix, &key, None, &vec![], &None)?;
252 }
253 Err(e) => return Err(e),
254 };
255 Ok(())
256 })
257 }
258
259 pub fn remove(&self, model: &mut Model, column: &Column) -> Result<(), StorageError> {
260 model.check_exists()?;
261 let key = Self::compute_key(model, column)?;
262 model.storage().del(self.prefix, &key, None, &None)
263 }
264
265 pub fn has(&self, model: &mut Model, column: &Column) -> Result<(), StorageError> {
266 model.check_exists()?;
267 let key = Self::compute_key(model, column)?;
268 model
269 .storage()
270 .has_property_value(self.prefix, &key, None, &vec![], &None)
271 }
272
273 pub fn remove_from_set_and_add(
274 &self,
275 model: &mut Model,
276 mut remove_set: HashSet<Column>,
277 add_set: HashSet<Column>,
278 ) -> Result<(), StorageError> {
279 model.check_exists()?;
283
284 let key_prefix = model.key();
285 let key_prefix_len = key_prefix.len();
286 let total_size = key_prefix_len + self.value_size()?;
287
288 model.storage().write_transaction(&mut |tx| {
291 for found in tx.get_all_keys_and_values(
292 self.prefix,
293 total_size,
294 key_prefix.to_vec(),
295 None,
296 &None,
297 )? {
298 if found.0.len() == total_size + 1 {
299 let val: Column = from_slice(&found.0[1 + key_prefix_len..total_size + 1])?;
300 if remove_set.remove(&val) {
301 tx.del(self.prefix, &found.0[1..].to_vec(), None, &None)?;
302 }
303 }
304 }
305
306 for add in add_set.iter() {
307 let mut new = Vec::with_capacity(total_size);
308 new.extend(key_prefix);
309 let mut val = to_vec(add)?;
310 new.append(&mut val);
311 tx.put(self.prefix, &new, None, &vec![], &None)?;
313 }
314 return Ok(());
315 })
316 }
317
318 pub fn replace_with_new_set_if_old_set_exists(
319 &self,
320 model: &mut Model,
321 mut existing_set: HashSet<Column>,
322 replace_with: HashSet<Column>,
323 ) -> Result<(), StorageError> {
324 model.check_exists()?;
328
329 let key_prefix = model.key();
330 let key_prefix_len = key_prefix.len();
331 let total_size = key_prefix_len + self.value_size()?;
332
333 let empty_existing = existing_set.is_empty();
334
335 model.storage().write_transaction(&mut |tx| {
338 for found in tx.get_all_keys_and_values(
339 self.prefix,
340 total_size,
341 key_prefix.to_vec(),
342 None,
343 &None,
344 )? {
345 if found.0.len() == total_size + 1 {
346 let val: Column = from_slice(&found.0[1 + key_prefix_len..total_size + 1])?;
347 if empty_existing {
348 return Err(StorageError::NotEmpty);
349 }
350 if existing_set.remove(&val) {
351 tx.del(self.prefix, &found.0[1..].to_vec(), None, &None)?;
352 }
353 }
354 }
355 if existing_set.is_empty() {
356 for add in replace_with.iter() {
357 let mut new = Vec::with_capacity(total_size);
358 new.extend(key_prefix);
359 let mut val = to_vec(add)?;
360 new.append(&mut val);
361 tx.put(self.prefix, &new, None, &vec![], &None)?;
363 }
364 return Ok(());
365 }
366 Err(StorageError::Abort)
367 })
368 }
369
370 pub fn get_all(&self, model: &mut Model) -> Result<HashSet<Column>, StorageError> {
371 model.check_exists()?;
372 let key_prefix = model.key();
373 let key_prefix_len = key_prefix.len();
374 let mut res: HashSet<Column> = HashSet::new();
375 let total_size = key_prefix_len + self.value_size()?;
376 for val in model.storage().get_all_keys_and_values(
377 self.prefix,
378 total_size,
379 key_prefix.to_vec(),
380 None,
381 &None,
382 )? {
383 if val.0.len() == total_size + 1 {
384 let val: Column = from_slice(&val.0[1 + key_prefix_len..total_size + 1])?;
385 res.insert(val);
386 }
387 }
388 Ok(res)
389 }
390}
391
392impl<
393 Model: IModel,
394 Column: std::fmt::Debug + Eq + PartialEq + Hash + Serialize + Default + for<'d> Deserialize<'d>,
395 > IMultiValueColumn for MultiValueColumn<Model, Column>
396{
397 fn value_size(&self) -> Result<usize, StorageError> {
398 Ok(to_vec(&Column::default())?.len())
399 }
400 fn prefix(&self) -> u8 {
401 self.prefix
402 }
403}
404
405pub struct MultiMapColumn<
406 Model: IModel,
407 Column: std::fmt::Debug + Eq + PartialEq + Hash + Serialize + Default + for<'a> Deserialize<'a>,
408 Value: Serialize + for<'a> Deserialize<'a> + Clone + PartialEq,
409> {
410 prefix: u8,
411 phantom_column: PhantomData<Column>,
412 phantom_model: PhantomData<Model>,
413 phantom_value: PhantomData<Value>,
414 }
416
417impl<
418 Model: IModel,
419 Column: std::fmt::Debug + Eq + PartialEq + Hash + Serialize + Default + for<'d> Deserialize<'d>,
420 Value: Serialize + for<'a> Deserialize<'a> + Clone + PartialEq,
421 > MultiMapColumn<Model, Column, Value>
422{
423 pub const fn new(prefix: u8) -> Self {
424 MultiMapColumn {
425 prefix,
426 phantom_column: PhantomData,
427 phantom_model: PhantomData,
428 phantom_value: PhantomData,
429 }
430 }
431 pub fn add(
432 &self,
433 model: &mut Model,
434 column: &Column,
435 value: &Value,
436 ) -> Result<(), StorageError> {
437 model.check_exists()?;
438 let key = MultiValueColumn::compute_key(model, column)?;
439 model
440 .storage()
441 .put(self.prefix, &key, None, &to_vec(value)?, &None)
442 }
443 pub fn remove(
444 &self,
445 model: &mut Model,
446 column: &Column,
447 value: &Value,
448 ) -> Result<(), StorageError> {
449 model.check_exists()?;
450 let key = MultiValueColumn::compute_key(model, column)?;
451 model
452 .storage()
453 .del_property_value(self.prefix, &key, None, &to_vec(value)?, &None)
454 }
455 pub fn remove_regardless_value(
456 &self,
457 model: &mut Model,
458 column: &Column,
459 ) -> Result<(), StorageError> {
460 model.check_exists()?;
461 let key = MultiValueColumn::compute_key(model, column)?;
462 model.storage().del(self.prefix, &key, None, &None)
463 }
464
465 pub fn has(
466 &self,
467 model: &mut Model,
468 column: &Column,
469 value: &Value,
470 ) -> Result<(), StorageError> {
471 model.check_exists()?;
472 let key = MultiValueColumn::compute_key(model, column)?;
473 model
474 .storage()
475 .has_property_value(self.prefix, &key, None, &to_vec(value)?, &None)
476 }
477
478 pub fn get(&self, model: &mut Model, column: &Column) -> Result<Value, StorageError> {
479 model.check_exists()?;
480 let key = MultiValueColumn::compute_key(model, column)?;
481 let val_ser = model.storage().get(self.prefix, &key, None, &None)?;
482 Ok(from_slice(&val_ser)?)
483 }
484
485 pub fn get_or_add(
486 &self,
487 model: &mut Model,
488 column: &Column,
489 value: &Value,
490 ) -> Result<Value, StorageError> {
491 model.check_exists()?;
492 let key = MultiValueColumn::compute_key(model, column)?;
493 let mut found: Option<Value> = None;
494 model.storage().write_transaction(&mut |tx| {
495 found = match tx.get(self.prefix, &key, None, &None) {
496 Ok(val_ser) => Some(from_slice(&val_ser)?),
497 Err(StorageError::NotFound) => {
498 tx.put(self.prefix, &key, None, &to_vec(value)?, &None)?;
499 None
500 }
501 Err(e) => return Err(e),
502 };
503 Ok(())
504 })?;
505 Ok(found.unwrap_or(value.clone()))
506 }
507
508 pub fn add_or_change(
509 &self,
510 model: &mut Model,
511 column: &Column,
512 value: &Value,
513 ) -> Result<(), StorageError> {
514 model.check_exists()?;
515 let key = MultiValueColumn::compute_key(model, column)?;
516 let mut found: Option<Value> = None;
517 model.storage().write_transaction(&mut |tx| {
518 found = match tx.get(self.prefix, &key, None, &None) {
519 Ok(val_ser) => Some(from_slice(&val_ser)?),
520 Err(StorageError::NotFound) => {
521 tx.put(self.prefix, &key, None, &to_vec(value)?, &None)?;
522 None
523 }
524 Err(e) => return Err(e),
525 };
526 if found.is_some() && found.as_ref().unwrap() != value {
527 tx.put(self.prefix, &key, None, &to_vec(value)?, &None)?;
529 }
530 Ok(())
531 })?;
532 Ok(())
533 }
534
535 pub fn get_all(&self, model: &mut Model) -> Result<HashMap<Column, Value>, StorageError> {
536 model.check_exists()?;
537 let key_prefix = model.key();
538 let key_prefix_len = key_prefix.len();
539 let mut res: HashMap<Column, Value> = HashMap::new();
540 let total_size = key_prefix_len + self.value_size()?;
541 for val in model.storage().get_all_keys_and_values(
542 self.prefix,
543 total_size,
544 key_prefix.to_vec(),
545 None,
546 &None,
547 )? {
548 if val.0.len() == total_size + 1 {
549 let col: Column = from_slice(&val.0[1 + key_prefix_len..total_size + 1])?;
550 let val = from_slice(&val.1)?;
551 res.insert(col, val);
552 }
553 }
554 Ok(res)
555 }
556}
557impl<
558 Model: IModel,
559 Column: std::fmt::Debug + Eq + PartialEq + Hash + Serialize + Default + for<'d> Deserialize<'d>,
560 Value: Serialize + for<'a> Deserialize<'a> + Clone + PartialEq,
561 > IMultiValueColumn for MultiMapColumn<Model, Column, Value>
562{
563 fn value_size(&self) -> Result<usize, StorageError> {
564 Ok(to_vec(&Column::default())?.len())
565 }
566 fn prefix(&self) -> u8 {
567 self.prefix
568 }
569}
570
571pub struct MultiCounterColumn<
572 Model: IModel,
573 Column: std::fmt::Debug + Eq + PartialEq + Hash + Serialize + Default + for<'a> Deserialize<'a>,
574> {
575 prefix: u8,
576 phantom_column: PhantomData<Column>,
577 phantom_model: PhantomData<Model>,
578}
579
580impl<
581 Model: IModel,
582 Column: std::fmt::Debug + Eq + PartialEq + Hash + Serialize + Default + for<'d> Deserialize<'d>,
583 > MultiCounterColumn<Model, Column>
584{
585 pub const fn new(prefix: u8) -> Self {
586 MultiCounterColumn {
587 prefix,
588 phantom_column: PhantomData,
589 phantom_model: PhantomData,
590 }
591 }
592 pub fn increment(&self, model: &mut Model, column: &Column) -> Result<(), StorageError> {
593 let key = MultiValueColumn::compute_key(model, column)?;
594 model.storage().write_transaction(&mut |tx| {
595 let mut val: u64 = match tx.get(self.prefix, &key, None, &None) {
596 Ok(val_ser) => from_slice(&val_ser)?,
597 Err(StorageError::NotFound) => 0,
598 Err(e) => return Err(e),
599 };
600 val += 1;
601 let val_ser = to_vec(&val)?;
602 tx.put(self.prefix, &key, None, &val_ser, &None)?;
603 Ok(())
604 })
605 }
606 pub fn decrement(&self, model: &mut Model, column: &Column) -> Result<bool, StorageError> {
608 let key = MultiValueColumn::compute_key(model, column)?;
609 let mut ret: bool = false;
610 model.storage().write_transaction(&mut |tx| {
611 let val_ser = tx.get(self.prefix, &key, None, &None)?;
612 let mut val: u64 = from_slice(&val_ser)?;
613 val -= 1;
614 ret = val == 0;
615 if ret {
616 tx.del(self.prefix, &key, None, &None)?;
617 } else {
618 let val_ser = to_vec(&val)?;
619 tx.put(self.prefix, &key, None, &val_ser, &None)?;
620 }
621 Ok(())
622 })?;
623 Ok(ret)
624 }
625
626 pub fn get(&self, model: &mut Model, column: &Column) -> Result<u64, StorageError> {
627 let key = MultiValueColumn::compute_key(model, column)?;
628 let val_ser = model.storage().get(self.prefix, &key, None, &None)?;
629 let val: u64 = from_slice(&val_ser)?;
630 Ok(val)
631 }
632
633 pub fn get_all(&self, model: &mut Model) -> Result<HashMap<Column, u64>, StorageError> {
634 model.check_exists()?;
635 let key_prefix = model.key();
636 let key_prefix_len = key_prefix.len();
637 let mut res: HashMap<Column, u64> = HashMap::new();
638 let total_size = key_prefix_len + self.value_size()?;
639 for val in model.storage().get_all_keys_and_values(
640 self.prefix,
641 total_size,
642 key_prefix.to_vec(),
643 None,
644 &None,
645 )? {
646 if val.0.len() == total_size + 1 {
647 let col: Column = from_slice(&val.0[1 + key_prefix_len..total_size + 1])?;
648 let val = from_slice(&val.1)?;
649 res.insert(col, val);
650 }
651 }
652 Ok(res)
653 }
654}
655impl<
656 Model: IModel,
657 Column: std::fmt::Debug + Eq + PartialEq + Hash + Serialize + Default + for<'d> Deserialize<'d>,
658 > IMultiValueColumn for MultiCounterColumn<Model, Column>
659{
660 fn value_size(&self) -> Result<usize, StorageError> {
661 Ok(to_vec(&(0 as u64))?.len())
662 }
663 fn prefix(&self) -> u8 {
664 self.prefix
665 }
666}
667
668pub trait ISingleValueColumn {
669 fn suffix(&self) -> u8;
670}
671
672pub trait IMultiValueColumn {
673 fn prefix(&self) -> u8;
674 fn value_size(&self) -> Result<usize, StorageError>;
675}
676
677pub struct SingleValueColumn<Model: IModel, Value: Serialize + for<'a> Deserialize<'a>> {
678 suffix: u8,
679 phantom_value: PhantomData<Value>,
680 phantom_model: PhantomData<Model>,
681}
682
683impl<Model: IModel, Value: Clone + Serialize + for<'d> Deserialize<'d>> ISingleValueColumn
684 for SingleValueColumn<Model, Value>
685{
686 fn suffix(&self) -> u8 {
687 self.suffix
688 }
689}
690
691impl<Model: IModel, Value: Clone + Serialize + for<'d> Deserialize<'d>>
692 SingleValueColumn<Model, Value>
693{
694 pub const fn new(suffix: u8) -> Self {
695 SingleValueColumn {
696 suffix,
697 phantom_value: PhantomData,
698 phantom_model: PhantomData,
699 }
700 }
701
702 pub fn set(&self, model: &mut Model, value: &Value) -> Result<(), StorageError> {
703 model.check_exists()?;
704 model.storage().replace(
705 model.prefix(),
706 model.key(),
707 Some(self.suffix),
708 &to_vec(value)?,
709 &None,
710 )
711 }
712
713 pub fn get(&self, model: &mut Model) -> Result<Value, StorageError> {
714 model.check_exists()?;
715 match model
716 .storage()
717 .get(model.prefix(), model.key(), Some(self.suffix), &None)
718 {
719 Ok(res) => Ok(from_slice::<Value>(&res)?),
720 Err(e) => Err(e),
721 }
722 }
723
724 pub fn get_or_set(&self, model: &mut Model, value: &Value) -> Result<Value, StorageError> {
725 model.check_exists()?;
726 let mut found: Option<Value> = None;
727 model.storage().write_transaction(&mut |tx| {
728 found = match tx.get(model.prefix(), model.key(), Some(self.suffix), &None) {
729 Ok(val_ser) => Some(from_slice(&val_ser)?),
730 Err(StorageError::NotFound) => {
731 tx.put(
732 model.prefix(),
733 model.key(),
734 Some(self.suffix),
735 &to_vec(value)?,
736 &None,
737 )?;
738 None
739 }
740 Err(e) => return Err(e),
741 };
742 Ok(())
743 })?;
744 Ok(found.unwrap_or(value.clone()))
745 }
746
747 pub fn has(&self, model: &mut Model, value: &Value) -> Result<(), StorageError> {
748 model.check_exists()?;
749 model.storage().has_property_value(
750 model.prefix(),
751 model.key(),
752 Some(self.suffix),
753 &to_vec(value)?,
754 &None,
755 )
756 }
757
758 pub fn del(&self, model: &mut Model) -> Result<(), StorageError> {
759 model.check_exists()?;
760 model
761 .storage()
762 .del(model.prefix(), model.key(), Some(self.suffix), &None)
763 }
764}
765
766pub struct CounterValue<Model: IModel> {
769 suffix: u8,
770 phantom_model: PhantomData<Model>,
771}
772
773impl<Model: IModel> ISingleValueColumn for CounterValue<Model> {
774 fn suffix(&self) -> u8 {
775 self.suffix
776 }
777}
778
779impl<Model: IModel> CounterValue<Model> {
780 pub const fn new(suffix: u8) -> Self {
781 CounterValue {
782 suffix,
783 phantom_model: PhantomData,
784 }
785 }
786
787 pub fn increment(&self, model: &mut Model) -> Result<(), StorageError> {
788 model.storage().write_transaction(&mut |tx| {
789 let mut val: u64 = match tx.get(model.prefix(), model.key(), Some(self.suffix), &None) {
790 Ok(val_ser) => from_slice(&val_ser)?,
791 Err(StorageError::NotFound) => 0,
792 Err(e) => return Err(e),
793 };
794 val += 1;
795 let val_ser = to_vec(&val)?;
796 tx.put(
797 model.prefix(),
798 model.key(),
799 Some(self.suffix),
800 &val_ser,
801 &None,
802 )?;
803 Ok(())
804 })
805 }
806 pub fn decrement(&self, model: &mut Model) -> Result<bool, StorageError> {
808 let mut ret: bool = false;
809 model.storage().write_transaction(&mut |tx| {
810 let val_ser = tx.get(model.prefix(), model.key(), Some(self.suffix), &None)?;
811 let mut val: u64 = from_slice(&val_ser)?;
812 val -= 1;
813 ret = val == 0;
814 if ret {
815 tx.del(model.prefix(), model.key(), Some(self.suffix), &None)?;
816 } else {
817 let val_ser = to_vec(&val)?;
818 tx.put(
819 model.prefix(),
820 model.key(),
821 Some(self.suffix),
822 &val_ser,
823 &None,
824 )?;
825 }
826 Ok(())
827 })?;
828 Ok(ret)
829 }
830
831 pub fn get(&self, model: &mut Model) -> Result<u64, StorageError> {
832 let val_res = model
833 .storage()
834 .get(model.prefix(), model.key(), Some(self.suffix), &None);
835 match val_res {
836 Ok(val_ser) => Ok(from_slice(&val_ser)?),
837 Err(StorageError::NotFound) => Ok(0),
838 Err(e) => Err(e),
839 }
840 }
841
842 pub fn del(&self, model: &mut Model) -> Result<(), StorageError> {
843 model.check_exists()?;
844 model
845 .storage()
846 .del(model.prefix(), model.key(), Some(self.suffix), &None)
847 }
848}
849
850pub struct ExistentialValueColumn {
853 suffix: u8,
854}
855
856impl ISingleValueColumn for ExistentialValueColumn {
857 fn suffix(&self) -> u8 {
858 self.suffix
859 }
860}
861
862impl ExistentialValueColumn {
863 pub const fn new(suffix: u8) -> Self {
864 ExistentialValueColumn { suffix }
865 }
866}
867
868pub struct ExistentialValue<Column: Serialize + for<'d> Deserialize<'d>> {
869 value: Option<Column>,
870 value_ser: Vec<u8>,
871}
872pub trait IExistentialValue {
873 fn process_exists(&mut self, value_ser: Vec<u8>);
874
875 fn exists(&self) -> bool;
876}
877
878impl<Column: Serialize + for<'d> Deserialize<'d>> IExistentialValue for ExistentialValue<Column> {
879 fn exists(&self) -> bool {
880 self.value.is_some() || self.value_ser.len() > 0
881 }
882 fn process_exists(&mut self, value_ser: Vec<u8>) {
883 self.value_ser = value_ser;
884 }
885}
886
887impl<Column: Clone + Serialize + for<'d> Deserialize<'d>> ExistentialValue<Column> {
888 pub fn new() -> Self {
889 ExistentialValue {
890 value: None,
891 value_ser: vec![],
892 }
893 }
894
895 pub fn set(&mut self, value: &Column) -> Result<(), StorageError> {
896 if self.value.is_some() {
897 return Err(StorageError::AlreadyExists);
898 }
899 self.value = Some(value.clone());
900
901 Ok(())
902 }
903
904 pub fn save<Model: IModel>(model: &Model, value: &Column) -> Result<(), StorageError> {
905 model.storage().replace(
906 model.prefix(),
907 model.key(),
908 Some(model.class().existential_column.unwrap().suffix()),
909 &to_vec(value)?,
910 &None,
911 )?;
912 Ok(())
913 }
914
915 pub fn get(&mut self) -> Result<&Column, StorageError> {
916 if self.value.is_some() {
917 return Ok(self.value.as_ref().unwrap());
918 }
919 if self.value_ser.is_empty() {
920 return Err(StorageError::BackendError);
921 }
922 let value = from_slice::<Column>(&self.value_ser);
923 match value {
924 Err(_) => return Err(StorageError::InvalidValue),
925 Ok(val) => {
926 self.value = Some(val);
927 return Ok(self.value.as_ref().unwrap());
928 }
929 }
930 }
931
932 pub fn take(mut self) -> Result<Column, StorageError> {
933 self.get()?;
934 Ok(self.value.take().unwrap())
935 }
936}
937
938pub trait WriteTransaction: ReadTransaction {
939 fn put(
941 &self,
942 prefix: u8,
943 key: &Vec<u8>,
944 suffix: Option<u8>,
945 value: &Vec<u8>,
946 family: &Option<String>,
947 ) -> Result<(), StorageError>;
948
949 fn replace(
951 &self,
952 prefix: u8,
953 key: &Vec<u8>,
954 suffix: Option<u8>,
955 value: &Vec<u8>,
956 family: &Option<String>,
957 ) -> Result<(), StorageError>;
958
959 fn del(
961 &self,
962 prefix: u8,
963 key: &Vec<u8>,
964 suffix: Option<u8>,
965 family: &Option<String>,
966 ) -> Result<(), StorageError>;
967
968 fn del_all(
970 &self,
971 prefix: u8,
972 key: &Vec<u8>,
973 all_suffixes: &[u8],
974 family: &Option<String>,
975 ) -> Result<(), StorageError>;
976
977 fn del_property_value(
979 &self,
980 prefix: u8,
981 key: &Vec<u8>,
982 suffix: Option<u8>,
983 value: &Vec<u8>,
984 family: &Option<String>,
985 ) -> Result<(), StorageError>;
986
987 fn del_all_values(
989 &self,
990 prefix: u8,
991 key: &Vec<u8>,
992 property_size: usize,
993 suffix: Option<u8>,
994 family: &Option<String>,
995 ) -> Result<(), StorageError>;
996}
997
998pub trait ReadTransaction {
999 fn get(
1001 &self,
1002 prefix: u8,
1003 key: &Vec<u8>,
1004 suffix: Option<u8>,
1005 family: &Option<String>,
1006 ) -> Result<Vec<u8>, StorageError>;
1007
1008 #[deprecated(
1010 note = "KVStore has unique values (since switch from lmdb to rocksdb) use get() instead"
1011 )]
1012 fn get_all(
1013 &self,
1014 prefix: u8,
1015 key: &Vec<u8>,
1016 suffix: Option<u8>,
1017 family: &Option<String>,
1018 ) -> Result<Vec<Vec<u8>>, StorageError>;
1019
1020 fn get_all_properties_of_key(
1021 &self,
1022 prefix: u8,
1023 key: Vec<u8>,
1024 properties: Vec<u8>,
1025 family: &Option<String>,
1026 ) -> Result<HashMap<u8, Vec<u8>>, StorageError>;
1027
1028 fn has_property_value(
1030 &self,
1031 prefix: u8,
1032 key: &Vec<u8>,
1033 suffix: Option<u8>,
1034 value: &Vec<u8>,
1035 family: &Option<String>,
1036 ) -> Result<(), StorageError>;
1037
1038 fn get_all_keys_and_values(
1040 &self,
1041 prefix: u8,
1042 key_size: usize,
1043 key_prefix: Vec<u8>,
1044 suffix: Option<u8>,
1045 family: &Option<String>,
1046 ) -> Result<Vec<(Vec<u8>, Vec<u8>)>, StorageError>;
1047}
1048
1049pub trait KCVStorage: WriteTransaction {
1050 fn write_transaction(
1051 &self,
1052 method: &mut dyn FnMut(&mut dyn WriteTransaction) -> Result<(), StorageError>,
1053 ) -> Result<(), StorageError>;
1054
1055 }