瀏覽代碼

:art: Automatically refresh reference counts after deleting or rolling back a document https://github.com/siyuan-note/siyuan/issues/12682

Daniel 9 月之前
父節點
當前提交
82b89af76c
共有 2 個文件被更改,包括 30 次插入4 次删除
  1. 17 4
      kernel/model/file.go
  2. 13 0
      kernel/model/history.go

+ 17 - 4
kernel/model/file.go

@@ -1742,13 +1742,26 @@ func removeDoc(box *Box, p string, luteEngine *lute.Lute) {
 	util.PushEvent(evt)
 
 	refreshParentDocInfo(tree)
-	task.AppendTask(task.DatabaseIndex, removeDoc0, box, p, childrenDir)
+	task.AppendTask(task.DatabaseIndex, removeDoc0, tree, childrenDir)
 }
 
-func removeDoc0(box *Box, p, childrenDir string) {
+func removeDoc0(tree *parse.Tree, childrenDir string) {
+	// 收集引用的定义块 ID
+	refDefIDs := getRefDefIDs(tree.Root)
+	// 推送定义节点引用计数
+	for _, defID := range refDefIDs {
+		defTree, _ := LoadTreeByBlockID(defID)
+		if nil != defTree {
+			defNode := treenode.GetNodeInTree(defTree, defID)
+			if nil != defNode {
+				task.AppendAsyncTaskWithDelay(task.SetDefRefCount, 1*time.Second, refreshRefCount, defTree.ID, defNode.ID)
+			}
+		}
+	}
+
 	treenode.RemoveBlockTreesByPathPrefix(childrenDir)
-	sql.RemoveTreePathQueue(box.ID, childrenDir)
-	cache.RemoveDocIAL(p)
+	sql.RemoveTreePathQueue(tree.Box, childrenDir)
+	cache.RemoveDocIAL(tree.Path)
 	return
 }
 

+ 13 - 0
kernel/model/history.go

@@ -315,6 +315,19 @@ func RollbackDocHistory(boxID, historyPath string) (err error) {
 			"refText": refText,
 		}
 		util.PushEvent(evt)
+
+		// 收集引用的定义块 ID
+		refDefIDs := getRefDefIDs(tree.Root)
+		// 推送定义节点引用计数
+		for _, defID := range refDefIDs {
+			defTree, _ := LoadTreeByBlockID(defID)
+			if nil != defTree {
+				defNode := treenode.GetNodeInTree(defTree, defID)
+				if nil != defNode {
+					task.AppendAsyncTaskWithDelay(task.SetDefRefCount, 1*time.Second, refreshRefCount, defTree.ID, defNode.ID)
+				}
+			}
+		}
 	}()
 	return nil
 }