Переглянути джерело

:art: Remove asset content indexes when deleting asset files https://github.com/siyuan-note/siyuan/issues/9010

Daniel 1 рік тому
батько
коміт
2d61568fad

+ 8 - 1
kernel/model/asset_content.go

@@ -286,10 +286,16 @@ func buildAssetContentOrderBy(orderBy int) string {
 
 var assetContentSearcher = NewAssetsSearcher()
 
-func IndexAssetContent(absPath string) {
+func RemoveIndexAssetContent(absPath string) {
 	defer logging.Recover()
 
 	assetsDir := util.GetDataAssetsAbsPath()
+	p := "assets" + filepath.ToSlash(strings.TrimPrefix(absPath, assetsDir))
+	sql.DeleteAssetContentsByPathQueue(p)
+}
+
+func IndexAssetContent(absPath string) {
+	defer logging.Recover()
 
 	ext := filepath.Ext(absPath)
 	parser := assetContentSearcher.GetParser(ext)
@@ -308,6 +314,7 @@ func IndexAssetContent(absPath string) {
 		return
 	}
 
+	assetsDir := util.GetDataAssetsAbsPath()
 	p := "assets" + filepath.ToSlash(strings.TrimPrefix(absPath, assetsDir))
 
 	assetContents := []*sql.AssetContent{

+ 7 - 3
kernel/model/assets_watcher.go

@@ -75,8 +75,9 @@ func watchAssets() {
 				timer.Reset(time.Millisecond * 100)
 
 				if lastEvent.Op&fsnotify.Rename == fsnotify.Rename {
-					// 索引资源文件内容
 					IndexAssetContent(lastEvent.Name)
+				} else if lastEvent.Op&fsnotify.Remove == fsnotify.Remove {
+					RemoveIndexAssetContent(lastEvent.Name)
 				}
 			case err, ok := <-assetsWatcher.Errors:
 				if !ok {
@@ -93,8 +94,11 @@ func watchAssets() {
 				// 重新缓存资源文件,以便使用 /资源 搜索
 				go cache.LoadAssets()
 
-				// 索引资源文件内容
-				IndexAssetContent(lastEvent.Name)
+				if lastEvent.Op&fsnotify.Remove == fsnotify.Remove {
+					RemoveIndexAssetContent(lastEvent.Name)
+				} else {
+					IndexAssetContent(lastEvent.Name)
+				}
 			}
 		}
 	}()

+ 5 - 2
kernel/model/assets_watcher_darwin.go

@@ -60,8 +60,11 @@ func watchAssets() {
 				// 重新缓存资源文件,以便使用 /资源 搜索
 				go cache.LoadAssets()
 
-				// 索引资源文件内容
-				IndexAssetContent(event.Path)
+				if watcher.Remove == event.Op {
+					RemoveIndexAssetContent(event.Path)
+				} else {
+					IndexAssetContent(event.Path)
+				}
 			case err, ok := <-assetsWatcher.Error:
 				if !ok {
 					return