From be00bcf0b34d037d77360efc3e4a2c924fea1ebf Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Thu, 12 Sep 2024 13:19:34 +0200 Subject: [PATCH] Entity: Return the error if an update statement has failed #4504 #4505 Signed-off-by: Michael Mayer --- internal/entity/entity_update.go | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/internal/entity/entity_update.go b/internal/entity/entity_update.go index 7112f8169..6674765fa 100644 --- a/internal/entity/entity_update.go +++ b/internal/entity/entity_update.go @@ -4,12 +4,13 @@ import ( "fmt" ) -// Update updates an existing record in the database. +// Update updates the values of an existing database record. func Update(m interface{}, keyNames ...string) (err error) { - // Unscoped so soft-deleted records can still be updated. + // Use an unscoped *gorm.DB connection, so that + // soft-deleted database records can also be updated. db := UnscopedDb() - // New entity? + // Return if the record has not been created yet. if db.NewRecord(m) { return fmt.Errorf("new record") } @@ -17,20 +18,23 @@ func Update(m interface{}, keyNames ...string) (err error) { // Extract interface slice with all values including zero. values, keys, err := ModelValues(m, keyNames...) - // Has keys and values? + // Check if the number of keys matches the number of values. if err != nil { return err } else if len(keys) != len(keyNames) { return fmt.Errorf("record keys missing") } - // Update values. + // Execute update statement. result := db.Model(m).Updates(values) - // Successful? - if result.Error != nil { + // Return an error if the update has failed. + if err = result.Error; err != nil { return err - } else if result.RowsAffected > 1 { + } + + // Verify number of updated rows. + if result.RowsAffected > 1 { log.Debugf("entity: updated statement affected more than one record - you may have found a bug") return nil } else if result.RowsAffected == 1 { @@ -39,5 +43,5 @@ func Update(m interface{}, keyNames ...string) (err error) { return fmt.Errorf("record not found") } - return err + return nil }