Refactor SQL parameter handling in BaseWorker: Updated the execution of the money update query to pass parameters in their natural types, allowing PostgreSQL to handle type casting automatically. Improved comments for clarity on the changes made to ensure compatibility with the existing database schema.

This commit is contained in:
Torsten Schulz (local)
2025-12-01 11:18:54 +01:00
parent 25b69e48fe
commit 260b3b2962
2 changed files with 14 additions and 17 deletions

View File

@@ -128,14 +128,14 @@ impl BaseWorker {
} }
// Hinweis: In der bestehenden Datenbank ist `falukant_data.update_money` typischerweise // Hinweis: In der bestehenden Datenbank ist `falukant_data.update_money` typischerweise
// so definiert, dass der Geldbetrag als NUMERIC erwartet wird. Wir casten den // so definiert, dass der Geldbetrag als NUMERIC erwartet wird. Wir übergeben
// zweiten Parameter in SQL explizit nach `numeric`; alle Parameter werden als // die Parameter ohne explizite Casts; PostgreSQL castet sie anhand der
// Strings übergeben und in SQL auf die Zieltypen gecastet. // Funktionssignatur automatisch.
const QUERY_UPDATE_MONEY: &str = r#" const QUERY_UPDATE_MONEY: &str = r#"
SELECT falukant_data.update_money( SELECT falukant_data.update_money(
$1::int4, $1,
$2::numeric, $2,
$3::text $3
); );
"#; "#;
@@ -156,16 +156,10 @@ impl BaseWorker {
// Statement einmalig registrieren und anschließend über den Namen // Statement einmalig registrieren und anschließend über den Namen
// ausführen analog zum restlichen Code. // ausführen analog zum restlichen Code.
conn.prepare("update_money", QUERY_UPDATE_MONEY)?; conn.prepare("update_money", QUERY_UPDATE_MONEY)?;
// Zur Umgehung von Serialisierungsproblemen werden alle Parameter als // Parameter werden in ihren natürlichen Typen übergeben; PostgreSQL
// Strings übergeben und in SQL auf die erwarteten Typen gecastet. // wählt anhand der Funktionssignatur die passenden Zieltypen.
let user_id_str = falukant_user_id.to_string(); let money_str = money_change.to_string(); // NUMERIC erwartet String-Repräsentation
let money_str = money_change.to_string(); conn.execute("update_money", &[&falukant_user_id, &money_str, &action])?;
let action_str = action.to_string();
conn.execute(
"update_money",
&[&user_id_str, &money_str, &action_str],
)?;
Ok(()) Ok(())
} }

View File

@@ -82,7 +82,10 @@ const QUERY_GET_DIRECTORS: &str = r#"
const QUERY_GET_BEST_PRODUCTION: &str = r#" const QUERY_GET_BEST_PRODUCTION: &str = r#"
SELECT SELECT
fdu.id falukant_user_id, fdu.id falukant_user_id,
fdu.money, -- Geld explizit in einen numerischen Wert casten, damit das Mapping im
-- Rust-Code zuverlässig funktioniert (kein Sonderformat des PostgreSQL-
-- Typs `money` o.Ä.).
CAST(fdu.money AS numeric) AS money,
fdu.certificate, fdu.certificate,
ftp.id product_id, ftp.id product_id,
ftp.label_tr, ftp.label_tr,