Skip to content

Commit

Permalink
Use batch insert in import
Browse files Browse the repository at this point in the history
  • Loading branch information
photino committed Dec 27, 2023
1 parent 20b1647 commit ea8e1ac
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 6 deletions.
2 changes: 1 addition & 1 deletion examples/actix-app/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ features = ["derive"]

[dependencies.zino]
path = "../../zino"
version = "0.16.5"
version = "0.16.6"
features = ["actix"]

[dependencies.zino-core]
Expand Down
2 changes: 1 addition & 1 deletion examples/axum-app/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ features = ["derive"]

[dependencies.zino]
path = "../../zino"
version = "0.16.5"
version = "0.16.6"
features = ["axum"]

[dependencies.zino-core]
Expand Down
2 changes: 1 addition & 1 deletion examples/dioxus-desktop/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ features = ["derive"]

[dependencies.zino]
path = "../../zino"
version = "0.16.5"
version = "0.16.6"
features = ["dioxus-desktop"]

[dependencies.zino-core]
Expand Down
2 changes: 1 addition & 1 deletion zino/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "zino"
description = "Next-generation framework for composable applications in Rust."
version = "0.16.5"
version = "0.16.6"
rust-version = "1.73"
edition = "2021"
license = "MIT"
Expand Down
28 changes: 26 additions & 2 deletions zino/src/controller/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -285,15 +285,34 @@ where

let data = req.parse_body::<Vec<Map>>().await?;
let extension = req.get_data::<<Self as ModelHooks>::Extension>();
let enable_upsert = req.get_query("upsert") == Some("true");
let validate_only = query.validate_only();
let no_check = query.no_check();
let limit = query.limit();
let query_filters = query.filters();
let (enable_upsert, batch_size) = if query_filters.get_str("upsert") == Some("true") {
(true, 1)
} else if validate_only {
(false, 0)
} else {
let batch_size = if let Some(Ok(size)) = query_filters.parse_usize("batch_size") {
size
} else {
100
};
(false, batch_size)
};

let mut rows_affected = 0;
let mut batch_models = Vec::with_capacity(batch_size);
for (index, mut map) in data.into_iter().enumerate() {
if limit > 0 && rows_affected >= limit {
break;
}
if batch_models.len() == batch_size && batch_size > 0 {
let mut models = Vec::with_capacity(batch_size);
models.append(&mut batch_models);
Self::insert_many(models).await.extract(&req)?;
}
Self::before_extract()
.await
.map_err(|err| Rejection::from_error(err).context(&req))?;
Expand All @@ -317,8 +336,10 @@ where
if !validate_only {
if enable_upsert {
model.upsert().await.extract(&req)?;
} else {
} else if batch_size == 1 {
model.insert().await.extract(&req)?;
} else {
batch_models.push(model);
}
rows_affected += 1;
}
Expand All @@ -331,6 +352,9 @@ where
return Ok(res.into());
}
}
if !batch_models.is_empty() {
Self::insert_many(batch_models).await.extract(&req)?;
}

let data = Map::from_entry("rows_affected", rows_affected);
res.set_json_data(data);
Expand Down

0 comments on commit ea8e1ac

Please sign in to comment.