From 0f519f62b196199f837f7e52ee9344e337f29557 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sat, 24 Jun 2023 17:47:16 +0800 Subject: [PATCH] :art: After invoking kernel API `setBlockAttrs` then auto refresh dynamic anchor text of block refs Fix https://github.com/siyuan-note/siyuan/issues/8605 --- kernel/model/blockial.go | 6 ++++++ kernel/model/transaction.go | 18 ++++++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/kernel/model/blockial.go b/kernel/model/blockial.go index 8d0ee4174..63e3c7e15 100644 --- a/kernel/model/blockial.go +++ b/kernel/model/blockial.go @@ -29,6 +29,7 @@ import ( "github.com/88250/lute/parse" "github.com/araddon/dateparse" "github.com/siyuan-note/siyuan/kernel/cache" + "github.com/siyuan-note/siyuan/kernel/sql" "github.com/siyuan-note/siyuan/kernel/treenode" "github.com/siyuan-note/siyuan/kernel/util" ) @@ -135,6 +136,11 @@ func setNodeAttrs(node *ast.Node, tree *parse.Tree, nameValues map[string]string cache.PutBlockIAL(node.ID, parse.IAL2Map(node.KramdownIAL)) pushBroadcastAttrTransactions(oldAttrs, node) + + go func() { + sql.WaitForWritingDatabase() + refreshDynamicRefText(node, tree) + }() return } diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index 954cbc344..2b0192af3 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -1059,7 +1059,7 @@ func (tx *Transaction) commit() (err error) { return } } - refreshDynamicRefText(tx.nodes, tx.trees) + refreshDynamicRefTexts(tx.nodes, tx.trees) IncSync() tx.trees = nil return @@ -1099,9 +1099,17 @@ func (tx *Transaction) writeTree(tree *parse.Tree) (err error) { return } -func refreshDynamicRefText(updatedDefNodes map[string]*ast.Node, updatedTrees map[string]*parse.Tree) { - // 这个实现依赖了数据库缓存,导致外部调用时可能需要阻塞等待数据库写入后才能获取到 refs +// refreshDynamicRefText 用于刷新引用块的动态锚文本。 +// 该实现依赖了数据库缓存,导致外部调用时可能需要阻塞等待数据库写入后才能获取到 refs +func refreshDynamicRefText(updatedDefNode *ast.Node, updatedTree *parse.Tree) { + changedDefs := map[string]*ast.Node{updatedDefNode.ID: updatedDefNode} + changedTrees := map[string]*parse.Tree{updatedTree.ID: updatedTree} + refreshDynamicRefTexts(changedDefs, changedTrees) +} +// refreshDynamicRefTexts 用于批量刷新引用块的动态锚文本。 +// 该实现依赖了数据库缓存,导致外部调用时可能需要阻塞等待数据库写入后才能获取到 refs +func refreshDynamicRefTexts(updatedDefNodes map[string]*ast.Node, updatedTrees map[string]*parse.Tree) { treeRefNodeIDs := map[string]*hashset.Set{} for _, updateNode := range updatedDefNodes { refs := sql.GetRefsCacheByDefID(updateNode.ID) @@ -1183,9 +1191,7 @@ func flushUpdateRefTextRenameDoc() { defer updateRefTextRenameDocLock.Unlock() for _, tree := range updateRefTextRenameDocs { - changedDefs := map[string]*ast.Node{tree.ID: tree.Root} - changedTrees := map[string]*parse.Tree{tree.ID: tree} - refreshDynamicRefText(changedDefs, changedTrees) + refreshDynamicRefText(tree.Root, tree) } updateRefTextRenameDocs = map[string]*parse.Tree{} }