diff --git a/src/worker/base.rs b/src/worker/base.rs index 63f25a0..4883dde 100644 --- a/src/worker/base.rs +++ b/src/worker/base.rs @@ -158,7 +158,10 @@ impl BaseWorker { ))); } - let p1: &(dyn ToSql + Sync) = &falukant_user_id; + // 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; let p3: &(dyn ToSql + Sync) = &action; @@ -174,15 +177,41 @@ impl BaseWorker { 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. - if format!("{err}").contains("serializing parameter") { + // 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()); } - return Err(err.into()); } } diff --git a/src/worker/director.rs b/src/worker/director.rs index aa03923..faa5db8 100644 --- a/src/worker/director.rs +++ b/src/worker/director.rs @@ -682,6 +682,12 @@ impl DirectorWorker { ); } + // Debug: Log vor dem DB-Aufruf + eprintln!( + "[DirectorWorker] calling change_falukant_user_money for start production: user_id={}, money_change={}", + plan.falukant_user_id, -production_cost + ); + conn.prepare("insert_production", QUERY_INSERT_PRODUCTION)?; // Eine einzelne Produktion mit max. 100 Stück anlegen @@ -1005,6 +1011,12 @@ impl DirectorWorker { ); } + // Debug: Log vor dem DB-Aufruf + eprintln!( + "[DirectorWorker] calling change_falukant_user_money for sell products: user_id={}, money_change={}, product_id={}", + item.user_id, sell_price, item.product_id + ); + conn.execute( "add_sell_log", &[