2019-05-23 19:26:16 +08:00
|
|
|
// Package cache implements the Fs cache
|
|
|
|
package cache
|
|
|
|
|
|
|
|
import (
|
2019-07-29 01:47:38 +08:00
|
|
|
"github.com/rclone/rclone/fs"
|
2019-08-01 05:19:07 +08:00
|
|
|
"github.com/rclone/rclone/lib/cache"
|
2019-05-23 19:26:16 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
2019-08-01 05:19:07 +08:00
|
|
|
c = cache.New()
|
2019-05-23 19:26:16 +08:00
|
|
|
)
|
|
|
|
|
2019-08-01 05:19:07 +08:00
|
|
|
// GetFn gets a fs.Fs named fsString either from the cache or creates
|
|
|
|
// it afresh with the create function
|
|
|
|
func GetFn(fsString string, create func(fsString string) (fs.Fs, error)) (f fs.Fs, err error) {
|
2019-08-10 05:19:41 +08:00
|
|
|
value, err := c.Get(fsString, func(fsString string) (f interface{}, ok bool, err error) {
|
|
|
|
f, err = create(fsString)
|
2019-08-01 05:19:07 +08:00
|
|
|
ok = err == nil || err == fs.ErrorIsFile
|
|
|
|
return f, ok, err
|
|
|
|
})
|
2019-08-10 05:19:41 +08:00
|
|
|
if err != nil && err != fs.ErrorIsFile {
|
2019-08-01 05:19:07 +08:00
|
|
|
return nil, err
|
|
|
|
}
|
2019-08-10 05:19:41 +08:00
|
|
|
return value.(fs.Fs), err
|
2019-05-23 19:26:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Get gets a fs.Fs named fsString either from the cache or creates it afresh
|
|
|
|
func Get(fsString string) (f fs.Fs, err error) {
|
2019-08-01 05:19:07 +08:00
|
|
|
return GetFn(fsString, fs.NewFs)
|
2019-05-23 19:26:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Put puts an fs.Fs named fsString into the cache
|
|
|
|
func Put(fsString string, f fs.Fs) {
|
2019-08-01 05:19:07 +08:00
|
|
|
c.Put(fsString, f)
|
2019-05-23 19:26:16 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Clear removes everything from the cahce
|
|
|
|
func Clear() {
|
2019-08-01 05:19:07 +08:00
|
|
|
c.Clear()
|
2019-05-23 19:26:16 +08:00
|
|
|
}
|