From a0e14788c79496f0ed8c467565cbe6d3f884ad1f Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 1 Dec 2025 11:31:37 +0100 Subject: [PATCH] Refactor money update execution in BaseWorker: Simplified the SQL execution by directly constructing the update query without parameterized placeholders, addressing serialization issues. Updated comments for clarity on the handling of money values and ensured compatibility with trusted data sources. Additionally, modified the casting of money in the director query to text for consistent mapping in Rust. --- src/worker/base.rs | 28 +++++++++------------------- src/worker/director.rs | 7 +++---- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/src/worker/base.rs b/src/worker/base.rs index 2ed2707..9d235b2 100644 --- a/src/worker/base.rs +++ b/src/worker/base.rs @@ -127,18 +127,6 @@ impl BaseWorker { // Bei Bedarf kann hier später wieder ein expliziter Statuszugriff ergänzt werden. } -// Hinweis: In der bestehenden Datenbank ist `falukant_data.update_money` typischerweise -// so definiert, dass der Geldbetrag als NUMERIC erwartet wird. Wir übergeben -// die Parameter ohne explizite Casts; PostgreSQL castet sie anhand der -// Funktionssignatur automatisch. -const QUERY_UPDATE_MONEY: &str = r#" - SELECT falukant_data.update_money( - $1, - $2, - $3 - ); -"#; - impl BaseWorker { /// Aktualisiert das Geld eines Falukant-Users über die DB-Funktion `falukant_data.update_money`. /// `action` entspricht dem Log-/Aktions-Tag (z.B. "credit pay rate", "debitor_prism"). @@ -153,13 +141,15 @@ impl BaseWorker { .get() .map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?; - // Statement einmalig registrieren und anschließend über den Namen - // ausführen – analog zum restlichen Code. - conn.prepare("update_money", QUERY_UPDATE_MONEY)?; - // Parameter werden in ihren natürlichen Typen übergeben; PostgreSQL - // wählt anhand der Funktionssignatur die passenden Zieltypen. - let money_str = money_change.to_string(); // NUMERIC erwartet String-Repräsentation - conn.execute("update_money", &[&falukant_user_id, &money_str, &action])?; + // Führe das Update über ein einfaches SQL-Statement ohne parametrisierte + // Platzhalter aus, um alle Serialisierungsprobleme des Treibers zu + // umgehen. Alle Werte stammen aus vertrauenswürdigen Quellen. + let escaped_action = action.replace('\'', "''"); + let sql = format!( + "SELECT falukant_data.update_money({},{},'{}');", + falukant_user_id, money_change, escaped_action + ); + let _ = conn.query(&sql)?; Ok(()) } diff --git a/src/worker/director.rs b/src/worker/director.rs index 4aa6769..37fa231 100644 --- a/src/worker/director.rs +++ b/src/worker/director.rs @@ -82,10 +82,9 @@ const QUERY_GET_DIRECTORS: &str = r#" const QUERY_GET_BEST_PRODUCTION: &str = r#" SELECT fdu.id falukant_user_id, - -- 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, + -- Geld explizit als Text casten, damit das Mapping im Rust-Code + -- zuverlässig funktioniert (unabhängig vom nativen DB-Typ wie `money`). + CAST(fdu.money AS text) AS money, fdu.certificate, ftp.id product_id, ftp.label_tr,