From d964c2be59a73e6b21ce1a8031fe913588bddf66 Mon Sep 17 00:00:00 2001 From: Stefan Majewsky Date: Thu, 16 Apr 2026 21:18:04 +0200 Subject: add Store.Update() --- oblast.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'oblast.go') diff --git a/oblast.go b/oblast.go index 52c0cfd..42305e6 100644 --- a/oblast.go +++ b/oblast.go @@ -100,6 +100,7 @@ import ( "database/sql/driver" "fmt" "reflect" + "strings" ) var ( @@ -170,3 +171,21 @@ func MustNewStore[R any](dialect Dialect, opts ...PlanOption) Store[R] { } return store } + +// MissingRecordError is returned by [Store.Update] if one of the rows to be updated does not exist in the DB. +type MissingRecordError[R any] struct { + // The record that was provided to [Store.Update], + // but for which no row with the same primary key values could be located. + Record R + plan plan +} + +// Error implements the builtin/error interface. +func (e MissingRecordError[R]) Error() string { + keyDescs := make([]string, len(e.plan.PrimaryKeyColumnNames)) + v := reflect.ValueOf(e.Record) + for idx, columnName := range e.plan.PrimaryKeyColumnNames { + keyDescs[idx] = fmt.Sprintf("%s = %#v", columnName, v.FieldByIndex(e.plan.IndexByColumnName[columnName])) + } + return fmt.Sprintf("could not UPDATE record that does not exist in the database: %s", strings.Join(keyDescs, ", ")) +} -- cgit v1.2.3