diff --git a/kernel/model/heading.go b/kernel/model/heading.go index dd35e82d7..d2437fdde 100644 --- a/kernel/model/heading.go +++ b/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 } diff --git a/kernel/sql/block_ref.go b/kernel/sql/block_ref.go index c89e1fe6f..7da900fe4 100644 --- a/kernel/sql/block_ref.go +++ b/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 +} diff --git a/kernel/sql/queue.go b/kernel/sql/queue.go index d4b289746..34d6e2deb 100644 --- a/kernel/sql/queue.go +++ b/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()