|
|
@@ -16,6 +16,7 @@ type CachingHandler struct {
|
|
|
strings map[string]string
|
|
|
uint64s map[string]uint64
|
|
|
bools map[string]bool
|
|
|
+ strArrs map[string][]string
|
|
|
notFound map[string]bool
|
|
|
handler Handler
|
|
|
}
|
|
|
@@ -27,6 +28,7 @@ func NewCachingHandler(handler Handler) *CachingHandler {
|
|
|
strings: make(map[string]string),
|
|
|
uint64s: make(map[string]uint64),
|
|
|
bools: make(map[string]bool),
|
|
|
+ strArrs: make(map[string][]string),
|
|
|
notFound: make(map[string]bool),
|
|
|
}
|
|
|
}
|
|
|
@@ -96,3 +98,25 @@ func (ch *CachingHandler) ReadBoolean(key string) (bool, error) {
|
|
|
ch.bools[key] = val
|
|
|
return val, nil
|
|
|
}
|
|
|
+
|
|
|
+// ReadBoolean reads the policy settings boolean value given the key.
|
|
|
+// ReadBoolean first reads from the handler's cache before resorting to using the handler.
|
|
|
+func (ch *CachingHandler) ReadStringArray(key string) ([]string, error) {
|
|
|
+ ch.mu.Lock()
|
|
|
+ defer ch.mu.Unlock()
|
|
|
+ if val, ok := ch.strArrs[key]; ok {
|
|
|
+ return val, nil
|
|
|
+ }
|
|
|
+ if notFound := ch.notFound[key]; notFound {
|
|
|
+ return nil, ErrNoSuchKey
|
|
|
+ }
|
|
|
+ val, err := ch.handler.ReadStringArray(key)
|
|
|
+ if errors.Is(err, ErrNoSuchKey) {
|
|
|
+ ch.notFound[key] = true
|
|
|
+ return nil, err
|
|
|
+ } else if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ ch.strArrs[key] = val
|
|
|
+ return val, nil
|
|
|
+}
|