surrealdb/key/database/
ts.rs

1//! Stores database timestamps
2use crate::key::error::KeyCategory;
3use crate::key::key_req::KeyRequirements;
4use derive::Key;
5use serde::{Deserialize, Serialize};
6
7// Ts stands for Database Timestamps that corresponds to Versionstamps.
8// Each Ts key is suffixed by a timestamp.
9// The value is the versionstamp that corresponds to the timestamp.
10#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Serialize, Deserialize, Key)]
11pub struct Ts<'a> {
12	__: u8,
13	_a: u8,
14	pub ns: &'a str,
15	_b: u8,
16	pub db: &'a str,
17	_c: u8,
18	_d: u8,
19	_e: u8,
20	pub ts: u64,
21}
22
23pub fn new<'a>(ns: &'a str, db: &'a str, ts: u64) -> Ts<'a> {
24	Ts::new(ns, db, ts)
25}
26
27/// Returns the prefix for the whole database timestamps
28pub fn prefix(ns: &str, db: &str) -> Vec<u8> {
29	let mut k = crate::key::database::all::new(ns, db).encode().unwrap();
30	k.extend_from_slice(&[b'!', b't', b's']);
31	k
32}
33
34/// Returns the prefix for the whole database timestamps
35pub fn suffix(ns: &str, db: &str) -> Vec<u8> {
36	let mut k = prefix(ns, db);
37	k.extend_from_slice(&[0xff]);
38	k
39}
40
41impl KeyRequirements for Ts<'_> {
42	fn key_category(&self) -> KeyCategory {
43		KeyCategory::DatabaseTimestamp
44	}
45}
46
47impl<'a> Ts<'a> {
48	pub fn new(ns: &'a str, db: &'a str, ts: u64) -> Self {
49		Ts {
50			__: b'/',
51			_a: b'*',
52			ns,
53			_b: b'*',
54			db,
55			_c: b'!',
56			_d: b't',
57			_e: b's',
58			ts,
59		}
60	}
61}
62
63#[cfg(test)]
64mod tests {
65	#[test]
66	fn key() {
67		use super::*;
68		#[rustfmt::skip]
69		let val = Ts::new(
70			"test",
71			"test",
72			123,
73		);
74		let enc = Ts::encode(&val).unwrap();
75		let dec = Ts::decode(&enc).unwrap();
76		assert_eq!(val, dec);
77	}
78}