mirror of
https://github.com/rclone/rclone.git
synced 2024-12-21 11:06:55 +08:00
52443c2444
Co-authored-by: Nick Craig-Wood <nick@craig-wood.com>
78 lines
1.4 KiB
Go
78 lines
1.4 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|