Skip to content
This repository was archived by the owner on Oct 18, 2023. It is now read-only.

Commit 0e82066

Browse files
authored
Correctly handle RESPONSE_TOO_LARGE in Hrana (#530)
1 parent 7fb80c2 commit 0e82066

File tree

3 files changed

+17
-2
lines changed

3 files changed

+17
-2
lines changed

sqld/src/hrana/batch.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ use crate::error::Error as SqldError;
88
use crate::hrana::stmt::StmtError;
99
use crate::query::{Params, Query};
1010
use crate::query_analysis::Statement;
11-
use crate::query_result_builder::{QueryResultBuilder, StepResult, StepResultsBuilder};
11+
use crate::query_result_builder::{
12+
QueryResultBuilder, QueryResultBuilderError, StepResult, StepResultsBuilder,
13+
};
1214

1315
use super::result_builder::HranaBatchProtoBuilder;
1416
use super::stmt::{proto_stmt_to_query, stmt_error_from_sqld_error};
@@ -20,6 +22,8 @@ pub enum BatchError {
2022
TransactionTimeout,
2123
#[error("Server cannot handle additional transactions")]
2224
TransactionBusy,
25+
#[error("Response is too large")]
26+
ResponseTooLarge,
2327
}
2428

2529
fn proto_cond_to_cond(cond: &proto::BatchCond, max_step_i: usize) -> Result<Cond> {
@@ -149,6 +153,9 @@ fn batch_error_from_sqld_error(sqld_error: SqldError) -> Result<BatchError, Sqld
149153
Ok(match sqld_error {
150154
SqldError::LibSqlTxTimeout => BatchError::TransactionTimeout,
151155
SqldError::LibSqlTxBusy => BatchError::TransactionBusy,
156+
SqldError::BuilderError(QueryResultBuilderError::ResponseTooLarge(_)) => {
157+
BatchError::ResponseTooLarge
158+
}
152159
sqld_error => return Err(sqld_error),
153160
})
154161
}
@@ -158,6 +165,7 @@ impl BatchError {
158165
match self {
159166
Self::TransactionTimeout => "TRANSACTION_TIMEOUT",
160167
Self::TransactionBusy => "TRANSACTION_BUSY",
168+
Self::ResponseTooLarge => "RESPONSE_TOO_LARGE",
161169
}
162170
}
163171
}

sqld/src/hrana/stmt.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::error::Error as SqldError;
99
use crate::hrana;
1010
use crate::query::{Params, Query, Value};
1111
use crate::query_analysis::Statement;
12-
use crate::query_result_builder::QueryResultBuilder;
12+
use crate::query_result_builder::{QueryResultBuilder, QueryResultBuilderError};
1313

1414
/// An error during execution of an SQL statement.
1515
#[derive(thiserror::Error, Debug)]
@@ -43,6 +43,8 @@ pub enum StmtError {
4343

4444
#[error("Operation was blocked{}", .reason.as_ref().map(|msg| format!(": {}", msg)).unwrap_or_default())]
4545
Blocked { reason: Option<String> },
46+
#[error("Response is too large")]
47+
ResponseTooLarge,
4648
}
4749

4850
pub async fn execute_stmt(
@@ -196,6 +198,9 @@ pub fn stmt_error_from_sqld_error(sqld_error: SqldError) -> Result<StmtError, Sq
196198
SqldError::LibSqlInvalidQueryParams(source) => StmtError::ArgsInvalid { source },
197199
SqldError::LibSqlTxTimeout => StmtError::TransactionTimeout,
198200
SqldError::LibSqlTxBusy => StmtError::TransactionBusy,
201+
SqldError::BuilderError(QueryResultBuilderError::ResponseTooLarge(_)) => {
202+
StmtError::ResponseTooLarge
203+
}
199204
SqldError::Blocked(reason) => StmtError::Blocked { reason },
200205
SqldError::RusqliteError(rusqlite_error) => match rusqlite_error {
201206
rusqlite::Error::SqliteFailure(sqlite_error, Some(message)) => StmtError::SqliteError {
@@ -242,6 +247,7 @@ impl StmtError {
242247
Self::SqliteError { source, .. } => sqlite_error_code(source.code),
243248
Self::SqlInputError { .. } => "SQL_INPUT_ERROR",
244249
Self::Blocked { .. } => "BLOCKED",
250+
Self::ResponseTooLarge => "RESPONSE_TOO_LARGE",
245251
}
246252
}
247253
}

sqld/src/http/hrana_over_http_1.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ fn response_error_response(err: ResponseError) -> hyper::Response<hyper::Body> {
138138
| StmtError::SqlManyStmts
139139
| StmtError::ArgsInvalid { .. }
140140
| StmtError::SqlInputError { .. }
141+
| StmtError::ResponseTooLarge
141142
| StmtError::Blocked { .. } => hyper::StatusCode::BAD_REQUEST,
142143
StmtError::ArgsBothPositionalAndNamed => hyper::StatusCode::NOT_IMPLEMENTED,
143144
StmtError::TransactionTimeout | StmtError::TransactionBusy => {

0 commit comments

Comments
 (0)