Skip to content

Commit 52b35c2

Browse files
committed
Add Keys() and DeleteKeys()
1 parent b1f70b7 commit 52b35c2

File tree

4 files changed

+60
-4
lines changed

4 files changed

+60
-4
lines changed

autocertcache/cache.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ package autocertcache
2626
import (
2727
"context"
2828
"encoding/base64"
29+
"sort"
2930

3031
"github.com/c2FmZQ/storage"
3132
"golang.org/x/crypto/acme/autocert"
@@ -97,3 +98,35 @@ func (c *Cache) Delete(_ context.Context, key string) error {
9798
delete(cc.Entries, key)
9899
return commit(true, nil)
99100
}
101+
102+
// DeleteKeys deletes a list of cached entries.
103+
func (c *Cache) DeleteKeys(_ context.Context, keys []string) error {
104+
c.storage.Logger().Debugf("Cache.DeleteKeys(%q)", keys)
105+
var cc cacheContent
106+
commit, err := c.storage.OpenForUpdate(c.fileName, &cc)
107+
if err != nil {
108+
return err
109+
}
110+
if cc.Entries == nil {
111+
cc.Entries = make(map[string]string)
112+
}
113+
for _, key := range keys {
114+
delete(cc.Entries, key)
115+
}
116+
return commit(true, nil)
117+
}
118+
119+
// Keys returns all the cache keys.
120+
func (c *Cache) Keys(_ context.Context) ([]string, error) {
121+
c.storage.Logger().Debug("Cache.Keys()")
122+
var cc cacheContent
123+
if err := c.storage.ReadDataFile(c.fileName, &cc); err != nil {
124+
return nil, err
125+
}
126+
keys := make([]string, 0, len(cc.Entries))
127+
for k := range cc.Entries {
128+
keys = append(keys, k)
129+
}
130+
sort.Strings(keys)
131+
return keys, nil
132+
}

autocertcache/cache_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,34 @@ func TestCache(t *testing.T) {
4242
defer mk.Wipe()
4343
cache := autocertcache.New("autocert", storage.New(t.TempDir(), mk))
4444

45+
if v, err := cache.Keys(ctx); err != nil || len(v) != 0 {
46+
t.Errorf("cache.Keys() = %q, %v, want [], nil", v, err)
47+
}
4548
if v, err := cache.Get(ctx, "foo"); err != autocert.ErrCacheMiss || v != nil {
4649
t.Errorf("cache.Get(foo) = %v, %v, want nil, ErrCacheMiss", v, err)
4750
}
4851
if err := cache.Put(ctx, "foo", []byte("bar")); err != nil {
4952
t.Errorf("cache.Put(foo, bar) = %v", err)
5053
}
54+
if err := cache.Put(ctx, "bar", []byte("baz")); err != nil {
55+
t.Errorf("cache.Put(bar, baz) = %v", err)
56+
}
5157
if v, err := cache.Get(ctx, "foo"); err != nil || string(v) != "bar" {
5258
t.Errorf("cache.Get(foo) = %q, %v, want bar, nil", v, err)
5359
}
60+
if v, err := cache.Keys(ctx); err != nil || len(v) != 2 || v[0] != "bar" || v[1] != "foo" {
61+
t.Errorf("cache.Keys() = %q, %v, want [bar foo], nil", v, err)
62+
}
5463
if err := cache.Delete(ctx, "foo"); err != nil {
5564
t.Errorf("cache.Delete(foo) = %v", err)
5665
}
5766
if v, err := cache.Get(ctx, "foo"); err != autocert.ErrCacheMiss || v != nil {
5867
t.Errorf("cache.Get(foo) = %v, %v, want nil, ErrCacheMiss", v, err)
5968
}
69+
if err := cache.DeleteKeys(ctx, []string{"bar"}); err != nil {
70+
t.Errorf("cache.DeleteKeys([bar]) = %v", err)
71+
}
72+
if v, err := cache.Get(ctx, "bar"); err != autocert.ErrCacheMiss || v != nil {
73+
t.Errorf("cache.Get(bar) = %v, %v, want nil, ErrCacheMiss", v, err)
74+
}
6075
}

go.mod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ module github.com/c2FmZQ/storage
22

33
go 1.20
44

5-
require golang.org/x/crypto v0.14.0
5+
require golang.org/x/crypto v0.16.0
66

77
require (
8-
golang.org/x/net v0.17.0 // indirect
9-
golang.org/x/sys v0.13.0 // indirect
10-
golang.org/x/text v0.13.0 // indirect
8+
golang.org/x/net v0.19.0 // indirect
9+
golang.org/x/sys v0.15.0 // indirect
10+
golang.org/x/text v0.14.0 // indirect
1111
)

go.sum

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,23 @@ golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
22
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
33
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
44
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
5+
golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY=
6+
golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
57
golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
68
golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
79
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
810
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
11+
golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
12+
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
913
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
1014
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1115
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
1216
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
17+
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
18+
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
1319
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
1420
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
1521
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
1622
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
23+
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
24+
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=

0 commit comments

Comments
 (0)