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
import (
"io/fs"
"os"
"path/filepath"
"strings"
"sync"
"github.com/88250/gulu"
"github.com/88250/lute/ast"
"github.com/siyuan-note/eventbus"
@ -25,11 +31,48 @@ import (
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/task"
"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() {
task.AppendTask(task.AssetContentDatabaseIndexFull, fullReindexAssetContent)
return
@ -39,8 +82,7 @@ func fullReindexAssetContent() {
util.PushMsg(Conf.Language(216), 7*1000)
sql.InitAssetContentDatabase(true)
assetsSearch := NewAssetsSearcher()
assetsSearch.Index()
assetContentSearcher.FullIndex()
return
}
@ -59,12 +101,13 @@ var (
)
type AssetsSearcher struct {
AssetsDir string
Parsers map[string]AssetParser
Parsers map[string]AssetParser
lock *sync.Mutex
}
func (searcher *AssetsSearcher) Index() {
assetsDir := searcher.AssetsDir
func (searcher *AssetsSearcher) FullIndex() {
assetsDir := util.GetDataAssetsAbsPath()
if !gulu.File.IsDir(assetsDir) {
return
}
@ -116,10 +159,11 @@ func (searcher *AssetsSearcher) Index() {
func NewAssetsSearcher() *AssetsSearcher {
return &AssetsSearcher{
AssetsDir: util.GetDataAssetsAbsPath(),
Parsers: map[string]AssetParser{
".txt": &TxtAssetParser{},
},
lock: &sync.Mutex{},
}
}

View file

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

View file

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

View file

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