Skip to content

Commit 5a56e85

Browse files
wprzytulapsarna
authored andcommitted
connection: Extracted repreparing as a method
As reprepare logic was duplicated (in prepared statements and in batches), I've extracted it as a separate function.
1 parent a82e217 commit 5a56e85

File tree

1 file changed

+29
-24
lines changed

1 file changed

+29
-24
lines changed

scylla/src/transport/connection.rs

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,24 @@ impl Connection {
354354
Ok(prepared_statement)
355355
}
356356

357+
async fn reprepare(
358+
&self,
359+
query: impl Into<Query>,
360+
previous_prepared: &PreparedStatement,
361+
) -> Result<(), QueryError> {
362+
let reprepare_query: Query = query.into();
363+
let reprepared = self.prepare(&reprepare_query).await?;
364+
// Reprepared statement should keep its id - it's the md5 sum
365+
// of statement contents
366+
if reprepared.get_id() != previous_prepared.get_id() {
367+
Err(QueryError::ProtocolError(
368+
"Prepared statement Id changed, md5 sum should stay the same",
369+
))
370+
} else {
371+
Ok(())
372+
}
373+
}
374+
357375
pub async fn authenticate_response(
358376
&self,
359377
username: Option<String>,
@@ -550,27 +568,20 @@ impl Connection {
550568
.send_request(&execute_frame, true, prepared_statement.config.tracing)
551569
.await?;
552570

553-
if let Response::Error(err) = &query_response.response {
554-
if let DbError::Unprepared { statement_id } = &err.error {
571+
match &query_response.response {
572+
Response::Error(frame::response::Error {
573+
error: DbError::Unprepared { statement_id },
574+
..
575+
}) => {
555576
debug!("Connection::execute: Got DbError::Unprepared - repreparing statement with id {:?}", statement_id);
556577
// Repreparation of a statement is needed
557-
let reprepare_query: Query = prepared_statement.get_statement().into();
558-
let reprepared = self.prepare(&reprepare_query).await?;
559-
// Reprepared statement should keep its id - it's the md5 sum
560-
// of statement contents
561-
if reprepared.get_id() != prepared_statement.get_id() {
562-
return Err(QueryError::ProtocolError(
563-
"Prepared statement Id changed, md5 sum should stay the same",
564-
));
565-
}
566-
567-
return self
568-
.send_request(&execute_frame, true, prepared_statement.config.tracing)
569-
.await;
578+
self.reprepare(prepared_statement.get_statement(), prepared_statement)
579+
.await?;
580+
self.send_request(&execute_frame, true, prepared_statement.config.tracing)
581+
.await
570582
}
583+
_ => Ok(query_response),
571584
}
572-
573-
Ok(query_response)
574585
}
575586

576587
/// Performs execute_single_page multiple times to fetch all available pages
@@ -673,13 +684,7 @@ impl Connection {
673684
_ => None,
674685
});
675686
if let Some(p) = prepared_statement {
676-
let reprepare_query: Query = p.get_statement().into();
677-
let reprepared = self.prepare(&reprepare_query).await?;
678-
if reprepared.get_id() != p.get_id() {
679-
return Err(QueryError::ProtocolError(
680-
"Prepared statement Id changed, md5 sum should stay the same",
681-
));
682-
}
687+
self.reprepare(p.get_statement(), p).await?;
683688
continue;
684689
} else {
685690
return Err(QueryError::ProtocolError(

0 commit comments

Comments
 (0)