This commit is contained in:
Daniel 2023-08-04 12:29:32 +08:00
parent 7d992ce175
commit afb698d1fe
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
4 changed files with 61 additions and 11 deletions

View file

@ -17,6 +17,12 @@
package model package model
import ( import (
"io/fs"
"os"
"path/filepath"
"strings"
"sync"
"github.com/88250/gulu" "github.com/88250/gulu"
"github.com/88250/lute/ast" "github.com/88250/lute/ast"
"github.com/siyuan-note/eventbus" "github.com/siyuan-note/eventbus"
@ -25,11 +31,48 @@ import (
"github.com/siyuan-note/siyuan/kernel/sql" "github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/task" "github.com/siyuan-note/siyuan/kernel/task"
"github.com/siyuan-note/siyuan/kernel/util" "github.com/siyuan-note/siyuan/kernel/util"
"io/fs"
"path/filepath"
"strings"
) )
var assetContentSearcher = NewAssetsSearcher()
func IndexAssetContent(absPath string) {
assetsDir := util.GetDataAssetsAbsPath()
ext := strings.ToLower(filepath.Ext(absPath))
parser, found := assetContentSearcher.Parsers[ext]
if !found {
return
}
result := parser.Parse(absPath)
if nil == result {
return
}
info, err := os.Stat(absPath)
if nil != err {
logging.LogErrorf("stat [%s] failed: %s", absPath, err)
return
}
p := "assets" + filepath.ToSlash(strings.TrimPrefix(absPath, assetsDir))
assetContents := []*sql.AssetContent{
{
ID: ast.NewNodeID(),
Name: filepath.Base(p),
Ext: filepath.Ext(p),
Path: p,
Size: info.Size(),
Updated: info.ModTime().Unix(),
Content: result.Content,
},
}
sql.DeleteAssetContentsByPathQueue(p)
sql.IndexAssetContentsQueue(assetContents)
}
func ReindexAssetContent() { func ReindexAssetContent() {
task.AppendTask(task.AssetContentDatabaseIndexFull, fullReindexAssetContent) task.AppendTask(task.AssetContentDatabaseIndexFull, fullReindexAssetContent)
return return
@ -39,8 +82,7 @@ func fullReindexAssetContent() {
util.PushMsg(Conf.Language(216), 7*1000) util.PushMsg(Conf.Language(216), 7*1000)
sql.InitAssetContentDatabase(true) sql.InitAssetContentDatabase(true)
assetsSearch := NewAssetsSearcher() assetContentSearcher.FullIndex()
assetsSearch.Index()
return return
} }
@ -59,12 +101,13 @@ var (
) )
type AssetsSearcher struct { type AssetsSearcher struct {
AssetsDir string
Parsers map[string]AssetParser Parsers map[string]AssetParser
lock *sync.Mutex
} }
func (searcher *AssetsSearcher) Index() { func (searcher *AssetsSearcher) FullIndex() {
assetsDir := searcher.AssetsDir assetsDir := util.GetDataAssetsAbsPath()
if !gulu.File.IsDir(assetsDir) { if !gulu.File.IsDir(assetsDir) {
return return
} }
@ -116,10 +159,11 @@ func (searcher *AssetsSearcher) Index() {
func NewAssetsSearcher() *AssetsSearcher { func NewAssetsSearcher() *AssetsSearcher {
return &AssetsSearcher{ return &AssetsSearcher{
AssetsDir: util.GetDataAssetsAbsPath(),
Parsers: map[string]AssetParser{ Parsers: map[string]AssetParser{
".txt": &TxtAssetParser{}, ".txt": &TxtAssetParser{},
}, },
lock: &sync.Mutex{},
} }
} }

View file

@ -87,6 +87,9 @@ func watchAssets() {
// 重新缓存资源文件,以便使用 /资源 搜索 // 重新缓存资源文件,以便使用 /资源 搜索
go cache.LoadAssets() go cache.LoadAssets()
// 索引资源文件内容
IndexAssetContent(lastEvent.Name)
} }
} }
}() }()

View file

@ -59,6 +59,9 @@ func watchAssets() {
// 重新缓存资源文件,以便使用 /资源 搜索 // 重新缓存资源文件,以便使用 /资源 搜索
go cache.LoadAssets() go cache.LoadAssets()
// 索引资源文件内容
IndexAssetContent(event.Path)
case err, ok := <-assetsWatcher.Error: case err, ok := <-assetsWatcher.Error:
if !ok { if !ok {
return return

View file

@ -111,7 +111,7 @@ func execAssetContentOp(op *assetContentDBQueueOperation, tx *sql.Tx, context ma
switch op.action { switch op.action {
case "index": case "index":
err = insertAssetContents(tx, op.assetContents, context) err = insertAssetContents(tx, op.assetContents, context)
case "delete": case "deletePath":
err = deleteAssetContentsByPath(tx, op.path, context) err = deleteAssetContentsByPath(tx, op.path, context)
default: default:
msg := fmt.Sprintf("unknown asset content operation [%s]", op.action) msg := fmt.Sprintf("unknown asset content operation [%s]", op.action)