using Sonex.Data.Database; using Sonex.Data.Records; namespace Sonex.Library.WorkersCore; public static partial class Worker { public static void UpdateStatus() { ExecuteStatusWrite( () => WorkerInfoRecord.UpdateStatusAsync( Name, Status.ToString(), Activity, Progress, ProgressInfo), "UpdateStatus"); } public static void UpdateActivity(string activity) { Activity = activity; ExecuteStatusWrite( () => WorkerInfoRecord.UpdateActivityAsync( Name, Activity, Progress, ProgressInfo), "UpdateActivity"); } public static void UpdateProgress(int currentTask, int totalTasks) { CurrentTask = currentTask; TotalTasks = totalTasks; ExecuteStatusWrite( () => WorkerInfoRecord.UpdateProgressAsync( Name, Progress, ProgressInfo), "UpdateProgress"); } public static void WorkerStarted() { Status = WorkerStatus.Running; ExecuteStatusWrite( () => WorkerInfoRecord.UpdateStatusAsync( Name, "Running", string.Empty, string.Empty, string.Empty), "WorkerStarted"); } public static void WorkerPaused() { Status = WorkerStatus.Paused; ExecuteStatusWrite( () => WorkerInfoRecord.UpdateStatusAsync( Name, "Paused", Activity, Progress, ProgressInfo), "WorkerPaused"); } public static void WorkerResumed() { Status = WorkerStatus.Running; ExecuteStatusWrite( () => WorkerInfoRecord.UpdateStatusAsync( Name, "Running", Activity, Progress, ProgressInfo), "WorkerResumed"); } public static void WorkerFinished() { Status = WorkerStatus.Stopped; ExecuteStatusWrite( () => WorkerInfoRecord.UpdateStatusAsync( Name, "Stopped", string.Empty, Progress, ProgressInfo), "WorkerFinished"); } public static void WorkerError(string activity) { Status = WorkerStatus.Error; Activity = activity; ExecuteStatusWrite( () => WorkerInfoRecord.UpdateStatusAsync( Name, "Error", Activity, Progress, ProgressInfo), "WorkerError"); } private static void ExecuteStatusWrite( Func>> action, string operation) { try { var result = ExecuteDatabaseSingleWithRetry( _ => action(), operation); if (!result.Success || result.Item != true) { PrintStatusConsoleError( $"Worker status write failed. Operation={operation}. Error={result.ErrorMessage}"); PrintStatusConsoleError(FormatStatusDbErrorDetails(result)); } } catch (Exception ex) { PrintStatusConsoleError( $"Worker status write exception. Operation={operation}. Error={ex.Message}"); PrintStatusConsoleError(ex.ToString()); } } private static void PrintStatusConsoleError(string message) { Console.Error.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] [WorkerCore] {message}"); } private static string FormatStatusDbErrorDetails(DB.SingleResult result) { return $"DbErrorType={result.ErrorType ?? "(null)"} | " + $"DbErrorStackTrace={result.ErrorStackTrace ?? "(null)"} | " + $"DbErrorData={result.ErrorData ?? "(null)"}"; } }