1use crate::{
10 hash::{ReversibleStorageHasher, StorageHasher},
11 storage::types::{
12 EncodeLikeTuple, HasKeyPrefix, HasReversibleKeyPrefix, KeyGenerator,
13 ReversibleKeyGenerator, TupleToEncodedIter,
14 },
15};
16use alloc::{collections::btree_set::BTreeSet, vec::Vec};
17use codec::{Decode, Encode, EncodeLike, FullCodec, FullEncode};
18use core::marker::PhantomData;
19use subsoil::core::storage::ChildInfo;
20use subsoil::runtime::generic::{Digest, DigestItem};
21
22pub use self::{
23 stream_iter::StorageStreamIter,
24 transactional::{
25 in_storage_layer, with_storage_layer, with_transaction, with_transaction_unchecked,
26 },
27 types::StorageEntryMetadataBuilder,
28};
29pub use subsoil::runtime::TransactionOutcome;
30pub use types::Key;
31
32pub mod bounded_btree_map;
33pub mod bounded_btree_set;
34pub mod bounded_vec;
35pub mod child;
36#[doc(hidden)]
37pub mod generator;
38pub mod hashed;
39pub mod migration;
40pub mod storage_noop_guard;
41mod stream_iter;
42pub mod transactional;
43pub mod types;
44pub mod unhashed;
45pub mod weak_bounded_vec;
46
47pub struct KeyLenOf<M>(PhantomData<M>);
50
51pub trait StorageValue<T: FullCodec> {
55 type Query;
57
58 fn hashed_key() -> [u8; 32];
60
61 fn exists() -> bool;
63
64 fn get() -> Self::Query;
66
67 fn try_get() -> Result<T, ()>;
71
72 fn translate<O: Decode, F: FnOnce(Option<O>) -> Option<T>>(f: F) -> Result<Option<T>, ()>;
93
94 fn put<Arg: EncodeLike<T>>(val: Arg);
96
97 fn set(val: Self::Query);
100
101 fn mutate<R, F: FnOnce(&mut Self::Query) -> R>(f: F) -> R;
103
104 fn mutate_extant<R: Default, F: FnOnce(&mut T) -> R>(f: F) -> R {
107 Self::mutate_exists(|maybe_v| match maybe_v {
108 Some(ref mut value) => f(value),
109 None => R::default(),
110 })
111 }
112
113 fn try_mutate<R, E, F: FnOnce(&mut Self::Query) -> Result<R, E>>(f: F) -> Result<R, E>;
115
116 fn mutate_exists<R, F: FnOnce(&mut Option<T>) -> R>(f: F) -> R;
118
119 fn try_mutate_exists<R, E, F: FnOnce(&mut Option<T>) -> Result<R, E>>(f: F) -> Result<R, E>;
121
122 fn kill();
124
125 fn take() -> Self::Query;
127
128 fn append<Item, EncodeLikeItem>(item: EncodeLikeItem)
138 where
139 Item: Encode,
140 EncodeLikeItem: EncodeLike<Item>,
141 T: StorageAppend<Item>;
142
143 fn decode_len() -> Option<usize>
155 where
156 T: StorageDecodeLength,
157 {
158 T::decode_len(&Self::hashed_key())
159 }
160
161 #[doc = docify::embed!("src/storage/mod.rs", btree_set_decode_non_dedup_len)]
178 fn decode_non_dedup_len() -> Option<usize>
181 where
182 T: StorageDecodeNonDedupLength,
183 {
184 T::decode_non_dedup_len(&Self::hashed_key())
185 }
186}
187
188pub trait StorageList<V: FullCodec> {
190 type Iterator: Iterator<Item = V>;
192
193 type Appender: StorageAppender<V>;
195
196 fn iter() -> Self::Iterator;
198
199 fn drain() -> Self::Iterator;
204
205 fn appender() -> Self::Appender;
207
208 fn append_one<EncodeLikeValue>(item: EncodeLikeValue)
213 where
214 EncodeLikeValue: EncodeLike<V>,
215 {
216 Self::append_many(core::iter::once(item));
217 }
218
219 fn append_many<EncodeLikeValue, I>(items: I)
225 where
226 EncodeLikeValue: EncodeLike<V>,
227 I: IntoIterator<Item = EncodeLikeValue>,
228 {
229 let mut ap = Self::appender();
230 ap.append_many(items);
231 }
232}
233
234pub trait StorageAppender<V: FullCodec> {
238 fn append<EncodeLikeValue>(&mut self, item: EncodeLikeValue)
240 where
241 EncodeLikeValue: EncodeLike<V>;
242
243 fn append_many<EncodeLikeValue, I>(&mut self, items: I)
247 where
248 EncodeLikeValue: EncodeLike<V>,
249 I: IntoIterator<Item = EncodeLikeValue>,
250 {
251 for item in items.into_iter() {
252 self.append(item);
253 }
254 }
255}
256
257pub trait StorageMap<K: FullEncode, V: FullCodec> {
261 type Query;
263
264 fn hashed_key_for<KeyArg: EncodeLike<K>>(key: KeyArg) -> Vec<u8>;
266
267 fn contains_key<KeyArg: EncodeLike<K>>(key: KeyArg) -> bool;
269
270 fn get<KeyArg: EncodeLike<K>>(key: KeyArg) -> Self::Query;
272
273 fn set<KeyArg: EncodeLike<K>>(key: KeyArg, query: Self::Query);
275
276 fn try_get<KeyArg: EncodeLike<K>>(key: KeyArg) -> Result<V, ()>;
280
281 fn swap<KeyArg1: EncodeLike<K>, KeyArg2: EncodeLike<K>>(key1: KeyArg1, key2: KeyArg2);
283
284 fn insert<KeyArg: EncodeLike<K>, ValArg: EncodeLike<V>>(key: KeyArg, val: ValArg);
286
287 fn remove<KeyArg: EncodeLike<K>>(key: KeyArg);
289
290 fn mutate<KeyArg: EncodeLike<K>, R, F: FnOnce(&mut Self::Query) -> R>(key: KeyArg, f: F) -> R;
292
293 fn try_mutate<KeyArg: EncodeLike<K>, R, E, F: FnOnce(&mut Self::Query) -> Result<R, E>>(
295 key: KeyArg,
296 f: F,
297 ) -> Result<R, E>;
298
299 fn mutate_extant<KeyArg: EncodeLike<K>, R: Default, F: FnOnce(&mut V) -> R>(
302 key: KeyArg,
303 f: F,
304 ) -> R {
305 Self::mutate_exists(key, |maybe_v| match maybe_v {
306 Some(ref mut value) => f(value),
307 None => R::default(),
308 })
309 }
310
311 fn mutate_exists<KeyArg: EncodeLike<K>, R, F: FnOnce(&mut Option<V>) -> R>(
315 key: KeyArg,
316 f: F,
317 ) -> R;
318
319 fn try_mutate_exists<KeyArg: EncodeLike<K>, R, E, F: FnOnce(&mut Option<V>) -> Result<R, E>>(
323 key: KeyArg,
324 f: F,
325 ) -> Result<R, E>;
326
327 fn take<KeyArg: EncodeLike<K>>(key: KeyArg) -> Self::Query;
329
330 fn append<Item, EncodeLikeItem, EncodeLikeKey>(key: EncodeLikeKey, item: EncodeLikeItem)
340 where
341 EncodeLikeKey: EncodeLike<K>,
342 Item: Encode,
343 EncodeLikeItem: EncodeLike<Item>,
344 V: StorageAppend<Item>;
345
346 fn decode_len<KeyArg: EncodeLike<K>>(key: KeyArg) -> Option<usize>
359 where
360 V: StorageDecodeLength,
361 {
362 V::decode_len(&Self::hashed_key_for(key))
363 }
364
365 fn decode_non_dedup_len<KeyArg: EncodeLike<K>>(key: KeyArg) -> Option<usize>
381 where
382 V: StorageDecodeNonDedupLength,
383 {
384 V::decode_non_dedup_len(&Self::hashed_key_for(key))
385 }
386
387 fn migrate_key<OldHasher: StorageHasher, KeyArg: EncodeLike<K>>(key: KeyArg) -> Option<V>;
391
392 fn migrate_key_from_blake<KeyArg: EncodeLike<K>>(key: KeyArg) -> Option<V> {
396 Self::migrate_key::<crate::hash::Blake2_256, KeyArg>(key)
397 }
398}
399
400pub trait IterableStorageMap<K: FullEncode, V: FullCodec>: StorageMap<K, V> {
402 type Iterator: Iterator<Item = (K, V)>;
404 type KeyIterator: Iterator<Item = K>;
406
407 fn iter() -> Self::Iterator;
410
411 fn iter_from(starting_raw_key: Vec<u8>) -> Self::Iterator;
415
416 fn iter_keys() -> Self::KeyIterator;
419
420 fn iter_keys_from(starting_raw_key: Vec<u8>) -> Self::KeyIterator;
423
424 fn drain() -> Self::Iterator;
427
428 fn translate<O: Decode, F: FnMut(K, O) -> Option<V>>(f: F);
434
435 fn translate_next<O: Decode, F: FnMut(K, O) -> Option<V>>(
440 previous_key: Option<Vec<u8>>,
441 f: F,
442 ) -> Option<Vec<u8>>;
443}
444
445pub trait IterableStorageDoubleMap<K1: FullCodec, K2: FullCodec, V: FullCodec>:
447 StorageDoubleMap<K1, K2, V>
448{
449 type PartialKeyIterator: Iterator<Item = K2>;
451
452 type PrefixIterator: Iterator<Item = (K2, V)>;
454
455 type FullKeyIterator: Iterator<Item = (K1, K2)>;
457
458 type Iterator: Iterator<Item = (K1, K2, V)>;
460
461 fn iter_prefix(k1: impl EncodeLike<K1>) -> Self::PrefixIterator;
465
466 fn iter_prefix_from(k1: impl EncodeLike<K1>, starting_raw_key: Vec<u8>)
470 -> Self::PrefixIterator;
471
472 fn iter_key_prefix(k1: impl EncodeLike<K1>) -> Self::PartialKeyIterator;
476
477 fn iter_key_prefix_from(
481 k1: impl EncodeLike<K1>,
482 starting_raw_key: Vec<u8>,
483 ) -> Self::PartialKeyIterator;
484
485 fn drain_prefix(k1: impl EncodeLike<K1>) -> Self::PrefixIterator;
489
490 fn iter() -> Self::Iterator;
493
494 fn iter_from(starting_raw_key: Vec<u8>) -> Self::Iterator;
498
499 fn iter_keys() -> Self::FullKeyIterator;
502
503 fn iter_keys_from(starting_raw_key: Vec<u8>) -> Self::FullKeyIterator;
507
508 fn drain() -> Self::Iterator;
511
512 fn translate<O: Decode, F: FnMut(K1, K2, O) -> Option<V>>(f: F);
518}
519
520pub trait IterableStorageNMap<K: ReversibleKeyGenerator, V: FullCodec>: StorageNMap<K, V> {
523 type KeyIterator: Iterator<Item = K::Key>;
525
526 type Iterator: Iterator<Item = (K::Key, V)>;
528
529 fn iter_prefix<KP>(kp: KP) -> PrefixIterator<(<K as HasKeyPrefix<KP>>::Suffix, V)>
533 where
534 K: HasReversibleKeyPrefix<KP>;
535
536 fn iter_prefix_from<KP>(
540 kp: KP,
541 starting_raw_key: Vec<u8>,
542 ) -> PrefixIterator<(<K as HasKeyPrefix<KP>>::Suffix, V)>
543 where
544 K: HasReversibleKeyPrefix<KP>;
545
546 fn iter_key_prefix<KP>(kp: KP) -> KeyPrefixIterator<<K as HasKeyPrefix<KP>>::Suffix>
550 where
551 K: HasReversibleKeyPrefix<KP>;
552
553 fn iter_key_prefix_from<KP>(
557 kp: KP,
558 starting_raw_key: Vec<u8>,
559 ) -> KeyPrefixIterator<<K as HasKeyPrefix<KP>>::Suffix>
560 where
561 K: HasReversibleKeyPrefix<KP>;
562
563 fn drain_prefix<KP>(kp: KP) -> PrefixIterator<(<K as HasKeyPrefix<KP>>::Suffix, V)>
567 where
568 K: HasReversibleKeyPrefix<KP>;
569
570 fn iter() -> Self::Iterator;
573
574 fn iter_from(starting_raw_key: Vec<u8>) -> Self::Iterator;
578
579 fn iter_keys() -> Self::KeyIterator;
582
583 fn iter_keys_from(starting_raw_key: Vec<u8>) -> Self::KeyIterator;
587
588 fn drain() -> Self::Iterator;
591
592 fn translate<O: Decode, F: FnMut(K::Key, O) -> Option<V>>(f: F);
598}
599
600pub trait StorageDoubleMap<K1: FullEncode, K2: FullEncode, V: FullCodec> {
604 type Query;
606
607 fn hashed_key_for<KArg1, KArg2>(k1: KArg1, k2: KArg2) -> Vec<u8>
609 where
610 KArg1: EncodeLike<K1>,
611 KArg2: EncodeLike<K2>;
612
613 fn contains_key<KArg1, KArg2>(k1: KArg1, k2: KArg2) -> bool
615 where
616 KArg1: EncodeLike<K1>,
617 KArg2: EncodeLike<K2>;
618
619 fn get<KArg1, KArg2>(k1: KArg1, k2: KArg2) -> Self::Query
621 where
622 KArg1: EncodeLike<K1>,
623 KArg2: EncodeLike<K2>;
624
625 fn try_get<KArg1, KArg2>(k1: KArg1, k2: KArg2) -> Result<V, ()>
629 where
630 KArg1: EncodeLike<K1>,
631 KArg2: EncodeLike<K2>;
632
633 fn set<KArg1: EncodeLike<K1>, KArg2: EncodeLike<K2>>(k1: KArg1, k2: KArg2, query: Self::Query);
635
636 fn take<KArg1, KArg2>(k1: KArg1, k2: KArg2) -> Self::Query
638 where
639 KArg1: EncodeLike<K1>,
640 KArg2: EncodeLike<K2>;
641
642 fn swap<XKArg1, XKArg2, YKArg1, YKArg2>(x_k1: XKArg1, x_k2: XKArg2, y_k1: YKArg1, y_k2: YKArg2)
644 where
645 XKArg1: EncodeLike<K1>,
646 XKArg2: EncodeLike<K2>,
647 YKArg1: EncodeLike<K1>,
648 YKArg2: EncodeLike<K2>;
649
650 fn insert<KArg1, KArg2, VArg>(k1: KArg1, k2: KArg2, val: VArg)
652 where
653 KArg1: EncodeLike<K1>,
654 KArg2: EncodeLike<K2>,
655 VArg: EncodeLike<V>;
656
657 fn remove<KArg1, KArg2>(k1: KArg1, k2: KArg2)
659 where
660 KArg1: EncodeLike<K1>,
661 KArg2: EncodeLike<K2>;
662
663 #[deprecated = "Use `clear_prefix` instead"]
676 fn remove_prefix<KArg1>(k1: KArg1, limit: Option<u32>) -> subsoil::io::KillStorageResult
677 where
678 KArg1: ?Sized + EncodeLike<K1>;
679
680 fn clear_prefix<KArg1>(
696 k1: KArg1,
697 limit: u32,
698 maybe_cursor: Option<&[u8]>,
699 ) -> subsoil::io::MultiRemovalResults
700 where
701 KArg1: ?Sized + EncodeLike<K1>;
702
703 fn contains_prefix<KArg1>(k1: KArg1) -> bool
706 where
707 KArg1: EncodeLike<K1>;
708
709 fn iter_prefix_values<KArg1>(k1: KArg1) -> PrefixIterator<V>
711 where
712 KArg1: ?Sized + EncodeLike<K1>;
713
714 fn mutate<KArg1, KArg2, R, F>(k1: KArg1, k2: KArg2, f: F) -> R
716 where
717 KArg1: EncodeLike<K1>,
718 KArg2: EncodeLike<K2>,
719 F: FnOnce(&mut Self::Query) -> R;
720
721 fn try_mutate<KArg1, KArg2, R, E, F>(k1: KArg1, k2: KArg2, f: F) -> Result<R, E>
723 where
724 KArg1: EncodeLike<K1>,
725 KArg2: EncodeLike<K2>,
726 F: FnOnce(&mut Self::Query) -> Result<R, E>;
727
728 fn mutate_exists<KArg1, KArg2, R, F>(k1: KArg1, k2: KArg2, f: F) -> R
730 where
731 KArg1: EncodeLike<K1>,
732 KArg2: EncodeLike<K2>,
733 F: FnOnce(&mut Option<V>) -> R;
734
735 fn try_mutate_exists<KArg1, KArg2, R, E, F>(k1: KArg1, k2: KArg2, f: F) -> Result<R, E>
739 where
740 KArg1: EncodeLike<K1>,
741 KArg2: EncodeLike<K2>,
742 F: FnOnce(&mut Option<V>) -> Result<R, E>;
743
744 fn append<Item, EncodeLikeItem, KArg1, KArg2>(k1: KArg1, k2: KArg2, item: EncodeLikeItem)
754 where
755 KArg1: EncodeLike<K1>,
756 KArg2: EncodeLike<K2>,
757 Item: Encode,
758 EncodeLikeItem: EncodeLike<Item>,
759 V: StorageAppend<Item>;
760
761 fn decode_len<KArg1, KArg2>(key1: KArg1, key2: KArg2) -> Option<usize>
774 where
775 KArg1: EncodeLike<K1>,
776 KArg2: EncodeLike<K2>,
777 V: StorageDecodeLength,
778 {
779 V::decode_len(&Self::hashed_key_for(key1, key2))
780 }
781
782 fn decode_non_dedup_len<KArg1, KArg2>(key1: KArg1, key2: KArg2) -> Option<usize>
795 where
796 KArg1: EncodeLike<K1>,
797 KArg2: EncodeLike<K2>,
798 V: StorageDecodeNonDedupLength,
799 {
800 V::decode_non_dedup_len(&Self::hashed_key_for(key1, key2))
801 }
802
803 fn migrate_keys<
808 OldHasher1: StorageHasher,
809 OldHasher2: StorageHasher,
810 KeyArg1: EncodeLike<K1>,
811 KeyArg2: EncodeLike<K2>,
812 >(
813 key1: KeyArg1,
814 key2: KeyArg2,
815 ) -> Option<V>;
816}
817
818pub trait StorageNMap<K: KeyGenerator, V: FullCodec> {
822 type Query;
824
825 fn hashed_key_for<KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter>(key: KArg) -> Vec<u8>;
827
828 fn contains_key<KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter>(key: KArg) -> bool;
830
831 fn get<KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter>(key: KArg) -> Self::Query;
833
834 fn try_get<KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter>(key: KArg) -> Result<V, ()>;
838
839 fn set<KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter>(key: KArg, query: Self::Query);
841
842 fn swap<KOther, KArg1, KArg2>(key1: KArg1, key2: KArg2)
844 where
845 KOther: KeyGenerator,
846 KArg1: EncodeLikeTuple<K::KArg> + TupleToEncodedIter,
847 KArg2: EncodeLikeTuple<KOther::KArg> + TupleToEncodedIter;
848
849 fn insert<KArg, VArg>(key: KArg, val: VArg)
851 where
852 KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter,
853 VArg: EncodeLike<V>;
854
855 fn remove<KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter>(key: KArg);
857
858 #[deprecated = "Use `clear_prefix` instead"]
871 fn remove_prefix<KP>(partial_key: KP, limit: Option<u32>) -> subsoil::io::KillStorageResult
872 where
873 K: HasKeyPrefix<KP>;
874
875 fn clear_prefix<KP>(
899 partial_key: KP,
900 limit: u32,
901 maybe_cursor: Option<&[u8]>,
902 ) -> subsoil::io::MultiRemovalResults
903 where
904 K: HasKeyPrefix<KP>;
905
906 fn contains_prefix<KP>(partial_key: KP) -> bool
909 where
910 K: HasKeyPrefix<KP>;
911
912 fn iter_prefix_values<KP>(partial_key: KP) -> PrefixIterator<V>
914 where
915 K: HasKeyPrefix<KP>;
916
917 fn mutate<KArg, R, F>(key: KArg, f: F) -> R
919 where
920 KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter,
921 F: FnOnce(&mut Self::Query) -> R;
922
923 fn try_mutate<KArg, R, E, F>(key: KArg, f: F) -> Result<R, E>
925 where
926 KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter,
927 F: FnOnce(&mut Self::Query) -> Result<R, E>;
928
929 fn mutate_exists<KArg, R, F>(key: KArg, f: F) -> R
933 where
934 KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter,
935 F: FnOnce(&mut Option<V>) -> R;
936
937 fn try_mutate_exists<KArg, R, E, F>(key: KArg, f: F) -> Result<R, E>
941 where
942 KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter,
943 F: FnOnce(&mut Option<V>) -> Result<R, E>;
944
945 fn take<KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter>(key: KArg) -> Self::Query;
947
948 fn append<Item, EncodeLikeItem, KArg>(key: KArg, item: EncodeLikeItem)
958 where
959 KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter,
960 Item: Encode,
961 EncodeLikeItem: EncodeLike<Item>,
962 V: StorageAppend<Item>;
963
964 fn decode_len<KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter>(key: KArg) -> Option<usize>
977 where
978 V: StorageDecodeLength,
979 {
980 V::decode_len(&Self::hashed_key_for(key))
981 }
982
983 fn migrate_keys<KArg>(key: KArg, hash_fns: K::HArg) -> Option<V>
987 where
988 KArg: EncodeLikeTuple<K::KArg> + TupleToEncodedIter;
989}
990
991pub struct PrefixIterator<T, OnRemoval = ()> {
997 prefix: Vec<u8>,
998 previous_key: Vec<u8>,
999 drain: bool,
1001 closure: fn(&[u8], &[u8]) -> Result<T, codec::Error>,
1004 phantom: core::marker::PhantomData<OnRemoval>,
1005}
1006
1007impl<T, OnRemoval1> PrefixIterator<T, OnRemoval1> {
1008 pub fn convert_on_removal<OnRemoval2>(self) -> PrefixIterator<T, OnRemoval2> {
1010 PrefixIterator::<T, OnRemoval2> {
1011 prefix: self.prefix,
1012 previous_key: self.previous_key,
1013 drain: self.drain,
1014 closure: self.closure,
1015 phantom: Default::default(),
1016 }
1017 }
1018}
1019
1020pub trait PrefixIteratorOnRemoval {
1022 fn on_removal(key: &[u8], value: &[u8]);
1024}
1025
1026impl PrefixIteratorOnRemoval for () {
1028 fn on_removal(_key: &[u8], _value: &[u8]) {}
1029}
1030
1031impl<T, OnRemoval> PrefixIterator<T, OnRemoval> {
1032 pub fn new(
1041 prefix: Vec<u8>,
1042 previous_key: Vec<u8>,
1043 decode_fn: fn(&[u8], &[u8]) -> Result<T, codec::Error>,
1044 ) -> Self {
1045 PrefixIterator {
1046 prefix,
1047 previous_key,
1048 drain: false,
1049 closure: decode_fn,
1050 phantom: Default::default(),
1051 }
1052 }
1053
1054 pub fn last_raw_key(&self) -> &[u8] {
1056 &self.previous_key
1057 }
1058
1059 pub fn prefix(&self) -> &[u8] {
1061 &self.prefix
1062 }
1063
1064 pub fn set_last_raw_key(&mut self, previous_key: Vec<u8>) {
1066 self.previous_key = previous_key;
1067 }
1068
1069 pub fn drain(mut self) -> Self {
1071 self.drain = true;
1072 self
1073 }
1074}
1075
1076impl<T, OnRemoval: PrefixIteratorOnRemoval> Iterator for PrefixIterator<T, OnRemoval> {
1077 type Item = T;
1078
1079 fn next(&mut self) -> Option<Self::Item> {
1080 loop {
1081 let maybe_next = subsoil::io::storage::next_key(&self.previous_key)
1082 .filter(|n| n.starts_with(&self.prefix));
1083 break match maybe_next {
1084 Some(next) => {
1085 self.previous_key = next;
1086 let raw_value = match unhashed::get_raw(&self.previous_key) {
1087 Some(raw_value) => raw_value,
1088 None => {
1089 log::error!(
1090 "next_key returned a key with no value at {:?}",
1091 self.previous_key,
1092 );
1093 continue;
1094 },
1095 };
1096 if self.drain {
1097 unhashed::kill(&self.previous_key);
1098 OnRemoval::on_removal(&self.previous_key, &raw_value);
1099 }
1100 let raw_key_without_prefix = &self.previous_key[self.prefix.len()..];
1101 let item = match (self.closure)(raw_key_without_prefix, &raw_value[..]) {
1102 Ok(item) => item,
1103 Err(e) => {
1104 log::error!(
1105 "(key, value) failed to decode at {:?}: {:?}",
1106 self.previous_key,
1107 e,
1108 );
1109 continue;
1110 },
1111 };
1112
1113 Some(item)
1114 },
1115 None => None,
1116 };
1117 }
1118 }
1119}
1120
1121pub struct KeyPrefixIterator<T> {
1125 prefix: Vec<u8>,
1126 previous_key: Vec<u8>,
1127 drain: bool,
1129 closure: fn(&[u8]) -> Result<T, codec::Error>,
1132}
1133
1134impl<T> KeyPrefixIterator<T> {
1135 pub fn new(
1143 prefix: Vec<u8>,
1144 previous_key: Vec<u8>,
1145 decode_fn: fn(&[u8]) -> Result<T, codec::Error>,
1146 ) -> Self {
1147 KeyPrefixIterator { prefix, previous_key, drain: false, closure: decode_fn }
1148 }
1149
1150 pub fn last_raw_key(&self) -> &[u8] {
1152 &self.previous_key
1153 }
1154
1155 pub fn prefix(&self) -> &[u8] {
1157 &self.prefix
1158 }
1159
1160 pub fn set_last_raw_key(&mut self, previous_key: Vec<u8>) {
1162 self.previous_key = previous_key;
1163 }
1164
1165 pub fn drain(mut self) -> Self {
1167 self.drain = true;
1168 self
1169 }
1170}
1171
1172impl<T> Iterator for KeyPrefixIterator<T> {
1173 type Item = T;
1174
1175 fn next(&mut self) -> Option<Self::Item> {
1176 loop {
1177 let maybe_next = subsoil::io::storage::next_key(&self.previous_key)
1178 .filter(|n| n.starts_with(&self.prefix));
1179
1180 if let Some(next) = maybe_next {
1181 self.previous_key = next;
1182 if self.drain {
1183 unhashed::kill(&self.previous_key);
1184 }
1185 let raw_key_without_prefix = &self.previous_key[self.prefix.len()..];
1186
1187 match (self.closure)(raw_key_without_prefix) {
1188 Ok(item) => return Some(item),
1189 Err(e) => {
1190 log::error!("key failed to decode at {:?}: {:?}", self.previous_key, e);
1191 continue;
1192 },
1193 }
1194 }
1195
1196 return None;
1197 }
1198 }
1199}
1200
1201pub struct ChildTriePrefixIterator<T> {
1205 prefix: Vec<u8>,
1207 child_info: ChildInfo,
1209 previous_key: Vec<u8>,
1211 drain: bool,
1213 fetch_previous_key: bool,
1215 closure: fn(&[u8], &[u8]) -> Result<T, codec::Error>,
1218}
1219
1220impl<T> ChildTriePrefixIterator<T> {
1221 pub fn drain(mut self) -> Self {
1223 self.drain = true;
1224 self
1225 }
1226}
1227
1228impl<T: Decode + Sized> ChildTriePrefixIterator<(Vec<u8>, T)> {
1229 pub fn with_prefix(child_info: &ChildInfo, prefix: &[u8]) -> Self {
1234 let prefix = prefix.to_vec();
1235 let previous_key = prefix.clone();
1236 let closure = |raw_key_without_prefix: &[u8], mut raw_value: &[u8]| {
1237 let value = T::decode(&mut raw_value)?;
1238 Ok((raw_key_without_prefix.to_vec(), value))
1239 };
1240
1241 Self {
1242 prefix,
1243 child_info: child_info.clone(),
1244 previous_key,
1245 drain: false,
1246 fetch_previous_key: true,
1247 closure,
1248 }
1249 }
1250}
1251
1252impl<K: Decode + Sized, T: Decode + Sized> ChildTriePrefixIterator<(K, T)> {
1253 pub fn with_prefix_over_key<H: ReversibleStorageHasher>(
1258 child_info: &ChildInfo,
1259 prefix: &[u8],
1260 ) -> Self {
1261 let prefix = prefix.to_vec();
1262 let previous_key = prefix.clone();
1263 let closure = |raw_key_without_prefix: &[u8], mut raw_value: &[u8]| {
1264 let mut key_material = H::reverse(raw_key_without_prefix);
1265 let key = K::decode(&mut key_material)?;
1266 let value = T::decode(&mut raw_value)?;
1267 Ok((key, value))
1268 };
1269
1270 Self {
1271 prefix,
1272 child_info: child_info.clone(),
1273 previous_key,
1274 drain: false,
1275 fetch_previous_key: true,
1276 closure,
1277 }
1278 }
1279}
1280
1281impl<T> Iterator for ChildTriePrefixIterator<T> {
1282 type Item = T;
1283
1284 fn next(&mut self) -> Option<Self::Item> {
1285 loop {
1286 let maybe_next = if self.fetch_previous_key {
1287 self.fetch_previous_key = false;
1288 Some(self.previous_key.clone())
1289 } else {
1290 subsoil::io::default_child_storage::next_key(
1291 self.child_info.storage_key(),
1292 &self.previous_key,
1293 )
1294 .filter(|n| n.starts_with(&self.prefix))
1295 };
1296 break match maybe_next {
1297 Some(next) => {
1298 self.previous_key = next;
1299 let raw_value = match child::get_raw(&self.child_info, &self.previous_key) {
1300 Some(raw_value) => raw_value,
1301 None => {
1302 log::error!(
1303 "next_key returned a key with no value at {:?}",
1304 self.previous_key,
1305 );
1306 continue;
1307 },
1308 };
1309 if self.drain {
1310 child::kill(&self.child_info, &self.previous_key)
1311 }
1312 let raw_key_without_prefix = &self.previous_key[self.prefix.len()..];
1313 let item = match (self.closure)(raw_key_without_prefix, &raw_value[..]) {
1314 Ok(item) => item,
1315 Err(e) => {
1316 log::error!(
1317 "(key, value) failed to decode at {:?}: {:?}",
1318 self.previous_key,
1319 e,
1320 );
1321 continue;
1322 },
1323 };
1324
1325 Some(item)
1326 },
1327 None => None,
1328 };
1329 }
1330 }
1331}
1332
1333pub trait StoragePrefixedContainer {
1335 fn pallet_prefix() -> &'static [u8];
1337
1338 fn storage_prefix() -> &'static [u8];
1340
1341 fn final_prefix() -> [u8; 32] {
1343 crate::storage::storage_prefix(Self::pallet_prefix(), Self::storage_prefix())
1344 }
1345}
1346
1347pub trait StoragePrefixedMap<Value: FullCodec> {
1354 fn pallet_prefix() -> &'static [u8]; fn storage_prefix() -> &'static [u8];
1359
1360 fn final_prefix() -> [u8; 32] {
1362 crate::storage::storage_prefix(Self::pallet_prefix(), Self::storage_prefix())
1363 }
1364
1365 #[deprecated = "Use `clear` instead"]
1377 fn remove_all(limit: Option<u32>) -> subsoil::io::KillStorageResult {
1378 unhashed::clear_prefix(&Self::final_prefix(), limit, None).into()
1379 }
1380
1381 fn clear(limit: u32, maybe_cursor: Option<&[u8]>) -> subsoil::io::MultiRemovalResults {
1405 unhashed::clear_prefix(&Self::final_prefix(), Some(limit), maybe_cursor)
1406 }
1407
1408 fn iter_values() -> PrefixIterator<Value> {
1412 let prefix = Self::final_prefix();
1413 PrefixIterator {
1414 prefix: prefix.to_vec(),
1415 previous_key: prefix.to_vec(),
1416 drain: false,
1417 closure: |_raw_key, mut raw_value| Value::decode(&mut raw_value),
1418 phantom: Default::default(),
1419 }
1420 }
1421
1422 fn translate_values<OldValue: Decode, F: FnMut(OldValue) -> Option<Value>>(mut f: F) {
1436 let prefix = Self::final_prefix();
1437 let mut previous_key = prefix.clone().to_vec();
1438 while let Some(next) =
1439 subsoil::io::storage::next_key(&previous_key).filter(|n| n.starts_with(&prefix))
1440 {
1441 previous_key = next;
1442 let maybe_value = unhashed::get::<OldValue>(&previous_key);
1443 match maybe_value {
1444 Some(value) => match f(value) {
1445 Some(new) => unhashed::put::<Value>(&previous_key, &new),
1446 None => unhashed::kill(&previous_key),
1447 },
1448 None => {
1449 log::error!("old key failed to decode at {:?}", previous_key);
1450 continue;
1451 },
1452 }
1453 }
1454 }
1455}
1456
1457pub trait StorageAppend<Item: Encode>: private::Sealed {}
1461
1462pub trait StorageDecodeLength: private::Sealed + codec::DecodeLength {
1467 fn decode_len(key: &[u8]) -> Option<usize> {
1474 let mut data = [0u8; 5];
1476 let len = subsoil::io::storage::read(key, &mut data, 0)?;
1477 let len = data.len().min(len as usize);
1478 <Self as codec::DecodeLength>::len(&data[..len]).ok()
1479 }
1480}
1481
1482pub trait StorageDecodeNonDedupLength: private::Sealed + codec::DecodeLength {
1491 fn decode_non_dedup_len(key: &[u8]) -> Option<usize> {
1498 let mut data = [0u8; 5];
1499 let len = subsoil::io::storage::read(key, &mut data, 0)?;
1500 let len = data.len().min(len as usize);
1501 <Self as codec::DecodeLength>::len(&data[..len]).ok()
1502 }
1503}
1504
1505mod private {
1508 use super::*;
1509 use bounded_vec::BoundedVec;
1510 use weak_bounded_vec::WeakBoundedVec;
1511
1512 pub trait Sealed {}
1513
1514 impl<T: Encode> Sealed for Vec<T> {}
1515 impl Sealed for Digest {}
1516 impl<T, S> Sealed for BoundedVec<T, S> {}
1517 impl<T, S> Sealed for WeakBoundedVec<T, S> {}
1518 impl<K, V, S> Sealed for bounded_btree_map::BoundedBTreeMap<K, V, S> {}
1519 impl<T, S> Sealed for bounded_btree_set::BoundedBTreeSet<T, S> {}
1520 impl<T: Encode> Sealed for BTreeSet<T> {}
1521 impl<'a, T: EncodeLike<U>, U: Encode> Sealed for codec::Ref<'a, T, U> {}
1522
1523 macro_rules! impl_sealed_for_tuple {
1524 ($($elem:ident),+) => {
1525 paste::paste! {
1526 impl<$($elem: Encode,)+> Sealed for ($($elem,)+) {}
1527 impl<$($elem: Encode,)+> Sealed for &($($elem,)+) {}
1528 }
1529 };
1530 }
1531
1532 impl_sealed_for_tuple!(A);
1533 impl_sealed_for_tuple!(A, B);
1534 impl_sealed_for_tuple!(A, B, C);
1535 impl_sealed_for_tuple!(A, B, C, D);
1536 impl_sealed_for_tuple!(A, B, C, D, E);
1537 impl_sealed_for_tuple!(A, B, C, D, E, F);
1538 impl_sealed_for_tuple!(A, B, C, D, E, F, G);
1539 impl_sealed_for_tuple!(A, B, C, D, E, F, G, H);
1540 impl_sealed_for_tuple!(A, B, C, D, E, F, G, H, I);
1541 impl_sealed_for_tuple!(A, B, C, D, E, F, G, H, I, J);
1542 impl_sealed_for_tuple!(A, B, C, D, E, F, G, H, I, J, K);
1543 impl_sealed_for_tuple!(A, B, C, D, E, F, G, H, I, J, K, L);
1544 impl_sealed_for_tuple!(A, B, C, D, E, F, G, H, I, J, K, L, M);
1545 impl_sealed_for_tuple!(A, B, C, D, E, F, G, H, I, J, K, L, M, O);
1546 impl_sealed_for_tuple!(A, B, C, D, E, F, G, H, I, J, K, L, M, O, P);
1547 impl_sealed_for_tuple!(A, B, C, D, E, F, G, H, I, J, K, L, M, O, P, Q);
1548 impl_sealed_for_tuple!(A, B, C, D, E, F, G, H, I, J, K, L, M, O, P, Q, R);
1549}
1550
1551impl<T: Encode> StorageAppend<T> for Vec<T> {}
1552impl<T: Encode> StorageDecodeLength for Vec<T> {}
1553
1554impl<T: Encode> StorageAppend<T> for BTreeSet<T> {}
1555impl<T: Encode> StorageDecodeNonDedupLength for BTreeSet<T> {}
1556
1557impl<T: StorageDecodeLength> StorageDecodeNonDedupLength for T {
1559 fn decode_non_dedup_len(key: &[u8]) -> Option<usize> {
1560 T::decode_len(key)
1561 }
1562}
1563
1564impl StorageAppend<DigestItem> for Digest {}
1568
1569pub trait StorageTryAppend<Item>: StorageDecodeLength + private::Sealed {
1574 fn bound() -> usize;
1575}
1576
1577pub trait TryAppendValue<T: StorageTryAppend<I>, I: Encode> {
1579 fn try_append<LikeI: EncodeLike<I>>(item: LikeI) -> Result<(), ()>;
1583}
1584
1585impl<T, I, StorageValueT> TryAppendValue<T, I> for StorageValueT
1586where
1587 I: Encode,
1588 T: FullCodec + StorageTryAppend<I>,
1589 StorageValueT: generator::StorageValue<T>,
1590{
1591 fn try_append<LikeI: EncodeLike<I>>(item: LikeI) -> Result<(), ()> {
1592 let bound = T::bound();
1593 let current = Self::decode_len().unwrap_or_default();
1594 if current < bound {
1595 let key = Self::storage_value_final_key();
1598 subsoil::io::storage::append(&key, item.encode());
1599 Ok(())
1600 } else {
1601 Err(())
1602 }
1603 }
1604}
1605
1606pub trait TryAppendMap<K: Encode, T: StorageTryAppend<I>, I: Encode> {
1608 fn try_append<LikeK: EncodeLike<K> + Clone, LikeI: EncodeLike<I>>(
1612 key: LikeK,
1613 item: LikeI,
1614 ) -> Result<(), ()>;
1615}
1616
1617impl<K, T, I, StorageMapT> TryAppendMap<K, T, I> for StorageMapT
1618where
1619 K: FullCodec,
1620 T: FullCodec + StorageTryAppend<I>,
1621 I: Encode,
1622 StorageMapT: generator::StorageMap<K, T>,
1623{
1624 fn try_append<LikeK: EncodeLike<K> + Clone, LikeI: EncodeLike<I>>(
1625 key: LikeK,
1626 item: LikeI,
1627 ) -> Result<(), ()> {
1628 let bound = T::bound();
1629 let current = Self::decode_len(key.clone()).unwrap_or_default();
1630 if current < bound {
1631 let key = Self::storage_map_final_key(key);
1632 subsoil::io::storage::append(&key, item.encode());
1633 Ok(())
1634 } else {
1635 Err(())
1636 }
1637 }
1638}
1639
1640pub trait TryAppendDoubleMap<K1: Encode, K2: Encode, T: StorageTryAppend<I>, I: Encode> {
1642 fn try_append<
1646 LikeK1: EncodeLike<K1> + Clone,
1647 LikeK2: EncodeLike<K2> + Clone,
1648 LikeI: EncodeLike<I>,
1649 >(
1650 key1: LikeK1,
1651 key2: LikeK2,
1652 item: LikeI,
1653 ) -> Result<(), ()>;
1654}
1655
1656impl<K1, K2, T, I, StorageDoubleMapT> TryAppendDoubleMap<K1, K2, T, I> for StorageDoubleMapT
1657where
1658 K1: FullCodec,
1659 K2: FullCodec,
1660 T: FullCodec + StorageTryAppend<I>,
1661 I: Encode,
1662 StorageDoubleMapT: generator::StorageDoubleMap<K1, K2, T>,
1663{
1664 fn try_append<
1665 LikeK1: EncodeLike<K1> + Clone,
1666 LikeK2: EncodeLike<K2> + Clone,
1667 LikeI: EncodeLike<I>,
1668 >(
1669 key1: LikeK1,
1670 key2: LikeK2,
1671 item: LikeI,
1672 ) -> Result<(), ()> {
1673 let bound = T::bound();
1674 let current = Self::decode_len(key1.clone(), key2.clone()).unwrap_or_default();
1675 if current < bound {
1676 let double_map_key = Self::storage_double_map_final_key(key1, key2);
1677 subsoil::io::storage::append(&double_map_key, item.encode());
1678 Ok(())
1679 } else {
1680 Err(())
1681 }
1682 }
1683}
1684
1685pub trait TryAppendNMap<K: KeyGenerator, T: StorageTryAppend<I>, I: Encode> {
1687 fn try_append<
1691 LikeK: EncodeLikeTuple<K::KArg> + TupleToEncodedIter + Clone,
1692 LikeI: EncodeLike<I>,
1693 >(
1694 key: LikeK,
1695 item: LikeI,
1696 ) -> Result<(), ()>;
1697}
1698
1699impl<K, T, I, StorageNMapT> TryAppendNMap<K, T, I> for StorageNMapT
1700where
1701 K: KeyGenerator,
1702 T: FullCodec + StorageTryAppend<I>,
1703 I: Encode,
1704 StorageNMapT: generator::StorageNMap<K, T>,
1705{
1706 fn try_append<
1707 LikeK: EncodeLikeTuple<K::KArg> + TupleToEncodedIter + Clone,
1708 LikeI: EncodeLike<I>,
1709 >(
1710 key: LikeK,
1711 item: LikeI,
1712 ) -> Result<(), ()> {
1713 let bound = T::bound();
1714 let current = Self::decode_len(key.clone()).unwrap_or_default();
1715 if current < bound {
1716 let key = Self::storage_n_map_final_key::<K, _>(key);
1717 subsoil::io::storage::append(&key, item.encode());
1718 Ok(())
1719 } else {
1720 Err(())
1721 }
1722 }
1723}
1724
1725pub fn storage_prefix(pallet_name: &[u8], storage_name: &[u8]) -> [u8; 32] {
1729 let pallet_hash = subsoil::io::hashing::twox_128(pallet_name);
1730 let storage_hash = subsoil::io::hashing::twox_128(storage_name);
1731
1732 let mut final_key = [0u8; 32];
1733 final_key[..16].copy_from_slice(&pallet_hash);
1734 final_key[16..].copy_from_slice(&storage_hash);
1735
1736 final_key
1737}
1738
1739#[cfg(test)]
1740mod test {
1741 use super::*;
1742 use crate::{assert_ok, hash::Identity, pallet_prelude::NMapKey, Twox128};
1743 use bounded_vec::BoundedVec;
1744 use generator::StorageValue as _;
1745 use subsoil::io::TestExternalities;
1746 use subsoil_crypto_hashing::twox_128;
1747 use topsoil_core::traits::ConstU32;
1748 use weak_bounded_vec::WeakBoundedVec;
1749
1750 #[test]
1751 fn prefixed_map_works() {
1752 TestExternalities::default().execute_with(|| {
1753 struct MyStorage;
1754 impl StoragePrefixedMap<u64> for MyStorage {
1755 fn pallet_prefix() -> &'static [u8] {
1756 b"MyModule"
1757 }
1758
1759 fn storage_prefix() -> &'static [u8] {
1760 b"MyStorage"
1761 }
1762 }
1763
1764 let key_before = {
1765 let mut k = MyStorage::final_prefix();
1766 let last = k.iter_mut().last().unwrap();
1767 *last = last.checked_sub(1).unwrap();
1768 k
1769 };
1770 let key_after = {
1771 let mut k = MyStorage::final_prefix();
1772 let last = k.iter_mut().last().unwrap();
1773 *last = last.checked_add(1).unwrap();
1774 k
1775 };
1776
1777 unhashed::put(&key_before[..], &32u64);
1778 unhashed::put(&key_after[..], &33u64);
1779
1780 let k = [twox_128(b"MyModule"), twox_128(b"MyStorage")].concat();
1781 assert_eq!(MyStorage::final_prefix().to_vec(), k);
1782
1783 assert!(MyStorage::iter_values().collect::<Vec<_>>().is_empty());
1785
1786 unhashed::put(&[&k[..], &vec![1][..]].concat(), &1u64);
1787 unhashed::put(&[&k[..], &vec![1, 1][..]].concat(), &2u64);
1788 unhashed::put(&[&k[..], &vec![8][..]].concat(), &3u64);
1789 unhashed::put(&[&k[..], &vec![10][..]].concat(), &4u64);
1790
1791 assert_eq!(MyStorage::iter_values().collect::<Vec<_>>(), vec![1, 2, 3, 4]);
1792
1793 let _ = MyStorage::clear(u32::max_value(), None);
1795 assert!(MyStorage::iter_values().collect::<Vec<_>>().is_empty());
1796
1797 unhashed::put(&[&k[..], &vec![1][..]].concat(), &1u32);
1799 unhashed::put(&[&k[..], &vec![8][..]].concat(), &2u32);
1800
1801 assert!(MyStorage::iter_values().collect::<Vec<_>>().is_empty());
1802 MyStorage::translate_values(|v: u32| Some(v as u64));
1803 assert_eq!(MyStorage::iter_values().collect::<Vec<_>>(), vec![1, 2]);
1804 let _ = MyStorage::clear(u32::max_value(), None);
1805
1806 unhashed::put(&[&k[..], &vec![1][..]].concat(), &1u128);
1808 unhashed::put(&[&k[..], &vec![1, 1][..]].concat(), &2u64);
1809 unhashed::put(&[&k[..], &vec![8][..]].concat(), &3u128);
1810 unhashed::put(&[&k[..], &vec![10][..]].concat(), &4u32);
1811
1812 assert_eq!(MyStorage::iter_values().collect::<Vec<_>>(), vec![1, 2, 3]);
1814 MyStorage::translate_values(|v: u128| Some(v as u64));
1815 assert_eq!(MyStorage::iter_values().collect::<Vec<_>>(), vec![1, 2, 3]);
1816 let _ = MyStorage::clear(u32::max_value(), None);
1817
1818 assert_eq!(unhashed::get(&key_before[..]), Some(32u64));
1820 assert_eq!(unhashed::get(&key_after[..]), Some(33u64));
1821 });
1822 }
1823
1824 #[test]
1826 fn digest_storage_append_works_as_expected() {
1827 TestExternalities::default().execute_with(|| {
1828 struct Storage;
1829 impl generator::StorageValue<Digest> for Storage {
1830 type Query = Digest;
1831
1832 fn pallet_prefix() -> &'static [u8] {
1833 b"MyModule"
1834 }
1835
1836 fn storage_prefix() -> &'static [u8] {
1837 b"Storage"
1838 }
1839
1840 fn from_optional_value_to_query(v: Option<Digest>) -> Self::Query {
1841 v.unwrap()
1842 }
1843
1844 fn from_query_to_optional_value(v: Self::Query) -> Option<Digest> {
1845 Some(v)
1846 }
1847
1848 fn storage_value_final_key() -> [u8; 32] {
1849 storage_prefix(Self::pallet_prefix(), Self::storage_prefix())
1850 }
1851 }
1852
1853 Storage::append(DigestItem::Other(Vec::new()));
1854
1855 let value = unhashed::get_raw(&Storage::storage_value_final_key()).unwrap();
1856
1857 let expected = Digest { logs: vec![DigestItem::Other(Vec::new())] };
1858 assert_eq!(Digest::decode(&mut &value[..]).unwrap(), expected);
1859 });
1860 }
1861
1862 #[test]
1863 fn key_prefix_iterator_works() {
1864 TestExternalities::default().execute_with(|| {
1865 use crate::{hash::Twox64Concat, storage::generator::StorageMap};
1866 struct MyStorageMap;
1867 impl StorageMap<u64, u64> for MyStorageMap {
1868 type Query = u64;
1869 type Hasher = Twox64Concat;
1870
1871 fn pallet_prefix() -> &'static [u8] {
1872 b"MyModule"
1873 }
1874
1875 fn storage_prefix() -> &'static [u8] {
1876 b"MyStorageMap"
1877 }
1878
1879 fn prefix_hash() -> [u8; 32] {
1880 storage_prefix(Self::pallet_prefix(), Self::storage_prefix())
1881 }
1882
1883 fn from_optional_value_to_query(v: Option<u64>) -> Self::Query {
1884 v.unwrap_or_default()
1885 }
1886
1887 fn from_query_to_optional_value(v: Self::Query) -> Option<u64> {
1888 Some(v)
1889 }
1890 }
1891
1892 let k = [twox_128(b"MyModule"), twox_128(b"MyStorageMap")].concat();
1893 assert_eq!(MyStorageMap::prefix_hash().to_vec(), k);
1894
1895 assert!(MyStorageMap::iter_keys().collect::<Vec<_>>().is_empty());
1897
1898 MyStorageMap::insert(1, 10);
1899 MyStorageMap::insert(2, 20);
1900 MyStorageMap::insert(3, 30);
1901 MyStorageMap::insert(4, 40);
1902
1903 let mut keys = MyStorageMap::iter_keys().collect::<Vec<_>>();
1905 keys.sort();
1906 assert_eq!(keys, vec![1, 2, 3, 4]);
1907
1908 let mut drained_keys = MyStorageMap::iter_keys().drain().collect::<Vec<_>>();
1910 drained_keys.sort();
1911 assert_eq!(drained_keys, vec![1, 2, 3, 4]);
1912
1913 assert!(MyStorageMap::iter_keys().collect::<Vec<_>>().is_empty());
1915 });
1916 }
1917
1918 #[test]
1919 fn prefix_iterator_pagination_works() {
1920 TestExternalities::default().execute_with(|| {
1921 use crate::{hash::Identity, storage::generator::map::StorageMap};
1922 #[crate::storage_alias]
1923 type MyStorageMap = StorageMap<MyModule, Identity, u64, u64>;
1924
1925 MyStorageMap::insert(1, 10);
1926 MyStorageMap::insert(2, 20);
1927 MyStorageMap::insert(3, 30);
1928 MyStorageMap::insert(4, 40);
1929 MyStorageMap::insert(5, 50);
1930 MyStorageMap::insert(6, 60);
1931 MyStorageMap::insert(7, 70);
1932 MyStorageMap::insert(8, 80);
1933 MyStorageMap::insert(9, 90);
1934 MyStorageMap::insert(10, 100);
1935
1936 let op = |(_, v)| v / 10;
1937 let mut final_vec = vec![];
1938 let mut iter = MyStorageMap::iter();
1939
1940 let elem = iter.next().unwrap();
1941 assert_eq!(elem, (1, 10));
1942 final_vec.push(op(elem));
1943
1944 let elem = iter.next().unwrap();
1945 assert_eq!(elem, (2, 20));
1946 final_vec.push(op(elem));
1947
1948 let stored_key = iter.last_raw_key().to_owned();
1949 assert_eq!(stored_key, MyStorageMap::storage_map_final_key(2));
1950
1951 let mut iter = MyStorageMap::iter_from(stored_key.clone());
1952
1953 final_vec.push(op(iter.next().unwrap()));
1954 final_vec.push(op(iter.next().unwrap()));
1955 final_vec.push(op(iter.next().unwrap()));
1956
1957 assert_eq!(final_vec, vec![1, 2, 3, 4, 5]);
1958
1959 let mut iter = PrefixIterator::<_>::new(
1960 iter.prefix().to_vec(),
1961 stored_key,
1962 |mut raw_key_without_prefix, mut raw_value| {
1963 let key = u64::decode(&mut raw_key_without_prefix)?;
1964 Ok((key, u64::decode(&mut raw_value)?))
1965 },
1966 );
1967 let previous_key = MyStorageMap::storage_map_final_key(5);
1968 iter.set_last_raw_key(previous_key);
1969
1970 let remaining = iter.map(op).collect::<Vec<_>>();
1971 assert_eq!(remaining.len(), 5);
1972 assert_eq!(remaining, vec![6, 7, 8, 9, 10]);
1973
1974 final_vec.extend_from_slice(&remaining);
1975
1976 assert_eq!(final_vec, vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
1977 });
1978 }
1979
1980 #[test]
1981 fn child_trie_prefixed_map_works() {
1982 TestExternalities::default().execute_with(|| {
1983 let child_info_a = child::ChildInfo::new_default(b"a");
1984 child::put(&child_info_a, &[1, 2, 3], &8u16);
1985 child::put(&child_info_a, &[2], &8u16);
1986 child::put(&child_info_a, &[2, 1, 3], &8u8);
1987 child::put(&child_info_a, &[2, 2, 3], &8u16);
1988 child::put(&child_info_a, &[3], &8u16);
1989
1990 assert_eq!(
1991 ChildTriePrefixIterator::with_prefix(&child_info_a, &[2])
1992 .collect::<Vec<(Vec<u8>, u16)>>(),
1993 vec![(vec![], 8), (vec![2, 3], 8),],
1994 );
1995
1996 assert_eq!(
1997 ChildTriePrefixIterator::with_prefix(&child_info_a, &[2])
1998 .drain()
1999 .collect::<Vec<(Vec<u8>, u16)>>(),
2000 vec![(vec![], 8), (vec![2, 3], 8),],
2001 );
2002
2003 assert_eq!(
2005 ChildTriePrefixIterator::with_prefix(&child_info_a, &[])
2006 .collect::<Vec<(Vec<u8>, u8)>>(),
2007 vec![(vec![1, 2, 3], 8), (vec![3], 8),],
2008 );
2009
2010 child::put(&child_info_a, &[1, 2, 3], &8u16);
2011 child::put(&child_info_a, &[2], &8u16);
2012 child::put(&child_info_a, &[2, 1, 3], &8u8);
2013 child::put(&child_info_a, &[2, 2, 3], &8u16);
2014 child::put(&child_info_a, &[3], &8u16);
2015
2016 assert_eq!(
2017 ChildTriePrefixIterator::with_prefix_over_key::<Identity>(&child_info_a, &[2])
2018 .collect::<Vec<(u16, u16)>>(),
2019 vec![(u16::decode(&mut &[2, 3][..]).unwrap(), 8),],
2020 );
2021
2022 assert_eq!(
2023 ChildTriePrefixIterator::with_prefix_over_key::<Identity>(&child_info_a, &[2])
2024 .drain()
2025 .collect::<Vec<(u16, u16)>>(),
2026 vec![(u16::decode(&mut &[2, 3][..]).unwrap(), 8),],
2027 );
2028
2029 assert_eq!(
2031 ChildTriePrefixIterator::with_prefix(&child_info_a, &[])
2032 .collect::<Vec<(Vec<u8>, u8)>>(),
2033 vec![(vec![1, 2, 3], 8), (vec![3], 8),],
2034 );
2035 });
2036 }
2037
2038 #[crate::storage_alias]
2039 type Foo = StorageValue<Prefix, WeakBoundedVec<u32, ConstU32<7>>>;
2040 #[crate::storage_alias]
2041 type FooMap = StorageMap<Prefix, Twox128, u32, BoundedVec<u32, ConstU32<7>>>;
2042 #[crate::storage_alias]
2043 type FooDoubleMap =
2044 StorageDoubleMap<Prefix, Twox128, u32, Twox128, u32, BoundedVec<u32, ConstU32<7>>>;
2045 #[crate::storage_alias]
2046 type FooTripleMap = StorageNMap<
2047 Prefix,
2048 (NMapKey<Twox128, u32>, NMapKey<Twox128, u32>, NMapKey<Twox128, u32>),
2049 u64,
2050 >;
2051 #[crate::storage_alias]
2052 type FooQuadMap = StorageNMap<
2053 Prefix,
2054 (
2055 NMapKey<Twox128, u32>,
2056 NMapKey<Twox128, u32>,
2057 NMapKey<Twox128, u32>,
2058 NMapKey<Twox128, u32>,
2059 ),
2060 BoundedVec<u32, ConstU32<7>>,
2061 >;
2062
2063 #[test]
2064 fn contains_prefix_works() {
2065 TestExternalities::default().execute_with(|| {
2066 assert!(FooDoubleMap::iter_prefix_values(1).next().is_none());
2068 assert_eq!(FooDoubleMap::contains_prefix(1), false);
2069
2070 assert_ok!(FooDoubleMap::try_append(1, 1, 4));
2071 assert_ok!(FooDoubleMap::try_append(2, 1, 4));
2072 assert!(FooDoubleMap::iter_prefix_values(1).next().is_some());
2073 assert!(FooDoubleMap::contains_prefix(1));
2074 FooDoubleMap::remove(1, 1);
2075 assert_eq!(FooDoubleMap::contains_prefix(1), false);
2076
2077 assert!(FooTripleMap::iter_prefix_values((1,)).next().is_none());
2079 assert_eq!(FooTripleMap::contains_prefix((1,)), false);
2080
2081 FooTripleMap::insert((1, 1, 1), 4);
2082 FooTripleMap::insert((2, 1, 1), 4);
2083 assert!(FooTripleMap::iter_prefix_values((1,)).next().is_some());
2084 assert!(FooTripleMap::contains_prefix((1,)));
2085 FooTripleMap::remove((1, 1, 1));
2086 assert_eq!(FooTripleMap::contains_prefix((1,)), false);
2087 });
2088 }
2089
2090 #[test]
2091 fn try_append_works() {
2092 TestExternalities::default().execute_with(|| {
2093 let bounded: WeakBoundedVec<u32, ConstU32<7>> = vec![1, 2, 3].try_into().unwrap();
2094 Foo::put(bounded);
2095 assert_ok!(Foo::try_append(4));
2096 assert_ok!(Foo::try_append(5));
2097 assert_ok!(Foo::try_append(6));
2098 assert_ok!(Foo::try_append(7));
2099 assert_eq!(Foo::decode_len().unwrap(), 7);
2100 assert!(Foo::try_append(8).is_err());
2101 });
2102
2103 TestExternalities::default().execute_with(|| {
2104 let bounded: BoundedVec<u32, ConstU32<7>> = vec![1, 2, 3].try_into().unwrap();
2105 FooMap::insert(1, bounded);
2106
2107 assert_ok!(FooMap::try_append(1, 4));
2108 assert_ok!(FooMap::try_append(1, 5));
2109 assert_ok!(FooMap::try_append(1, 6));
2110 assert_ok!(FooMap::try_append(1, 7));
2111 assert_eq!(FooMap::decode_len(1).unwrap(), 7);
2112 assert!(FooMap::try_append(1, 8).is_err());
2113
2114 assert!(FooMap::get(2).is_none());
2116 assert_ok!(FooMap::try_append(2, 4));
2117 assert_eq!(
2118 FooMap::get(2).unwrap(),
2119 BoundedVec::<u32, ConstU32<7>>::try_from(vec![4]).unwrap(),
2120 );
2121 assert_ok!(FooMap::try_append(2, 5));
2122 assert_eq!(
2123 FooMap::get(2).unwrap(),
2124 BoundedVec::<u32, ConstU32<7>>::try_from(vec![4, 5]).unwrap(),
2125 );
2126 });
2127
2128 TestExternalities::default().execute_with(|| {
2129 let bounded: BoundedVec<u32, ConstU32<7>> = vec![1, 2, 3].try_into().unwrap();
2130 FooDoubleMap::insert(1, 1, bounded);
2131
2132 assert_ok!(FooDoubleMap::try_append(1, 1, 4));
2133 assert_ok!(FooDoubleMap::try_append(1, 1, 5));
2134 assert_ok!(FooDoubleMap::try_append(1, 1, 6));
2135 assert_ok!(FooDoubleMap::try_append(1, 1, 7));
2136 assert_eq!(FooDoubleMap::decode_len(1, 1).unwrap(), 7);
2137 assert!(FooDoubleMap::try_append(1, 1, 8).is_err());
2138
2139 assert!(FooDoubleMap::get(2, 1).is_none());
2141 assert_ok!(FooDoubleMap::try_append(2, 1, 4));
2142 assert_eq!(
2143 FooDoubleMap::get(2, 1).unwrap(),
2144 BoundedVec::<u32, ConstU32<7>>::try_from(vec![4]).unwrap(),
2145 );
2146 assert_ok!(FooDoubleMap::try_append(2, 1, 5));
2147 assert_eq!(
2148 FooDoubleMap::get(2, 1).unwrap(),
2149 BoundedVec::<u32, ConstU32<7>>::try_from(vec![4, 5]).unwrap(),
2150 );
2151 });
2152
2153 TestExternalities::default().execute_with(|| {
2154 let bounded: BoundedVec<u32, ConstU32<7>> = vec![1, 2, 3].try_into().unwrap();
2155 FooQuadMap::insert((1, 1, 1, 1), bounded);
2156
2157 assert_ok!(FooQuadMap::try_append((1, 1, 1, 1), 4));
2158 assert_ok!(FooQuadMap::try_append((1, 1, 1, 1), 5));
2159 assert_ok!(FooQuadMap::try_append((1, 1, 1, 1), 6));
2160 assert_ok!(FooQuadMap::try_append((1, 1, 1, 1), 7));
2161 assert_eq!(FooQuadMap::decode_len((1, 1, 1, 1)).unwrap(), 7);
2162 assert!(FooQuadMap::try_append((1, 1, 1, 1), 8).is_err());
2163
2164 assert!(FooQuadMap::get((2, 1, 1, 1)).is_none());
2166 assert_ok!(FooQuadMap::try_append((2, 1, 1, 1), 4));
2167 assert_eq!(
2168 FooQuadMap::get((2, 1, 1, 1)).unwrap(),
2169 BoundedVec::<u32, ConstU32<7>>::try_from(vec![4]).unwrap(),
2170 );
2171 assert_ok!(FooQuadMap::try_append((2, 1, 1, 1), 5));
2172 assert_eq!(
2173 FooQuadMap::get((2, 1, 1, 1)).unwrap(),
2174 BoundedVec::<u32, ConstU32<7>>::try_from(vec![4, 5]).unwrap(),
2175 );
2176 });
2177 }
2178
2179 #[crate::storage_alias]
2180 type FooSet = StorageValue<Prefix, BTreeSet<u32>>;
2181
2182 #[test]
2183 fn btree_set_append_and_decode_len_works() {
2184 TestExternalities::default().execute_with(|| {
2185 let btree = BTreeSet::from([1, 2, 3]);
2186 FooSet::put(btree);
2187
2188 FooSet::append(4);
2189 FooSet::append(5);
2190 FooSet::append(6);
2191 FooSet::append(7);
2192
2193 assert_eq!(FooSet::decode_non_dedup_len().unwrap(), 7);
2194 });
2195 }
2196
2197 #[docify::export]
2198 #[test]
2199 fn btree_set_decode_non_dedup_len() {
2200 #[crate::storage_alias]
2201 type Store = StorageValue<Prefix, BTreeSet<u32>>;
2202
2203 TestExternalities::default().execute_with(|| {
2204 Store::append(4);
2205 Store::append(4); Store::append(5);
2207
2208 let length_with_dup_items = 3;
2209
2210 assert_eq!(Store::decode_non_dedup_len().unwrap(), length_with_dup_items);
2211 });
2212 }
2213}