Ver Fonte

:bug: After the document is transferred to the heading, occurs two copies of the reference block Fix https://github.com/siyuan-note/siyuan/issues/7819

Liang Ding há 2 anos atrás
pai
commit
ee7ab26fcd
3 ficheiros alterados com 31 adições e 1 exclusões
  1. 4 0
      kernel/model/heading.go
  2. 10 0
      kernel/sql/block_ref.go
  3. 17 1
      kernel/sql/queue.go

+ 4 - 0
kernel/model/heading.go

@@ -134,6 +134,10 @@ func Doc2Heading(srcID, targetID string, after bool) (srcTreeBox, srcTreePath st
 		return
 	}
 
+	// 移动前先删除引用 https://github.com/siyuan-note/siyuan/issues/7819
+	sql.DeleteRefsTreeQueue(srcTree)
+	sql.DeleteRefsTreeQueue(targetTree)
+
 	if ast.NodeListItem == pivot.Type {
 		pivot = pivot.LastChild
 	}

+ 10 - 0
kernel/sql/block_ref.go

@@ -47,3 +47,13 @@ func upsertRefs(tx *sql.Tx, tree *parse.Tree) (err error) {
 	err = insertRefs(tx, tree)
 	return
 }
+
+func deleteRefs(tx *sql.Tx, tree *parse.Tree) (err error) {
+	if err = deleteRefsByPath(tx, tree.Box, tree.Path); nil != err {
+		return
+	}
+	if err = deleteFileAnnotationRefsByPath(tx, tree.Box, tree.Path); nil != err {
+		return
+	}
+	return
+}

+ 17 - 1
kernel/sql/queue.go

@@ -44,7 +44,7 @@ type dbQueueOperation struct {
 	action      string // upsert/delete/delete_id/rename/rename_sub_tree/delete_box/delete_box_refs/insert_refs/index/delete_ids/update_block_content/delete_assets
 
 	indexPath                     string      // index
-	upsertTree                    *parse.Tree // upsert/insert_refs
+	upsertTree                    *parse.Tree // upsert/insert_refs/update_refs/delete_refs
 	removeTreeBox, removeTreePath string      // delete
 	removeTreeIDBox, removeTreeID string      // delete_id
 	removeTreeIDs                 []string    // delete_ids
@@ -182,6 +182,8 @@ func execOp(op *dbQueueOperation, tx *sql.Tx, context map[string]interface{}) (e
 		err = insertRefs(tx, op.upsertTree)
 	case "update_refs":
 		err = upsertRefs(tx, op.upsertTree)
+	case "delete_refs":
+		err = deleteRefs(tx, op.upsertTree)
 	case "update_block_content":
 		err = updateBlockContent(tx, op.block)
 	case "delete_assets":
@@ -220,6 +222,20 @@ func UpdateBlockContentQueue(block *Block) {
 	operationQueue = append(operationQueue, newOp)
 }
 
+func DeleteRefsTreeQueue(tree *parse.Tree) {
+	dbQueueLock.Lock()
+	defer dbQueueLock.Unlock()
+
+	newOp := &dbQueueOperation{upsertTree: tree, inQueueTime: time.Now(), action: "delete_refs"}
+	for i, op := range operationQueue {
+		if "delete_refs" == op.action && op.upsertTree.ID == tree.ID {
+			operationQueue[i] = newOp
+			return
+		}
+	}
+	operationQueue = append(operationQueue, newOp)
+}
+
 func UpdateRefsTreeQueue(tree *parse.Tree) {
 	dbQueueLock.Lock()
 	defer dbQueueLock.Unlock()