multisql/executor/alter_row/
insert.rs

1use {
2	super::{columns_to_positions, validate},
3	crate::{
4		data::Schema, types::ComplexTableName, ExecuteError, Glue, Payload, Result, Row, Value,
5	},
6	sqlparser::ast::{Ident, ObjectName, Query},
7};
8
9impl Glue {
10	pub async fn ast_insert(
11		&mut self,
12		table_name: &ObjectName,
13		columns: &[Ident],
14		source: &Query,
15		expect_data: bool,
16	) -> Result<Payload> {
17		let ComplexTableName {
18			name: table_name,
19			database,
20			..
21		} = &table_name.try_into()?;
22
23		let columns = columns
24			.iter()
25			.map(|column| column.value.as_str())
26			.collect::<Vec<_>>();
27		let (labels, rows) = self.ast_query(source.clone()).await?;
28		self.true_insert(
29			database,
30			table_name,
31			&columns,
32			rows,
33			Some(labels),
34			expect_data,
35		)
36		.await
37	}
38	pub async fn true_insert(
39		&mut self,
40		database: &Option<String>,
41		table: &str,
42		columns: &[&str],
43		mut rows: Vec<Vec<Value>>,
44		labels: Option<Vec<String>>,
45		expect_data: bool,
46	) -> Result<Payload> {
47		let Schema {
48			column_defs,
49			indexes,
50			..
51		} = self
52			.get_database(database)?
53			.fetch_schema(table)
54			.await?
55			.ok_or(ExecuteError::TableNotExists)?;
56		let column_positions = columns_to_positions(&column_defs, columns)?;
57
58		validate(&column_defs, &column_positions, &mut rows)?;
59		let mut rows: Vec<Row> = rows.into_iter().map(Row).collect();
60		#[cfg(feature = "auto-increment")]
61		self.auto_increment(database, table, &column_defs, &mut rows)
62			.await?;
63		self.validate_unique(database, table, &column_defs, &rows, None)
64			.await?;
65
66		let num_rows = rows.len();
67
68		let result = if expect_data {
69			Payload::Select {
70				labels: labels.unwrap_or_default(),
71				rows: rows.clone(),
72			}
73		} else {
74			Payload::Insert(num_rows)
75		};
76
77		self.insert_data(database, table, rows).await?;
78
79		if !indexes.is_empty() {
80			let database = &mut **self.get_mut_database(database)?;
81			for index in indexes.iter() {
82				// TODO: Should definitely be just inserting an index record
83				index.reset(database, table, &column_defs).await?; // TODO: Not this; optimise
84			}
85		}
86
87		Ok(result)
88	}
89	pub async fn insert_data(
90		&mut self,
91		database: &Option<String>,
92		table_name: &str,
93		rows: Vec<Row>,
94	) -> Result<()> {
95		let database = &mut **self.get_mut_database(database)?;
96		database.insert_data(table_name, rows).await
97	}
98}