Skip to main content

tuwunel_database/map/
insert.rs

1//! Insert a Key+Value into the database.
2//!
3//! Overloads are provided for the user to choose the most efficient
4//! serialization or bypass for pre=serialized (raw) inputs.
5
6use std::{convert::AsRef, fmt::Debug};
7
8use rocksdb::WriteBatchWithTransaction;
9use tuwunel_core::implement;
10
11use crate::util::or_else;
12
13/// Insert Key/Value
14///
15/// - Key is raw
16/// - Val is raw
17#[implement(super::Map)]
18#[tracing::instrument(skip_all, fields(%self), level = "trace")]
19pub fn insert<K, V>(&self, key: &K, val: V)
20where
21	K: AsRef<[u8]> + ?Sized,
22	V: AsRef<[u8]>,
23{
24	let write_options = &self.write_options;
25	self.engine
26		.db
27		.put_cf_opt(&self.cf(), key, val, write_options)
28		.or_else(or_else)
29		.expect("database insert error");
30
31	if !self.engine.corked() {
32		self.engine.flush().expect("database flush error");
33	}
34
35	self.notify(key.as_ref());
36}
37
38#[implement(super::Map)]
39#[tracing::instrument(skip(self, iter), fields(%self), level = "trace")]
40pub fn insert_batch<'a, I, K, V>(&'a self, iter: I)
41where
42	I: Iterator<Item = (K, V)> + Send + Debug,
43	K: AsRef<[u8]> + Sized + Debug + 'a,
44	V: AsRef<[u8]> + Sized + 'a,
45{
46	let mut batch = WriteBatchWithTransaction::<false>::default();
47	for (key, val) in iter {
48		batch.put_cf(&self.cf(), key.as_ref(), val.as_ref());
49	}
50
51	let write_options = &self.write_options;
52	self.engine
53		.db
54		.write_opt(&batch, write_options)
55		.or_else(or_else)
56		.expect("database insert batch error");
57
58	if !self.engine.corked() {
59		self.engine.flush().expect("database flush error");
60	}
61}