|
1 | 1 | use crate::util::Error; |
2 | 2 |
|
| 3 | +#[cfg(any(feature = "pg-orm", feature = "pg-orm-async"))] |
3 | 4 | // diesel does not support high level bulk update api. use raw sql to bypass the limitation. |
4 | 5 | // relate discussion: https://github.com/diesel-rs/diesel/discussions/2879 |
5 | 6 | pub fn update_query_from_ids(ids: &[(i32, i32)]) -> String { |
| 7 | + update_query(|query| { |
| 8 | + use core::fmt::Write; |
| 9 | + ids.iter().for_each(|(w_id, num)| { |
| 10 | + write!(query, "({}::int,{}::int),", w_id, num).unwrap(); |
| 11 | + }); |
| 12 | + }) |
| 13 | +} |
| 14 | + |
| 15 | +fn update_query(func: impl FnOnce(&mut String)) -> String { |
6 | 16 | const PREFIX: &str = "UPDATE world SET randomNumber = w.r FROM (VALUES "; |
7 | 17 | const SUFFIX: &str = ") AS w (i,r) WHERE world.id = w.i"; |
8 | 18 |
|
9 | 19 | let mut query = String::from(PREFIX); |
10 | 20 |
|
11 | | - use std::fmt::Write; |
12 | | - ids.iter().for_each(|(w_id, num)| { |
13 | | - write!(query, "({}::int,{}::int),", w_id, num).unwrap(); |
14 | | - }); |
| 21 | + func(&mut query); |
15 | 22 |
|
16 | 23 | if query.ends_with(',') { |
17 | 24 | query.pop(); |
@@ -46,12 +53,15 @@ pub mod pg { |
46 | 53 | pub const FORTUNE_STMT: StatementNamed = Statement::named("SELECT * FROM fortune", &[]); |
47 | 54 | pub const WORLD_STMT: StatementNamed = Statement::named("SELECT * FROM world WHERE id=$1", &[Type::INT4]); |
48 | 55 |
|
49 | | - pub fn update_query(num: usize) -> Box<str> { |
50 | | - let (_, ids) = (1..=num).fold((1, Vec::new()), |(id, mut ids), _| { |
51 | | - ids.push((id, id + 1)); |
52 | | - (id + 2, ids) |
53 | | - }); |
54 | | - super::update_query_from_ids(&ids).into_boxed_str() |
| 56 | + pub fn update_query_from_num(num: usize) -> Box<str> { |
| 57 | + super::update_query(|query| { |
| 58 | + use core::fmt::Write; |
| 59 | + (1..=num).fold(1, |idx, _| { |
| 60 | + write!(query, "(${}::int,${}::int),", idx, idx + 1).unwrap(); |
| 61 | + idx + 2 |
| 62 | + }); |
| 63 | + }) |
| 64 | + .into_boxed_str() |
55 | 65 | } |
56 | 66 |
|
57 | 67 | pub fn sort_update_params(params: &[[i32; 2]]) -> impl ExactSizeIterator<Item = i32> { |
|
0 commit comments