multisql/databases/sled/
auto_increment.rs1#![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, String, i64, ) >,
20 ) -> Result<
21 Vec<(
22 (usize , String ), i64, )>,
25 > {
26 self.tree
27 .transaction(|tree| {
28 let mut results = vec![];
29 for (column_index, column_name, row_count) in &columns {
30 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}