From 54ae7e6d9bf3ce85f4be2816e82e373d1da78da0 Mon Sep 17 00:00:00 2001 From: Seven <53081179+Seven66677731@users.noreply.github.com> Date: Thu, 31 Jul 2025 11:20:02 +0800 Subject: [PATCH] feat(115_open): Add GetObjInfo to accelerate getting link (#888) * feat(115_open): Add GetObjInfo to accelerate getting link * feat(fs): use cache directly when cache exist --- drivers/115_open/driver.go | 17 +++++++++++++++++ go.mod | 2 +- go.sum | 2 ++ internal/driver/driver.go | 5 +++++ internal/op/fs.go | 29 ++++++++++++++++++++++++++--- 5 files changed, 51 insertions(+), 4 deletions(-) diff --git a/drivers/115_open/driver.go b/drivers/115_open/driver.go index 0f343042..0045ab34 100644 --- a/drivers/115_open/driver.go +++ b/drivers/115_open/driver.go @@ -131,6 +131,23 @@ func (d *Open115) Link(ctx context.Context, file model.Obj, args model.LinkArgs) }, nil } +func (d *Open115) GetObjInfo(ctx context.Context, path string) (model.Obj, error) { + if err := d.WaitLimit(ctx); err != nil { + return nil, err + } + resp, err := d.client.GetFolderInfoByPath(ctx, path) + if err != nil { + return nil, err + } + return &Obj{ + Fid: resp.FileID, + Fn: resp.FileName, + Fc: resp.FileCategory, + Sha1: resp.Sha1, + Pc: resp.PickCode, + }, nil +} + func (d *Open115) MakeDir(ctx context.Context, parentDir model.Obj, dirName string) (model.Obj, error) { if err := d.WaitLimit(ctx); err != nil { return nil, err diff --git a/go.mod b/go.mod index 9ba146e5..42eec980 100644 --- a/go.mod +++ b/go.mod @@ -98,7 +98,7 @@ require ( ) require ( - github.com/OpenListTeam/115-sdk-go v0.2.1 + github.com/OpenListTeam/115-sdk-go v0.2.2 github.com/STARRY-S/zip v0.2.1 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/blevesearch/go-faiss v1.0.25 // indirect diff --git a/go.sum b/go.sum index d00764fd..47cfaa7d 100644 --- a/go.sum +++ b/go.sum @@ -46,6 +46,8 @@ github.com/OpenListTeam/115-sdk-go v0.2.0 h1:qNEYpGQg++INLFXYzVW94uGFzCKAIoJJx19 github.com/OpenListTeam/115-sdk-go v0.2.0/go.mod h1:cfvitk2lwe6036iNi2h+iNxwxWDifKZsSvNtrur5BqU= github.com/OpenListTeam/115-sdk-go v0.2.1 h1:tzRUqdktS3h4o69+CXRDVwL0jYN7ccuX8TZWmLxkBGo= github.com/OpenListTeam/115-sdk-go v0.2.1/go.mod h1:cfvitk2lwe6036iNi2h+iNxwxWDifKZsSvNtrur5BqU= +github.com/OpenListTeam/115-sdk-go v0.2.2 h1:JCrGHqQjBX3laOA6Hw4CuBovSg7g+FC5s0LEAYsRciU= +github.com/OpenListTeam/115-sdk-go v0.2.2/go.mod h1:cfvitk2lwe6036iNi2h+iNxwxWDifKZsSvNtrur5BqU= github.com/OpenListTeam/go-cache v0.1.0 h1:eV2+FCP+rt+E4OCJqLUW7wGccWZNJMV0NNkh+uChbAI= github.com/OpenListTeam/go-cache v0.1.0/go.mod h1:AHWjKhNK3LE4rorVdKyEALDHoeMnP8SjiNyfVlB+Pz4= github.com/OpenListTeam/gsync v0.1.0 h1:ywzGybOvA3lW8K1BUjKZ2IUlT2FSlzPO4DOazfYXjcs= diff --git a/internal/driver/driver.go b/internal/driver/driver.go index 5e5ffb91..2884b543 100644 --- a/internal/driver/driver.go +++ b/internal/driver/driver.go @@ -47,6 +47,11 @@ type Getter interface { Get(ctx context.Context, path string) (model.Obj, error) } +type GetObjInfo interface { + // GetObjInfo get file info by path + GetObjInfo(ctx context.Context, path string) (model.Obj, error) +} + //type Writer interface { // Mkdir // Move diff --git a/internal/op/fs.go b/internal/op/fs.go index f3a9dcc0..1637da6c 100644 --- a/internal/op/fs.go +++ b/internal/op/fs.go @@ -4,6 +4,7 @@ import ( "context" stdpath "path" "slices" + "strings" "time" "github.com/OpenListTeam/OpenList/v4/internal/driver" @@ -255,9 +256,31 @@ func Link(ctx context.Context, storage driver.Driver, path string, args model.Li if storage.Config().CheckStatus && storage.GetStorage().Status != WORK { return nil, nil, errors.Errorf("storage not init: %s", storage.GetStorage().Status) } - file, err := GetUnwrap(ctx, storage, path) - if err != nil { - return nil, nil, errors.WithMessage(err, "failed to get file") + var ( + file model.Obj + err error + ) + // use cache directly + dir, name := stdpath.Split(stdpath.Join(storage.GetStorage().MountPath, path)) + if cacheFiles, ok := listCache.Get(strings.TrimSuffix(dir, "/")); ok { + for _, f := range cacheFiles { + if f.GetName() == name { + file = model.UnwrapObj(f) + break + } + } + } else { + if g, ok := storage.(driver.GetObjInfo); ok { + file, err = g.GetObjInfo(ctx, path) + } else { + file, err = GetUnwrap(ctx, storage, path) + } + } + if file == nil { + if err != nil { + return nil, nil, errors.WithMessage(err, "failed to get file") + } + return nil, nil, errors.WithStack(errs.ObjectNotFound) } if file.IsDir() { return nil, nil, errors.WithStack(errs.NotFile)