/
WholeFileCacheService.go
72 lines (62 loc) · 1.92 KB
/
WholeFileCacheService.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
* Copyright (C) 2024 Puter Technologies Inc.
*
* This file is part of puter-fuse.
*
* puter-fuse is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package engine
import (
"sync"
"github.com/HeyPuter/puter-fuse/services"
)
type WholeFileCacheService struct {
FileVer map[string]int
FileData map[string][]byte
rwmutex sync.RWMutex
services services.IServiceContainer
}
func (svc_cache *WholeFileCacheService) Init(services services.IServiceContainer) {
svc_cache.FileVer = map[string]int{}
svc_cache.FileData = map[string][]byte{}
svc_cache.services = services
}
func (svc_cache *WholeFileCacheService) GetFileData(path string) []byte {
svc_cache.rwmutex.RLock()
v, _ := svc_cache.FileData[path]
svc_cache.rwmutex.RUnlock()
return v
}
func (svc_cache *WholeFileCacheService) SetFileData(path string, data []byte) int {
var ver int
var exists bool
svc_cache.rwmutex.Lock()
if ver, exists = svc_cache.FileVer[path]; exists {
svc_cache.FileVer[path] = ver + 1
} else {
svc_cache.FileVer[path] = 1
}
svc_cache.FileData[path] = data
svc_cache.rwmutex.Unlock()
return ver
}
func (svc_cache *WholeFileCacheService) DeleteFileData(path string, ver int) {
svc_cache.rwmutex.Lock()
if svc_cache.FileVer[path] != ver {
svc_cache.rwmutex.Unlock()
return
}
delete(svc_cache.FileData, path)
svc_cache.rwmutex.Unlock()
}