diff --git a/src/worker/base.rs b/src/worker/base.rs index 7eb15c7..12e83d3 100644 --- a/src/worker/base.rs +++ b/src/worker/base.rs @@ -158,76 +158,22 @@ impl BaseWorker { ))); } - // Some Postgres functions expect BIGINT; cast to i64 to be safe when - // serializing the first parameter. - let uid_i64: i64 = falukant_user_id as i64; - let p1: &(dyn ToSql + Sync) = &uid_i64; - let p2: &(dyn ToSql + Sync) = &money_change; + // Send exact types matching the DB function signature: + // p_falukant_user_id integer, p_money_change numeric, p_activity text + let uid_i32: i32 = falukant_user_id; + let money_str = money_change.to_string(); // numeric accepts text + + let p1: &(dyn ToSql + Sync) = &uid_i32; + let p2: &(dyn ToSql + Sync) = &money_str; let p3: &(dyn ToSql + Sync) = &action; - // Debug: Logge die Parameter kurz vor dem Execute (nur stderr) + // Minimal logging eprintln!( - "[BaseWorker] change_falukant_user_money: calling update_money with user_id={}, money_change={}, action={}", - falukant_user_id, money_change, action + "[BaseWorker] change_falukant_user_money: update_money(user_id={}, money_change='{}', action={})", + uid_i32, money_str, action ); - // Zusätzlich: logge die konkreten Rust-Typen, damit wir sehen können, - // ob unerwartete Typen (z.B. String vs i32) übergeben werden. - use std::any::type_name_of_val; - eprintln!( - "[BaseWorker] param types: user_id={} ({}), uid_i64={} ({}), money_change={} ({}), action_type={} ", - falukant_user_id, - type_name_of_val(&falukant_user_id), - uid_i64, - type_name_of_val(&uid_i64), - money_change, - type_name_of_val(&money_change), - type_name_of_val(&action) - ); - - match conn.execute("update_money", &[p1, p2, p3]) { - Ok(rows) => { - // rows als Vec zurückgegeben, nichts weiter tun - let _ = rows; - } - Err(err) => { - let err_str = format!("{err}"); - // Wenn der Postgres-Client ein Serialisierungsproblem meldet, - // erweitern wir das Log um die tatsächlichen Parameterwerte - // und versuchen einen Retry, in dem wir user_id als String senden. - if err_str.contains("serializing parameter") { - eprintln!( - "[BaseWorker] Fehler beim Serialisieren der DB-Parameter: user_id={}, money_change={}, action={}. Original: {err}", - falukant_user_id, money_change, action - ); - - // Retry: sende user_id als String - let uid_str = falukant_user_id.to_string(); - let rp1: &(dyn ToSql + Sync) = &uid_str; - let rp2: &(dyn ToSql + Sync) = &money_change; - let rp3: &(dyn ToSql + Sync) = &action; - - eprintln!( - "[BaseWorker] Retry: sending user_id as string ('{}') to update_money", - uid_str - ); - - match conn.execute("update_money", &[rp1, rp2, rp3]) { - Ok(rows2) => { - let _ = rows2; - } - Err(err2) => { - eprintln!( - "[BaseWorker] Retry failed: {err2} (original: {err})" - ); - return Err(err2.into()); - } - } - } else { - return Err(err.into()); - } - } - } + let _ = conn.execute("update_money", &[p1, p2, p3])?; Ok(()) }