This commit is contained in:
2026-04-18 11:03:41 +02:00
parent 0dc797298e
commit b5cde7d512
5 changed files with 128 additions and 2 deletions

View File

@@ -107,9 +107,11 @@ CREATE TABLE IF NOT EXISTS listener_sessions (
CREATE TABLE IF NOT EXISTS raw_http_rpc_messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
listener_session_id INTEGER NOT NULL,
request_id INTEGER NOT NULL,
method TEXT NOT NULL,
request_body TEXT NOT NULL,
response_body TEXT NOT NULL,
status TEXT NOT NULL,
created_at TEXT NOT NULL,
FOREIGN KEY(listener_session_id) REFERENCES listener_sessions(id)
);
@@ -279,8 +281,52 @@ WHERE id = ?2;
}
}
pub(crate) async fn insert_raw_http_rpc_message(
pool: &sqlx::SqlitePool,
session_id: i64,
request_id: i64,
method: &str,
request_body: &str,
response_body: &str,
status: &str,
) -> core::result::Result<(), crate::KhbbError> {
let now = chrono::Utc::now().to_rfc3339();
let query_result = sqlx::query(
r#"
INSERT INTO raw_http_rpc_messages (
listener_session_id,
request_id,
method,
request_body,
response_body,
status,
created_at
)
VALUES (?, ?, ?, ?, ?, ?, ?)
"#,
)
.bind(session_id)
.bind(request_id)
.bind(method)
.bind(request_body)
.bind(response_body)
.bind(status)
.bind(now)
.execute(pool)
.await;
match query_result {
Ok(_) => Ok(()),
Err(error) => Err(crate::KhbbError::Database {
context: "insert raw http rpc message",
message: error.to_string(),
}),
}
}
#[cfg(test)]
mod tests {
use super::*;
fn build_test_config(database_url: std::string::String) -> crate::KhbbAppConfig {
crate::KhbbAppConfig {
database_url,
@@ -404,4 +450,27 @@ WHERE id = ?1;
let status = fetch_result.expect("fetch updated status");
assert_eq!(status, "stopped");
}
#[tokio::test]
async fn insert_raw_http_rpc_message_inserts_row() {
let pool = create_sqlite_pool("sqlite::memory:").await.expect("pool");
ensure_sqlite_schema(&pool).await.expect("schema");
let session = insert_listener_session(
&pool,
&crate::KhbbAppConfig {
database_url: "sqlite::memory:".into(),
solana_http_rpc_url: "http://localhost".into(),
solana_ws_rpc_url: "ws://localhost".into(),
yellowstone_grpc_url: None,
log_filter: "info".into(),
bootstrap_database: false,
listener_poll_interval_ms: 1000,
},
)
.await
.expect("session");
let result =
insert_raw_http_rpc_message(&pool, session.id, 1, "getSlot", "{}", "{}", "ok").await;
assert!(result.is_ok());
}
}