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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
use {
super::{columns_to_positions, validate},
crate::{data::Schema, ComplexTableName, ExecuteError, Glue, Payload, Result, Row},
sqlparser::ast::{Ident, ObjectName, Query},
};
impl Glue {
pub async fn insert(
&mut self,
table_name: &ObjectName,
columns: &[Ident],
source: &Query,
expect_data: bool,
) -> Result<Payload> {
let ComplexTableName {
name: table_name,
database,
..
} = &table_name.try_into()?;
let Schema {
column_defs,
indexes,
..
} = self
.get_database(database)?
.fetch_schema(table_name)
.await?
.ok_or(ExecuteError::TableNotExists)?;
let (labels, mut rows) = self.query(source.clone()).await?;
let column_positions = columns_to_positions(&column_defs, columns)?;
validate(&column_defs, &column_positions, &mut rows)?;
let mut rows: Vec<Row> = rows.into_iter().map(Row).collect();
#[cfg(feature = "auto-increment")]
self.auto_increment(database, table_name, &column_defs, &mut rows)
.await?;
self.validate_unique(database, table_name, &column_defs, &rows, None)
.await?;
let num_rows = rows.len();
let database = &mut **self.get_mut_database(database)?;
let result = database.insert_data(table_name, rows.clone()).await;
let result = result.map(|_| {
if expect_data {
Payload::Select { labels, rows }
} else {
Payload::Insert(num_rows)
}
})?;
for index in indexes.iter() {
index.reset(database, table_name, &column_defs).await?;
}
Ok(result)
}
}