From db62cbb40a37d48a39de1be21eaf86b59f2587fb Mon Sep 17 00:00:00 2001
From: Volker Schukai <volker.schukai@schukai.com>
Date: Wed, 17 Apr 2024 20:56:58 +0200
Subject: [PATCH] fix: save all stats #51

---
 database-4_test.go | 11 ++++++-----
 database.go        | 24 ++++++++++++++++++------
 event-bus.go       |  1 +
 3 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/database-4_test.go b/database-4_test.go
index 1b1f119..7b9e788 100644
--- a/database-4_test.go
+++ b/database-4_test.go
@@ -13,8 +13,9 @@ import (
 func TestWriteToDB4(t *testing.T) {
 
 	db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})
+	//db, err := gorm.Open(sqlite.Open("file:/home/vs/workspaces/alvine/cloud/framework/dummy.sqlite"), &gorm.Config{})
 	if err != nil {
-		t.Fatalf("a error occurred while opening the database: %v", err)
+		t.Fatalf("an error occurred while opening the database: %v", err)
 	}
 
 	manager := NewManager()
@@ -45,13 +46,13 @@ func TestWriteToDB4(t *testing.T) {
 	err = manager.ScheduleJob(job, scheduler)
 	assert.Nil(t, err)
 
-	time.Sleep(200 * time.Millisecond)
-
-	assert.Equal(t, 21, job.GetStats().RunCount)
+	time.Sleep(100 * time.Millisecond)
 
+	Info("WaitSync")
 	manager.WaitSync()
+	assert.Equal(t, 21, job.GetStats().RunCount)
 
-	// check is stats are the values above
+	// check the stats are the values above
 	var tmpJob JobPersistence
 
 	err = db.Preload("Stats").First(&tmpJob, "id = ?", "job3").Error
diff --git a/database.go b/database.go
index 6ce44a0..e8591df 100644
--- a/database.go
+++ b/database.go
@@ -88,7 +88,7 @@ func (s *JobSyncer) ResetStats(job GenericJob) error {
 	if s.manager == nil || s.manager.database == nil {
 		return ErrNoDatabaseConnection
 	}
-	return saveJob(job, s.manager.database)
+	return updateJob(job, s.manager.database)
 
 }
 
@@ -137,13 +137,20 @@ func update(job *JobPersistence, db *gorm.DB) error {
 		return ErrNoDatabaseConnection
 	}
 
-	permJob := job.GetPersistence()
-
 	return db.Transaction(func(tx *gorm.DB) error {
 
-		if permJob.Stats != (JobStats{}) {
-			if err := tx.Model(&permJob).Select("Stats").Updates(map[string]interface{}{"stats": permJob.Stats}).Error; err != nil {
-				return err
+		if job.Stats != (JobStats{}) {
+			Info("Updating stats for job %s", job.ID)
+
+			if job.Stats.RunCount == 0 {
+				Info("Stats runCount is 0, skipping update")
+			}
+
+			if err := tx.Model(job.Stats).
+				Select("*").
+				Omit("job_id", "created_at").
+				Updates(job.Stats).Error; err != nil {
+				return err // Fehler beim Update
 			}
 		}
 
@@ -180,6 +187,11 @@ func save(job *JobPersistence, db *gorm.DB) error {
 
 		if job.Stats != (JobStats{}) {
 			job.Stats.JobID = job.ID
+
+			if job.Stats.RunCount == 0 {
+				Info("Stats runCount is 0, skipping update")
+			}
+
 			if err := tx.Save(&job.Stats).Error; err != nil {
 				return err
 			}
diff --git a/event-bus.go b/event-bus.go
index 8715b4e..b05f0a4 100644
--- a/event-bus.go
+++ b/event-bus.go
@@ -132,6 +132,7 @@ func (eb *EventBus) Publish(name EventName, data any) {
 
 				defer func() {
 					if r := recover(); r != nil {
+						Error("EventBus: publish panic: %v", r)
 						eb.SetPublishError(msgID, fmt.Errorf("publish panic: %v", r))
 					}
 				}()
-- 
GitLab