surrealdb_core/kvs/
util.rs

1use std::{ops::Range, sync::Arc};
2
3use revision::Revisioned;
4
5use crate::err::Error;
6
7use super::KeyEncode;
8
9/// Advances a key to the next value,
10/// can be used to skip over a certain key.
11pub fn advance_key(key: &mut [u8]) {
12	for b in key.iter_mut().rev() {
13		*b = b.wrapping_add(1);
14		if *b != 0 {
15			break;
16		}
17	}
18}
19
20pub fn to_prefix_range<K: KeyEncode>(key: K) -> Result<Range<Vec<u8>>, Error> {
21	let start = key.encode_owned()?;
22	let mut end = start.clone();
23	end.push(0xff);
24	Ok(Range {
25		start,
26		end,
27	})
28}
29
30/// Takes an iterator of byte slices and deserializes the byte slices to the expected type,
31/// returning an error if any of the values fail to serialize.
32pub fn deserialize_cache<'a, I, T>(iter: I) -> Result<Arc<[T]>, Error>
33where
34	T: Revisioned,
35	I: Iterator<Item = &'a [u8]>,
36{
37	let mut buf = Vec::new();
38	for mut slice in iter {
39		buf.push(Revisioned::deserialize_revisioned(&mut slice)?)
40	}
41	Ok(Arc::from(buf))
42}