diff --git a/compose/repository/record.go b/compose/repository/record.go index cb4248086..3dce83a41 100644 --- a/compose/repository/record.go +++ b/compose/repository/record.go @@ -311,12 +311,16 @@ func (r record) DeleteValues(record *types.Record) error { func (r record) UpdateValues(recordID uint64, rvs types.RecordValueSet) (err error) { // Remove all records and prepare to be updated - // @todo be more selective and delete only removed values + // @todo be more selective and delete only removed and update/insert changed/new values if _, err = r.db().Exec("DELETE FROM compose_record_value WHERE record_id = ?", recordID); err != nil { return errors.Wrap(err, "could not remove record values") } err = rvs.Walk(func(value *types.RecordValue) error { + if value.DeletedAt != nil { + return nil + } + value.RecordID = recordID return r.db().Insert("compose_record_value", value) }) diff --git a/compose/service/record.go b/compose/service/record.go index 3fdbbad34..c83d93c06 100644 --- a/compose/service/record.go +++ b/compose/service/record.go @@ -538,6 +538,8 @@ func (svc record) Update(upd *types.Record) (rec *types.Record, err error) { return } + upd.Values = upd.Values.GetClean() + // At this point we can return the value rec = upd diff --git a/compose/types/record_value.go b/compose/types/record_value.go index a555c5a4a..9b8ea6596 100644 --- a/compose/types/record_value.go +++ b/compose/types/record_value.go @@ -104,6 +104,9 @@ func (set RecordValueSet) Has(name string, place uint) bool { } func (set RecordValueSet) SetUpdatedFlag(updated bool) { + for i := range set { + set[i].updated = updated + } } func (set RecordValueSet) GetUpdated() (out RecordValueSet) { @@ -120,6 +123,24 @@ func (set RecordValueSet) GetUpdated() (out RecordValueSet) { return out } +func (set RecordValueSet) GetClean() (out RecordValueSet) { + out = make([]*RecordValue, 0, len(set)) + for s := range set { + if set[s].DeletedAt != nil { + continue + } + + out = append(out, &RecordValue{ + Name: set[s].Name, + Value: set[s].Value, + Ref: set[s].Ref, + Place: set[s].Place, + }) + } + + return out +} + // Merge merges old value set with new one and expects unchanged values to be in the new set // // This satisfies current requirements where record values are always