Skip to main content

tuwunel_database/map/
put.rs

1//! Serialize and Insert a Key+Value into the database.
2//!
3//! Overloads are provided for the user to choose the most efficient
4//! serialization. When no serialization is required for both key and
5//! value simply use insert() (see insert.rs).
6
7use std::{convert::AsRef, fmt::Debug, io::Write};
8
9use serde::Serialize;
10use tuwunel_core::{arrayvec::ArrayVec, implement};
11
12use crate::{
13	keyval::{KeyBuf, ValBuf},
14	ser,
15};
16
17/// Insert Key/Value
18///
19/// - Key is serialized
20/// - Val is serialized
21#[implement(super::Map)]
22#[inline]
23pub fn put<K, V>(&self, key: K, val: V)
24where
25	K: Serialize + Debug,
26	V: Serialize,
27{
28	let mut key_buf = KeyBuf::new();
29	let mut val_buf = ValBuf::new();
30	self.bput(key, val, (&mut key_buf, &mut val_buf));
31}
32
33/// Insert Key/Value
34///
35/// - Key is serialized
36/// - Val is raw
37#[implement(super::Map)]
38#[inline]
39pub fn put_raw<K, V>(&self, key: K, val: V)
40where
41	K: Serialize + Debug,
42	V: AsRef<[u8]>,
43{
44	let mut key_buf = KeyBuf::new();
45	self.bput_raw(key, val, &mut key_buf);
46}
47
48/// Insert Key/Value
49///
50/// - Key is raw
51/// - Val is serialized
52#[implement(super::Map)]
53#[inline]
54pub fn raw_put<K, V>(&self, key: K, val: V)
55where
56	K: AsRef<[u8]>,
57	V: Serialize,
58{
59	let mut val_buf = ValBuf::new();
60	self.raw_bput(key, val, &mut val_buf);
61}
62
63/// Insert Key/Value
64///
65/// - Key is serialized
66/// - Val is serialized to stack-buffer
67#[implement(super::Map)]
68#[inline]
69pub fn put_aput<const VMAX: usize, K, V>(&self, key: K, val: V)
70where
71	K: Serialize + Debug,
72	V: Serialize,
73{
74	let mut key_buf = KeyBuf::new();
75	let mut val_buf = ArrayVec::<u8, VMAX>::new();
76	self.bput(key, val, (&mut key_buf, &mut val_buf));
77}
78
79/// Insert Key/Value
80///
81/// - Key is serialized to stack-buffer
82/// - Val is serialized
83#[implement(super::Map)]
84#[inline]
85pub fn aput_put<const KMAX: usize, K, V>(&self, key: K, val: V)
86where
87	K: Serialize + Debug,
88	V: Serialize,
89{
90	let mut key_buf = ArrayVec::<u8, KMAX>::new();
91	let mut val_buf = ValBuf::new();
92	self.bput(key, val, (&mut key_buf, &mut val_buf));
93}
94
95/// Insert Key/Value
96///
97/// - Key is serialized to stack-buffer
98/// - Val is serialized to stack-buffer
99#[implement(super::Map)]
100#[inline]
101pub fn aput<const KMAX: usize, const VMAX: usize, K, V>(&self, key: K, val: V)
102where
103	K: Serialize + Debug,
104	V: Serialize,
105{
106	let mut key_buf = ArrayVec::<u8, KMAX>::new();
107	let mut val_buf = ArrayVec::<u8, VMAX>::new();
108	self.bput(key, val, (&mut key_buf, &mut val_buf));
109}
110
111/// Insert Key/Value
112///
113/// - Key is serialized to stack-buffer
114/// - Val is raw
115#[implement(super::Map)]
116#[inline]
117pub fn aput_raw<const KMAX: usize, K, V>(&self, key: K, val: V)
118where
119	K: Serialize + Debug,
120	V: AsRef<[u8]>,
121{
122	let mut key_buf = ArrayVec::<u8, KMAX>::new();
123	self.bput_raw(key, val, &mut key_buf);
124}
125
126/// Insert Key/Value
127///
128/// - Key is raw
129/// - Val is serialized to stack-buffer
130#[implement(super::Map)]
131#[inline]
132pub fn raw_aput<const VMAX: usize, K, V>(&self, key: K, val: V)
133where
134	K: AsRef<[u8]>,
135	V: Serialize,
136{
137	let mut val_buf = ArrayVec::<u8, VMAX>::new();
138	self.raw_bput(key, val, &mut val_buf);
139}
140
141/// Insert Key/Value
142///
143/// - Key is serialized to supplied buffer
144/// - Val is serialized to supplied buffer
145#[implement(super::Map)]
146pub fn bput<K, V, Bk, Bv>(&self, key: K, val: V, mut buf: (Bk, Bv))
147where
148	K: Serialize + Debug,
149	V: Serialize,
150	Bk: Write + AsRef<[u8]>,
151	Bv: Write + AsRef<[u8]>,
152{
153	let val = ser::serialize(&mut buf.1, val).expect("failed to serialize insertion val");
154	self.bput_raw(key, val, &mut buf.0);
155}
156
157/// Insert Key/Value
158///
159/// - Key is serialized to supplied buffer
160/// - Val is raw
161#[implement(super::Map)]
162#[tracing::instrument(skip(self, val, buf), level = "trace")]
163pub fn bput_raw<K, V, Bk>(&self, key: K, val: V, mut buf: Bk)
164where
165	K: Serialize + Debug,
166	V: AsRef<[u8]>,
167	Bk: Write + AsRef<[u8]>,
168{
169	let key = ser::serialize(&mut buf, key).expect("failed to serialize insertion key");
170	self.insert(&key, val);
171}
172
173/// Insert Key/Value
174///
175/// - Key is raw
176/// - Val is serialized to supplied buffer
177#[implement(super::Map)]
178pub fn raw_bput<K, V, Bv>(&self, key: K, val: V, mut buf: Bv)
179where
180	K: AsRef<[u8]>,
181	V: Serialize,
182	Bv: Write + AsRef<[u8]>,
183{
184	let val = ser::serialize(&mut buf, val).expect("failed to serialize insertion val");
185	self.insert(&key, val);
186}