diff options
Diffstat (limited to 'state/pebble_state.go')
| -rw-r--r-- | state/pebble_state.go | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/state/pebble_state.go b/state/pebble_state.go new file mode 100644 index 0000000..3eeaa05 --- /dev/null +++ b/state/pebble_state.go | |||
| @@ -0,0 +1,54 @@ | |||
| 1 | package state | ||
| 2 | |||
| 3 | import ( | ||
| 4 | "context" | ||
| 5 | "encoding/json" | ||
| 6 | "errors" | ||
| 7 | "flux/core" | ||
| 8 | |||
| 9 | "github.com/cockroachdb/pebble/v2" | ||
| 10 | ) | ||
| 11 | |||
| 12 | type pebbleStateValue struct { | ||
| 13 | backend *PebbleStateBackend | ||
| 14 | stateID uint8 | ||
| 15 | } | ||
| 16 | |||
| 17 | func (p *pebbleStateValue) Update(ctx context.Context, newVal any) (any, error) { | ||
| 18 | key := p.backend.deserialize(p.stateID) | ||
| 19 | // convert newVal to []byte raw | ||
| 20 | v, err := json.Marshal(newVal) | ||
| 21 | if err != nil { | ||
| 22 | return nil, err | ||
| 23 | } | ||
| 24 | |||
| 25 | err = p.backend.db.Set(key, v, pebble.NoSync) | ||
| 26 | if err != nil { | ||
| 27 | return nil, err | ||
| 28 | } | ||
| 29 | |||
| 30 | return newVal, nil | ||
| 31 | } | ||
| 32 | |||
| 33 | func (p *pebbleStateValue) Value(ctx context.Context) (any, error) { | ||
| 34 | key := p.backend.deserialize(p.stateID) | ||
| 35 | v, closer, err := p.backend.db.Get(key) | ||
| 36 | if err != nil { | ||
| 37 | if errors.Is(err, pebble.ErrNotFound) { | ||
| 38 | return nil, nil | ||
| 39 | } | ||
| 40 | return nil, err | ||
| 41 | } | ||
| 42 | |||
| 43 | defer closer.Close() | ||
| 44 | |||
| 45 | res := core.GetBuffer(len(v)) | ||
| 46 | copy(res, v) | ||
| 47 | return v, nil | ||
| 48 | } | ||
| 49 | |||
| 50 | func (p *pebbleStateValue) Clear(ctx context.Context) error { | ||
| 51 | key := p.backend.deserialize(p.stateID) | ||
| 52 | |||
| 53 | return p.backend.db.Delete(key, pebble.NoSync) | ||
| 54 | } | ||
