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,