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.

This commit is contained in:
Torsten Schulz (local)
2025-12-01 11:31:37 +01:00
parent 260b3b2962
commit a0e14788c7
2 changed files with 12 additions and 23 deletions

View File

@@ -127,18 +127,6 @@ impl BaseWorker {
// Bei Bedarf kann hier später wieder ein expliziter Statuszugriff ergänzt werden. // 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 { impl BaseWorker {
/// Aktualisiert das Geld eines Falukant-Users über die DB-Funktion `falukant_data.update_money`. /// 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"). /// `action` entspricht dem Log-/Aktions-Tag (z.B. "credit pay rate", "debitor_prism").
@@ -153,13 +141,15 @@ impl BaseWorker {
.get() .get()
.map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?; .map_err(|e| DbError::new(format!("DB-Verbindung fehlgeschlagen: {e}")))?;
// Statement einmalig registrieren und anschließend über den Namen // Führe das Update über ein einfaches SQL-Statement ohne parametrisierte
// ausführen analog zum restlichen Code. // Platzhalter aus, um alle Serialisierungsprobleme des Treibers zu
conn.prepare("update_money", QUERY_UPDATE_MONEY)?; // umgehen. Alle Werte stammen aus vertrauenswürdigen Quellen.
// Parameter werden in ihren natürlichen Typen übergeben; PostgreSQL let escaped_action = action.replace('\'', "''");
// wählt anhand der Funktionssignatur die passenden Zieltypen. let sql = format!(
let money_str = money_change.to_string(); // NUMERIC erwartet String-Repräsentation "SELECT falukant_data.update_money({},{},'{}');",
conn.execute("update_money", &[&falukant_user_id, &money_str, &action])?; falukant_user_id, money_change, escaped_action
);
let _ = conn.query(&sql)?;
Ok(()) Ok(())
} }

View File

@@ -82,10 +82,9 @@ 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,
-- Geld explizit in einen numerischen Wert casten, damit das Mapping im -- Geld explizit als Text casten, damit das Mapping im Rust-Code
-- Rust-Code zuverlässig funktioniert (kein Sonderformat des PostgreSQL- -- zuverlässig funktioniert (unabhängig vom nativen DB-Typ wie `money`).
-- Typs `money` o.Ä.). CAST(fdu.money AS text) AS money,
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,