multisql/databases/sled/
auto_increment.rs

1#![cfg(feature = "auto-increment")]
2use {
3	super::{error::err_into, SledDatabase},
4	crate::{AutoIncrement, Error, Result},
5	async_trait::async_trait,
6	fstrings::*,
7	sled::transaction::ConflictableTransactionError,
8};
9
10#[async_trait(?Send)]
11impl AutoIncrement for SledDatabase {
12	async fn generate_increment_values(
13		&mut self,
14		table_name: String,
15		columns: Vec<(
16			usize,  /*index*/
17			String, /*name*/
18			i64,    /*row_count*/
19		) /*column*/>,
20	) -> Result<
21		Vec<(
22			(usize /*index*/, String /*name*/), /*column*/
23			i64,                                /*start_value*/
24		)>,
25	> {
26		self.tree
27			.transaction(|tree| {
28				let mut results = vec![];
29				for (column_index, column_name, row_count) in &columns {
30					// KG: I couldn't get the colunns variable in here for some reason (because it is an enclosure?)
31					let (column_index, column_name, row_count): (usize, String, i64) =
32						(*column_index, column_name.clone(), *row_count);
33					let table_name = table_name.clone();
34					let key = f!("generator/{table_name}/{column_name}");
35					let key = key.as_bytes();
36
37					let start_ivec = tree.get(key)?;
38					let start_value = start_ivec
39						.map(|value| bincode::deserialize(&value))
40						.unwrap_or(Ok(1))
41						.map_err(err_into)
42						.map_err(ConflictableTransactionError::Abort)?;
43
44					let end_value = start_value + row_count;
45					let end_ivec = bincode::serialize(&end_value)
46						.map_err(err_into)
47						.map_err(ConflictableTransactionError::Abort)?;
48
49					tree.insert(key, end_ivec)?;
50					results.push(((column_index, column_name), start_value));
51				}
52				Ok(results)
53			})
54			.map_err(Error::from)
55	}
56
57	async fn set_increment_value(
58		&mut self,
59		table_name: &str,
60		column_name: &str,
61		end: i64,
62	) -> Result<()> {
63		let end_ivec = bincode::serialize(&end).map_err(err_into)?;
64
65		let key = f!("generator/{table_name}/{column_name}");
66		let key = key.as_bytes();
67
68		self.tree.insert(key, end_ivec).map_err(err_into)?;
69
70		Ok(())
71	}
72}