From 6b8861d783bf6555d307357cbf9431f790b9cf78 Mon Sep 17 00:00:00 2001
From: Volker Schukai <volker.schukai@schukai.com>
Date: Wed, 13 Mar 2024 10:37:01 +0100
Subject: [PATCH] fix: add where statements and add error handling #45

---
 database-1_test.go | 12 ++++++++++++
 database-2_test.go |  2 ++
 database.go        | 17 ++++++++++++++---
 manager.go         | 10 +++++++++-
 4 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/database-1_test.go b/database-1_test.go
index f21d993..4c57ee3 100644
--- a/database-1_test.go
+++ b/database-1_test.go
@@ -20,6 +20,8 @@ func TestWriteToDB1(t *testing.T) {
 		t.Fatalf("a error occurred while opening the database: %v", err)
 	}
 
+	gormDB.Logger = gormDB.Logger.LogMode(4)
+
 	manager := &Manager{database: gormDB}
 	saver := NewDBSaver().SetManager(manager)
 
@@ -57,6 +59,16 @@ func TestWriteToDB1(t *testing.T) {
 
 	time.Sleep(1 * time.Second)
 
+	saver.Wait()
+
+	// check if stats are in database
+	var stats JobPersistence
+	err = gormDB.First(&stats, "id = ?", job.GetID()).Error
+	assert.Nil(t, err)
+
+	assert.Equal(t, job.GetID(), stats.ID)
+	assert.Equal(t, job.GetID(), stats.ID)
+
 	err = saver.Stop()
 	assert.Nil(t, err)
 
diff --git a/database-2_test.go b/database-2_test.go
index 45d84d2..5e5c624 100644
--- a/database-2_test.go
+++ b/database-2_test.go
@@ -20,6 +20,8 @@ func TestWriteToDB2(t *testing.T) {
 		t.Fatalf("a error occurred while opening the database: %v", err)
 	}
 
+	gormDB.Logger = gormDB.Logger.LogMode(4)
+
 	manager := &Manager{database: gormDB}
 	saver := NewDBSaver().SetManager(manager)
 
diff --git a/database.go b/database.go
index 58781fb..0408857 100644
--- a/database.go
+++ b/database.go
@@ -188,9 +188,9 @@ func CreateOrUpdateJob(job GenericJob, db *gorm.DB) error {
 			}
 		} else {
 
-			db.Unscoped().Model(&existingJob).Update("deleted_at", nil)
+			tx.Unscoped().Model(&existingJob).Update("deleted_at", nil)
 
-			tx.Model(&existingJob.Scheduler).Select(
+			tx.Model(&existingJob).Where("id = ?", existingJob.ID).Select(
 				[]string{
 					"type",
 					"interval",
@@ -215,7 +215,12 @@ func CreateOrUpdateJob(job GenericJob, db *gorm.DB) error {
 			}
 		}
 
-		tx.Model(&permJob.Stats).
+		if tx.Error != nil {
+			Trace("Error while updating job", "error", tx.Error)
+			return tx.Error
+		}
+
+		tx.Model(&permJob.Stats).Where("job_id = ?", permJob.GetID()).
 			Select(
 				[]string{
 					"run_count",
@@ -246,6 +251,10 @@ func CreateOrUpdateJob(job GenericJob, db *gorm.DB) error {
 
 }
 
+func (s *DBSaver) Wait() {
+	s.jobSaveProgress.Wait()
+}
+
 // Stop stops the DBSaver
 func (s *DBSaver) Stop() error {
 	s.mu.Lock()
@@ -282,12 +291,14 @@ func exponentialBackoff(retry int) time.Duration {
 
 // SaveJob saves a job to the database
 func (s *DBSaver) SaveJob(job GenericJob) error {
+	s.jobSaveProgress.Add(1)
 	s.mu.Lock()
 	defer func() {
 		if r := recover(); r != nil {
 			Error("Error while saving job", "error", r)
 		}
 		s.mu.Unlock()
+		s.jobSaveProgress.Done()
 	}()
 
 	if s.saveChannel == nil {
diff --git a/manager.go b/manager.go
index ea0d2c7..e30f6e9 100644
--- a/manager.go
+++ b/manager.go
@@ -501,7 +501,15 @@ func (m *Manager) Stop() error {
 	}
 
 	if m.dbSaver != nil {
-		m.dbSaver.Stop()
+		err = m.dbSaver.Stop()
+		if err != nil {
+			if wrappedErr == nil {
+				wrappedErr = fmt.Errorf("Error: ")
+			}
+
+			wrappedErr = fmt.Errorf("%w\n%s", wrappedErr, err.Error())
+		
+		}
 	}
 
 	return wrappedErr
-- 
GitLab