Skip to content

Commit ddc8e79

Browse files
committed
prepare sql & parameters
1 parent 332cdd4 commit ddc8e79

File tree

1 file changed

+32
-3
lines changed

1 file changed

+32
-3
lines changed

sqlx-core/src/aurora/connection/executor.rs

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ use super::AuroraConnection;
22
use crate::aurora::error::AuroraDatabaseError;
33
use crate::aurora::statement::AuroraStatementMetadata;
44
use crate::aurora::{
5-
Aurora, AuroraArguments, AuroraColumn, AuroraDone, AuroraRow, AuroraStatement, AuroraTypeInfo,
5+
Aurora, AuroraArguments, AuroraColumn, AuroraDbType, AuroraDone, AuroraRow, AuroraStatement,
6+
AuroraTypeInfo,
67
};
78
use crate::describe::Describe;
89
use crate::error::Error;
@@ -16,6 +17,8 @@ use futures_core::stream::BoxStream;
1617
use futures_core::Stream;
1718
use futures_util::stream;
1819
use futures_util::{pin_mut, TryStreamExt};
20+
use once_cell::sync::Lazy;
21+
use regex::Regex;
1922
use rusoto_rds_data::{ExecuteStatementRequest, ExecuteStatementResponse, RdsData};
2023
use std::borrow::Cow;
2124
use std::sync::Arc;
@@ -24,15 +27,41 @@ impl AuroraConnection {
2427
async fn run<'e, 'c: 'e, 'q: 'e>(
2528
&'c mut self,
2629
query: &'q str,
27-
arguments: Option<AuroraArguments>,
30+
mut arguments: Option<AuroraArguments>,
2831
) -> Result<impl Stream<Item = Result<Either<AuroraDone, AuroraRow>, Error>> + 'e, Error> {
2932
let mut logger = QueryLogger::new(query, self.log_settings.clone());
3033

34+
static MYSQL_PARAMS_RE: Lazy<Regex> = Lazy::new(|| Regex::new(r"\?").unwrap());
35+
static POSTGRES_PARAMS_RE: Lazy<Regex> = Lazy::new(|| Regex::new(r"\$\d+").unwrap());
36+
37+
let regex = match self.db_type {
38+
AuroraDbType::MySQL => &MYSQL_PARAMS_RE,
39+
AuroraDbType::Postgres => &POSTGRES_PARAMS_RE,
40+
};
41+
42+
let mut owned_query = query.to_owned();
43+
44+
if let Some(arguments) = arguments.as_mut() {
45+
regex
46+
.find_iter(query)
47+
.zip(arguments.parameters.iter_mut())
48+
.enumerate()
49+
.for_each(|(idx, (mat, param))| {
50+
let name = format!("param_{}", idx + 1);
51+
52+
owned_query.replace_range(mat.start()..mat.end(), &format!(":{}", name));
53+
54+
param.name = Some(name);
55+
});
56+
}
57+
58+
dbg!(&owned_query);
59+
3160
// TODO: is this correct?
3261
let transaction_id = self.transaction_ids.last().cloned();
3362

3463
let request = ExecuteStatementRequest {
35-
sql: query.to_owned(),
64+
sql: owned_query,
3665
parameters: arguments.map(|m| m.parameters),
3766
resource_arn: self.resource_arn.clone(),
3867
secret_arn: self.secret_arn.clone(),

0 commit comments

Comments
 (0)