JCS-pub/client/internal/mount/vfs/fuse_package.go

112 lines
2.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package vfs
import (
"context"
"os"
"time"
"gitlink.org.cn/cloudream/jcs-pub/client/internal/mount/fuse"
"gitlink.org.cn/cloudream/jcs-pub/client/internal/mount/vfs/cache"
)
type FusePackage struct {
vfs *Vfs
bktName string
pkgName string
modTime time.Time
mode os.FileMode
}
func newPackageFromCache(cache cache.CacheEntryInfo, vfs *Vfs) fuse.FsDir {
pathComps := cache.PathComps
return &FusePackage{
vfs: vfs,
bktName: pathComps[0],
pkgName: pathComps[1],
modTime: cache.ModTime,
mode: cache.Mode,
}
}
func (r *FusePackage) PathComps() []string {
return []string{r.bktName, r.pkgName}
}
func (r *FusePackage) Name() string {
return r.pkgName
}
func (r *FusePackage) Size() int64 {
return 0
}
func (r *FusePackage) Mode() os.FileMode {
return os.ModeDir | r.mode
}
func (r *FusePackage) ModTime() time.Time {
return r.modTime
}
func (r *FusePackage) IsDir() bool {
return true
}
func (r *FusePackage) SetModTime(time time.Time) error {
dir := r.loadCacheDir()
if dir == nil {
return fuse.ErrNotExists
}
return dir.SetModTime(time)
}
// 如果不存在应该返回ErrNotExists
func (r *FusePackage) Child(ctx context.Context, name string) (fuse.FsEntry, error) {
return child(r.vfs, ctx, r, name)
}
func (r *FusePackage) Children(ctx context.Context) ([]fuse.FsEntry, error) {
return listChildren(r.vfs, ctx, r)
}
func (r *FusePackage) ReadChildren() (fuse.DirReader, error) {
ens, err := listChildren(r.vfs, context.Background(), r)
if err != nil {
return nil, err
}
return newFuseDirReader(ens), nil
}
func (r *FusePackage) NewDir(ctx context.Context, name string) (fuse.FsDir, error) {
return newDir(r.vfs, ctx, name, r)
}
func (r *FusePackage) NewFile(ctx context.Context, name string, flags uint32) (fuse.FileHandle, uint32, error) {
return newFile(r.vfs, ctx, name, r, flags)
}
func (r *FusePackage) RemoveChild(ctx context.Context, name string) error {
return removeChild(r.vfs, ctx, name, r)
}
func (r *FusePackage) MoveChild(ctx context.Context, oldName string, newName string, newParent fuse.FsDir) error {
return moveChild(r.vfs, ctx, oldName, r, newName, newParent.(FuseNode))
}
func (r *FusePackage) loadCacheDir() *cache.CacheDir {
var createOpt *cache.CreateDirOption
pkg, err := r.vfs.db.Package().GetByFullName(r.vfs.db.DefCtx(), r.bktName, r.pkgName)
if err == nil {
createOpt = &cache.CreateDirOption{
ModTime: pkg.CreateTime,
}
}
return r.vfs.cache.LoadDir([]string{r.bktName, r.pkgName}, createOpt)
}
var _ fuse.FsDir = (*FusePackage)(nil)
var _ FuseNode = (*FusePackage)(nil)