1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#![cfg(feature = "auto-increment")]
use crate::{Column, Glue, Result, Row, Value, ValueDefault};

impl Glue {
	pub async fn auto_increment(
		&mut self,
		database: &Option<String>,
		table_name: &str,
		columns: &[Column],
		rows: &mut [Row],
	) -> Result<()> {
		let auto_increment_columns = columns
			.iter()
			.enumerate()
			.filter(|(_, column)| matches!(column.default, Some(ValueDefault::AutoIncrement(_))))
			.map(|(index, column)| {
				(
					index,
					column.name.clone(),
					rows.iter()
						.filter(|row| matches!(row.0.get(index), Some(Value::Null)))
						.count() as i64,
				)
			})
			.collect();

		let column_values = self
			.get_mut_database(database)?
			.generate_increment_values(table_name.to_string(), auto_increment_columns)
			.await?;

		let mut column_values = column_values;
		for row in rows.iter_mut() {
			for ((index, _name), value) in &mut column_values {
				let cell = row.0.get_mut(*index).unwrap();
				if matches!(cell, Value::Null) {
					*cell = Value::I64(*value);
					*value += 1;
				}
			}
		}
		Ok(())
	}
}