mirror of
https://github.com/kovidgoyal/kitty
synced 2026-06-08 22:28:24 +02:00
Improve API of disk cache
Allow getting all keys and also return get result for added keys
This commit is contained in:
@@ -52,7 +52,7 @@ func (dc *DiskCache) Remove(key string) (err error) {
|
||||
return dc.remove(key)
|
||||
}
|
||||
|
||||
func (dc *DiskCache) Add(key string, items map[string][]byte) (err error) {
|
||||
func (dc *DiskCache) Add(key string, items map[string][]byte) (ans map[string]string, err error) {
|
||||
dc.lock()
|
||||
defer dc.unlock()
|
||||
return dc.add(key, items)
|
||||
|
||||
@@ -177,24 +177,40 @@ func (dc *DiskCache) update_last_used(key string) {
|
||||
|
||||
}
|
||||
|
||||
func (dc *DiskCache) get(key string, items []string) map[string]string {
|
||||
ans := make(map[string]string, len(items))
|
||||
base := dc.folder_for_key(key)
|
||||
if s, err := os.Stat(base); err != nil || !s.IsDir() {
|
||||
return ans
|
||||
func (dc *DiskCache) export_to_get_dir(key, path string) (string, error) {
|
||||
dest := filepath.Join(dc.get_dir, key+"-"+filepath.Base(path))
|
||||
if err := os.Link(path, dest); err != nil {
|
||||
os.Remove(dest)
|
||||
if err := os.Link(path, dest); err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
return dest, nil
|
||||
|
||||
}
|
||||
|
||||
func (dc *DiskCache) get(key string, items []string) map[string]string {
|
||||
base := dc.folder_for_key(key)
|
||||
if len(items) == 0 {
|
||||
if entries, err := os.ReadDir(base); err != nil {
|
||||
return make(map[string]string)
|
||||
} else {
|
||||
for _, e := range entries {
|
||||
items = append(items, e.Name())
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if s, err := os.Stat(base); err != nil || !s.IsDir() {
|
||||
return make(map[string]string)
|
||||
}
|
||||
}
|
||||
ans := make(map[string]string, len(items))
|
||||
for _, x := range items {
|
||||
p := filepath.Join(base, x)
|
||||
if s, err := os.Stat(p); err != nil || s.IsDir() {
|
||||
continue
|
||||
}
|
||||
dest := filepath.Join(dc.get_dir, key+"-"+x)
|
||||
if err := os.Link(p, dest); err != nil {
|
||||
os.Remove(dest)
|
||||
if err := os.Link(p, dest); err != nil {
|
||||
dest = ""
|
||||
}
|
||||
}
|
||||
dest, _ := dc.export_to_get_dir(key, p)
|
||||
if dest != "" {
|
||||
ans[x] = dest
|
||||
}
|
||||
@@ -269,13 +285,13 @@ func (dc *DiskCache) keys() (ans []string, err error) {
|
||||
return utils.Keys(dc.entry_map), nil
|
||||
}
|
||||
|
||||
func (dc *DiskCache) add(key string, items map[string][]byte) (err error) {
|
||||
func (dc *DiskCache) add(key string, items map[string][]byte) (ans map[string]string, err error) {
|
||||
if err = dc.ensure_entries(); err != nil {
|
||||
return
|
||||
}
|
||||
base := dc.folder_for_key(key)
|
||||
if err = os.MkdirAll(base, 0o700); err != nil {
|
||||
return err
|
||||
return
|
||||
}
|
||||
var changed int64
|
||||
defer func() {
|
||||
@@ -284,6 +300,7 @@ func (dc *DiskCache) add(key string, items map[string][]byte) (err error) {
|
||||
err = e
|
||||
}
|
||||
}()
|
||||
ans = make(map[string]string, len(items))
|
||||
for x, data := range items {
|
||||
p := filepath.Join(base, x)
|
||||
var before int64
|
||||
@@ -312,6 +329,11 @@ func (dc *DiskCache) add(key string, items map[string][]byte) (err error) {
|
||||
return
|
||||
}
|
||||
changed += int64(len(data)) - before
|
||||
if dest, err := dc.export_to_get_dir(key, p); err != nil {
|
||||
return ans, err
|
||||
} else {
|
||||
ans[x] = dest
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user