rclone/cmd/serve/restic/cache.go

78 lines
1.4 KiB
Go
Raw Normal View History

package restic
import (
"strings"
"sync"
"github.com/rclone/rclone/fs"
)
// cache implements a simple object cache
type cache struct {
mu sync.RWMutex // protects the cache
items map[string]fs.Object // cache of objects
cacheObjects bool // whether we are actually caching
}
// create a new cache
func newCache(cacheObjects bool) *cache {
return &cache{
items: map[string]fs.Object{},
cacheObjects: cacheObjects,
}
}
// find the object at remote or return nil
func (c *cache) find(remote string) fs.Object {
if !c.cacheObjects {
return nil
}
c.mu.RLock()
o := c.items[remote]
c.mu.RUnlock()
return o
}
// add the object to the cache
func (c *cache) add(remote string, o fs.Object) {
if !c.cacheObjects {
return
}
c.mu.Lock()
c.items[remote] = o
c.mu.Unlock()
}
// remove the object from the cache
func (c *cache) remove(remote string) {
if !c.cacheObjects {
return
}
c.mu.Lock()
delete(c.items, remote)
c.mu.Unlock()
}
// remove all the items with prefix from the cache
func (c *cache) removePrefix(prefix string) {
if !c.cacheObjects {
return
}
c.mu.Lock()
defer c.mu.Unlock()
if !strings.HasSuffix(prefix, "/") {
prefix += "/"
}
if prefix == "/" {
c.items = map[string]fs.Object{}
return
}
for key := range c.items {
if strings.HasPrefix(key, prefix) {
delete(c.items, key)
}
}
}