Skip to content

Commit 1b68cae

Browse files
authored
Merge pull request #110 from fastly/athomason/kvstore-delete
Implement KVStore delete method
2 parents 1a69131 + b29313d commit 1b68cae

File tree

6 files changed

+96
-1
lines changed

6 files changed

+96
-1
lines changed

.github/workflows/integration-tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name: Integration Tests
22
on: [push]
33
env:
4-
VICEROY_VERSION: 0.9.3
4+
VICEROY_VERSION: 0.9.6
55
jobs:
66
integration-tests-tinygo:
77
strategy:

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
## 1.3.1 (2024-04-25)
2+
3+
### Added
4+
5+
- `kvstore`: add Store.Delete method
6+
7+
### Changed
8+
9+
- Update Viceroy requirement to 0.9.6
10+
111
## 1.3.0 (2024-02-21)
212

313
### Added

integration_tests/kvstore/main_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,20 @@ func TestKVStore(t *testing.T) {
3939
if got, want := animal.String(), "cat"; got != want {
4040
t.Errorf("Insert: got %q, want %q", got, want)
4141
}
42+
43+
if err = store.Delete("animal"); err != nil {
44+
t.Fatal(err)
45+
}
46+
47+
_, err = store.Lookup("animal")
48+
if err == nil {
49+
t.Error("expected Lookup failure")
50+
}
51+
52+
/*
53+
// TODO(athomason) address inconsistent behavior in viceroy and production
54+
if err = store.Delete("nonexistent"); err != nil {
55+
t.Fatal(err)
56+
}
57+
*/
4258
}

internal/abi/fastly/hostcalls_guest.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2606,6 +2606,52 @@ func (o *KVStore) Insert(key string, value io.Reader) error {
26062606
return nil
26072607
}
26082608

2609+
// witx:
2610+
//
2611+
// (@interface func (export "delete_async")
2612+
// (param $store $object_store_handle)
2613+
// (param $key string)
2614+
// (param $pending_handle_out (@witx pointer $pending_kv_delete_handle))
2615+
// (result $err (expected (error $fastly_status)))
2616+
// )
2617+
2618+
//go:wasmimport fastly_object_store delete_async
2619+
//go:noescape
2620+
func fastlyObjectStoreDeleteAsync(
2621+
h objectStoreHandle,
2622+
keyData prim.Pointer[prim.U8], keyLen prim.Usize,
2623+
pendingReq prim.Pointer[pendingRequestHandle],
2624+
) FastlyStatus
2625+
2626+
// witx:
2627+
//
2628+
// (@interface func (export "pending_delete_wait")
2629+
// (param $pending_handle $pending_kv_delete_handle)
2630+
// (result $err (expected (error $fastly_status)))
2631+
// )
2632+
2633+
//go:wasmimport fastly_object_store pending_delete_wait
2634+
//go:noescape
2635+
func fastlyObjectStorePendingDeleteWait(
2636+
pendingReq pendingRequestHandle,
2637+
) FastlyStatus
2638+
2639+
// Delete removes a key from the kv store.
2640+
func (o *KVStore) Delete(key string) error {
2641+
keyBuffer := prim.NewReadBufferFromString(key).Wstring()
2642+
2643+
var handle pendingRequestHandle
2644+
if err := fastlyObjectStoreDeleteAsync(
2645+
o.h,
2646+
keyBuffer.Data, keyBuffer.Len,
2647+
prim.ToPointer(&handle),
2648+
).toError(); err != nil {
2649+
return err
2650+
}
2651+
2652+
return fastlyObjectStorePendingDeleteWait(handle).toError()
2653+
}
2654+
26092655
// SecretStore represents a Fastly secret store, a collection of
26102656
// key/value pairs for storing sensitive data.
26112657
type SecretStore struct {

internal/abi/fastly/hostcalls_noguest.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,10 @@ func (o *KVStore) Insert(key string, value io.Reader) error {
319319
return fmt.Errorf("not implemented")
320320
}
321321

322+
func (o *KVStore) Delete(key string) error {
323+
return fmt.Errorf("not implemented")
324+
}
325+
322326
type (
323327
SecretStore struct{}
324328
Secret struct{}

kvstore/kvstore.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,22 @@ func (s *Store) Insert(key string, value io.Reader) error {
129129
}
130130
return nil
131131
}
132+
133+
// Delete removes a key from the associated KV store.
134+
func (s *Store) Delete(key string) error {
135+
err := s.kvstore.Delete(key)
136+
if err != nil {
137+
status, ok := fastly.IsFastlyError(err)
138+
switch {
139+
case ok && status == fastly.FastlyStatusNone:
140+
return ErrKeyNotFound
141+
case ok && status == fastly.FastlyStatusInval:
142+
return ErrInvalidKey
143+
case ok:
144+
return fmt.Errorf("%w (%s)", ErrUnexpected, status)
145+
default:
146+
return err
147+
}
148+
}
149+
return nil
150+
}

0 commit comments

Comments
 (0)