From b5fc879628809657c2fd8a40cf8d24fa5ed6dc97 Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Wed, 25 Jan 2023 12:33:38 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E6=94=B9=E8=BF=9B=E5=86=85=E6=A0=B8?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E8=B0=83=E5=BA=A6=E6=9C=BA=E5=88=B6=E6=8F=90?= =?UTF-8?q?=E5=8D=87=E7=A8=B3=E5=AE=9A=E6=80=A7=20https://github.com/siyua?= =?UTF-8?q?n-note/siyuan/issues/7113?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/model/index.go | 2 +- kernel/model/transaction.go | 2 +- kernel/sql/queue.go | 21 +++++++++++++++++++-- kernel/sql/upsert.go | 11 +++++++++++ 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/kernel/model/index.go b/kernel/model/index.go index 662167154..080a7a25b 100644 --- a/kernel/model/index.go +++ b/kernel/model/index.go @@ -105,7 +105,7 @@ func index(boxID string) { cache.PutDocIAL(file.path, docIAL) treenode.ReindexBlockTree(tree) - sql.UpsertTreeQueue(tree) + sql.IndexTreeQueue(box.ID, file.path) util.IncBootProgress(bootProgressPart, fmt.Sprintf(Conf.Language(92), util.ShortPathForBootingDisplay(tree.Path))) treeSize += file.size diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index 1ab9c7980..71dd9d2f7 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -1447,7 +1447,7 @@ func reindexTree0(tree *parse.Tree, i, size int) { indexWriteJSONQueue(tree) } else { treenode.ReindexBlockTree(tree) - sql.UpsertTreeQueue(tree) + sql.IndexTreeQueue(tree.Box, tree.Path) } util.PushStatusBar(fmt.Sprintf(Conf.Language(183), i, size, html.EscapeHTMLStr(path.Base(tree.HPath)))) } diff --git a/kernel/sql/queue.go b/kernel/sql/queue.go index f326188ed..e3e361f10 100644 --- a/kernel/sql/queue.go +++ b/kernel/sql/queue.go @@ -37,12 +37,13 @@ var ( type dbQueueOperation struct { inQueueTime time.Time - action string // upsert/delete/delete_id/rename/delete_box/delete_box_refs/insert_refs + action string // upsert/delete/delete_id/rename/delete_box/delete_box_refs/insert_refs/index + indexPath string // index upsertTree *parse.Tree // upsert/insert_refs removeTreeBox, removeTreePath string // delete removeTreeIDBox, removeTreeID string // delete_id - box string // delete_box/delete_box_refs + box string // delete_box/delete_box_refs/index renameTree *parse.Tree // rename renameTreeOldHPath string // rename } @@ -110,6 +111,8 @@ func FlushQueue() { } switch op.action { + case "index": + err = indexTree(tx, op.box, op.indexPath, context) case "upsert": err = upsertTree(tx, op.upsertTree, context) case "delete": @@ -231,6 +234,20 @@ func DeleteBoxQueue(boxID string) { operationQueue = append(operationQueue, newOp) } +func IndexTreeQueue(box, p string) { + dbQueueLock.Lock() + defer dbQueueLock.Unlock() + + newOp := &dbQueueOperation{indexPath: p, box: box, inQueueTime: time.Now(), action: "index"} + for i, op := range operationQueue { + if "index" == op.action && op.indexPath == p && op.box == box { // 相同树则覆盖 + operationQueue[i] = newOp + return + } + } + operationQueue = append(operationQueue, newOp) +} + func UpsertTreeQueue(tree *parse.Tree) { dbQueueLock.Lock() defer dbQueueLock.Unlock() diff --git a/kernel/sql/upsert.go b/kernel/sql/upsert.go index 184c748c8..3e7516467 100644 --- a/kernel/sql/upsert.go +++ b/kernel/sql/upsert.go @@ -21,6 +21,7 @@ import ( "crypto/sha256" "database/sql" "fmt" + "github.com/siyuan-note/siyuan/kernel/filesys" "strings" "github.com/88250/lute/parse" @@ -392,6 +393,16 @@ func insertRefs(tx *sql.Tx, tree *parse.Tree) (err error) { return err } +func indexTree(tx *sql.Tx, box, p string, context map[string]interface{}) (err error) { + tree, err := filesys.LoadTree(box, p, luteEngine) + if nil != err { + return + } + + err = upsertTree(tx, tree, context) + return +} + func upsertTree(tx *sql.Tx, tree *parse.Tree, context map[string]interface{}) (err error) { oldBlockHashes := queryBlockHashes(tree.ID) blocks, spans, assets, attributes := fromTree(tree.Root, tree)