use axum::{
extract::State,
http::StatusCode,
response::{IntoResponse, Json, Response},
};
use std::sync::Arc;
use crate::database::traits::DatabaseProvider;
use crate::schema::{QueryRequest, QueryResult};
pub async fn execute_query_handler<DB: DatabaseProvider>(
State(database): State<Arc<DB>>,
Json(request): Json<QueryRequest>,
) -> Response {
eprintln!("Executing SQL query: {}", request.sql);
match database.execute_query(&request.sql).await {
Ok(result) => {
if result.error.is_some() {
(StatusCode::BAD_REQUEST, Json(result)).into_response()
} else {
(StatusCode::OK, Json(result)).into_response()
}
}
Err(error) => {
eprintln!("Failed to execute query: {}", error);
let status = if error.to_string().contains("timeout") {
StatusCode::REQUEST_TIMEOUT
} else if error.to_string().contains("too large") || error.to_string().contains("TooManyRows") {
StatusCode::PAYLOAD_TOO_LARGE
} else {
StatusCode::BAD_REQUEST
};
(
status,
Json(QueryResult {
columns: vec![],
rows: vec![],
affected_rows: 0,
execution_time_milliseconds: 0,
error: Some(error.to_string()),
}),
)
.into_response()
}
}
}