mirror of
https://github.com/pomerium/pomerium.git
synced 2025-07-04 18:38:12 +02:00
storage/postgres: implement patch operation (#4656)
Implement the new Patch() method for the Postgres storage backend.
This commit is contained in:
parent
4f648e9ac1
commit
4842002ed7
4 changed files with 97 additions and 4 deletions
|
@ -10,6 +10,7 @@ import (
|
|||
|
||||
"github.com/cenkalti/backoff/v4"
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
"google.golang.org/protobuf/types/known/fieldmaskpb"
|
||||
"google.golang.org/protobuf/types/known/timestamppb"
|
||||
|
||||
"github.com/pomerium/pomerium/internal/log"
|
||||
|
@ -140,7 +141,7 @@ func (backend *Backend) Get(
|
|||
return nil, err
|
||||
}
|
||||
|
||||
return getRecord(ctx, conn, recordType, recordID)
|
||||
return getRecord(ctx, conn, recordType, recordID, lockModeNone)
|
||||
}
|
||||
|
||||
// GetOptions returns the options for the given record type.
|
||||
|
@ -239,6 +240,42 @@ func (backend *Backend) Put(
|
|||
return serverVersion, err
|
||||
}
|
||||
|
||||
// Patch updates specific fields of existing records in Postgres.
|
||||
func (backend *Backend) Patch(
|
||||
ctx context.Context,
|
||||
records []*databroker.Record,
|
||||
fields *fieldmaskpb.FieldMask,
|
||||
) (uint64, []*databroker.Record, error) {
|
||||
ctx, cancel := contextutil.Merge(ctx, backend.closeCtx)
|
||||
defer cancel()
|
||||
|
||||
serverVersion, pool, err := backend.init(ctx)
|
||||
if err != nil {
|
||||
return serverVersion, nil, err
|
||||
}
|
||||
|
||||
patchedRecords := make([]*databroker.Record, 0, len(records))
|
||||
|
||||
now := timestamppb.Now()
|
||||
|
||||
for _, record := range records {
|
||||
record = dup(record)
|
||||
record.ModifiedAt = now
|
||||
err := patchRecord(ctx, pool, record, fields)
|
||||
if storage.IsNotFound(err) {
|
||||
continue
|
||||
} else if err != nil {
|
||||
err = fmt.Errorf("storage/postgres: error patching record %q of type %q: %w",
|
||||
record.GetId(), record.GetType(), err)
|
||||
return serverVersion, patchedRecords, err
|
||||
}
|
||||
patchedRecords = append(patchedRecords, record)
|
||||
}
|
||||
|
||||
err = signalRecordChange(ctx, pool)
|
||||
return serverVersion, patchedRecords, err
|
||||
}
|
||||
|
||||
// SetOptions sets the options for the given record type.
|
||||
func (backend *Backend) SetOptions(
|
||||
ctx context.Context,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue