diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json index a8b97f415..c2acc177b 100644 --- a/app/appearance/langs/en_US.json +++ b/app/appearance/langs/en_US.json @@ -980,7 +980,7 @@ "90": "[%d/%d] Created [%d] of search indexes of block-level elements [%s]", "91": "Reading block tree data...", "92": "Parsing document tree [%s]", - "93": "TODO", + "93": "[%d/%d] Cleaned up the index related to document [%s]", "94": "Upload failed: %s", "95": "Exiting...", "96": "Synchronization failed when exiting. Please manually perform a synchronization to ensure that the local data is consistent with the cloud data", diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json index e0ddce8c3..8f6eb88d0 100644 --- a/app/appearance/langs/es_ES.json +++ b/app/appearance/langs/es_ES.json @@ -980,7 +980,7 @@ "90": "[%d/%d] Creado [%d] de índices de búsqueda de elementos a nivel de bloque [%s]", "91": "Leyendo datos del árbol de bloques...", "92": "Analizando el árbol del documento [%s]", - "93": "TODO", + "93": "[%d/%d] ha limpiado el índice relacionado con el documento [%s]", "94": "Carga fallida: %s", "95": "Saliendo...", "96": "La sincronización falló al salir. Por favor, realice manualmente una sincronización para asegurarse de que los datos locales son coherentes con los datos de la nube", diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json index 233156012..36fb2d97d 100644 --- a/app/appearance/langs/fr_FR.json +++ b/app/appearance/langs/fr_FR.json @@ -980,7 +980,7 @@ "90": "[%d/%d] Création de [%d] index de recherche d'éléments de niveau bloc [%s]", "91": "Lecture des données de l'arborescence des blocs...", "92": "Analyse de l'arborescence du document [%s]", - "93": "TODO", + "93": "[%d/%d] a nettoyé l'index lié au document [%s]", "94": "Échec du téléchargement : %s", "95": "Quitter le programme...", "96": "La synchronisation a échoué lors de la sortie. Veuillez effectuer une synchronisation manuellement pour vous assurer que les données locales sont cohérentes avec les données du cloud", diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json index de7848c8a..ade184f41 100644 --- a/app/appearance/langs/zh_CHT.json +++ b/app/appearance/langs/zh_CHT.json @@ -980,7 +980,7 @@ "90": "[%d/%d] 已經建立 [%d] 個塊級元素的搜索索引 [%s]", "91": "正在讀取塊樹數據...", "92": "正在解析文檔樹 [%s]", - "93": "TODO", + "93": "[%d/%d] 已經清理文檔 [%s] 相關的索引", "94": "上傳失敗:%s", "95": "正在退出...", "96": "退出時同步失敗,請手動執行一次同步以確保本地資料和雲端資料一致", diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json index 7d225d82a..a4d28afb7 100644 --- a/app/appearance/langs/zh_CN.json +++ b/app/appearance/langs/zh_CN.json @@ -980,7 +980,7 @@ "90": "[%d/%d] 已经建立 [%d] 个块级元素的搜索索引 [%s]", "91": "正在读取块树数据...", "92": "正在解析文档树 [%s]", - "93": "TODO", + "93": "[%d/%d] 已经删除文档 [%s] 相关的索引", "94": "上传失败:%s", "95": "正在退出...", "96": "退出时同步失败,请手动执行一次同步以确保本地数据和云端数据一致", diff --git a/kernel/go.mod b/kernel/go.mod index 5e614d32d..cc044a6ca 100644 --- a/kernel/go.mod +++ b/kernel/go.mod @@ -41,7 +41,7 @@ require ( github.com/shirou/gopsutil/v3 v3.22.12 github.com/siyuan-note/dejavu v0.0.0-20230117131301-821aa3adc1e7 github.com/siyuan-note/encryption v0.0.0-20220713091850-5ecd92177b75 - github.com/siyuan-note/eventbus v0.0.0-20220916025349-3ac6e75522da + github.com/siyuan-note/eventbus v0.0.0-20230126092943-c6bf51e65ae2 github.com/siyuan-note/filelock v0.0.0-20221117095924-e1947438a35e github.com/siyuan-note/httpclient v0.0.0-20230116125720-ee36ddf6f223 github.com/siyuan-note/logging v0.0.0-20221031125421-9b7234d79d8a diff --git a/kernel/go.sum b/kernel/go.sum index fe258a3db..fc0df239f 100644 --- a/kernel/go.sum +++ b/kernel/go.sum @@ -377,6 +377,8 @@ github.com/siyuan-note/encryption v0.0.0-20220713091850-5ecd92177b75 h1:Bi7/7f29 github.com/siyuan-note/encryption v0.0.0-20220713091850-5ecd92177b75/go.mod h1:H8fyqqAbp9XreANjeSbc72zEdFfKTXYN34tc1TjZwtw= github.com/siyuan-note/eventbus v0.0.0-20220916025349-3ac6e75522da h1:/jNhl7LC+9BhkWvNxuJDdsNfA/2wvfuj9mqWx4CbV90= github.com/siyuan-note/eventbus v0.0.0-20220916025349-3ac6e75522da/go.mod h1:Sqo4FYX5lAXu7gWkbEdJF0e6P57tNNVV4WDKYDctokI= +github.com/siyuan-note/eventbus v0.0.0-20230126092943-c6bf51e65ae2 h1:njoj0265FOHRjF/O1aWDzdwEdYdLTZwhbuPd/hoLJT0= +github.com/siyuan-note/eventbus v0.0.0-20230126092943-c6bf51e65ae2/go.mod h1:Sqo4FYX5lAXu7gWkbEdJF0e6P57tNNVV4WDKYDctokI= github.com/siyuan-note/filelock v0.0.0-20221117095924-e1947438a35e h1:i3RKrdrddr4AuaHJtoWYAEVNuR7Y9wIsEqPmuFFbJC4= github.com/siyuan-note/filelock v0.0.0-20221117095924-e1947438a35e/go.mod h1:NmpSIVtIGy8eNWapjDIiiCw5+5r5wxC76k40oG+WRXQ= github.com/siyuan-note/httpclient v0.0.0-20230116125720-ee36ddf6f223 h1:hG+gucj92x4Dl4lIe2G0WkPgBdlEBnnQCmYpghHeW54= diff --git a/kernel/model/index.go b/kernel/model/index.go index d252b9a42..eee8e68af 100644 --- a/kernel/model/index.go +++ b/kernel/model/index.go @@ -253,4 +253,16 @@ func init() { util.SetBootDetails(msg) util.ContextPushMsg(context, msg) }) + eventbus.Subscribe(eventbus.EvtSQLDeleteBlocks, func(context map[string]interface{}, rootID string) { + if util.ContainerAndroid == util.Container || util.ContainerIOS == util.Container { + // Android/iOS 端不显示数据索引和搜索索引状态提示 https://github.com/siyuan-note/siyuan/issues/6392 + return + } + + current := context["current"].(int) + 1 + total := context["total"] + msg := fmt.Sprintf(Conf.Language(93), current, total, rootID) + util.SetBootDetails(msg) + util.ContextPushMsg(context, msg) + }) } diff --git a/kernel/model/index_fix.go b/kernel/model/index_fix.go index 6f86ad195..e5b332886 100644 --- a/kernel/model/index_fix.go +++ b/kernel/model/index_fix.go @@ -69,6 +69,7 @@ func autoFixIndex() { for _, root := range roots { rootMap[root.ID] = root } + var deletes int for _, rootID := range duplicatedRootIDs { root := rootMap[rootID] if nil == root { @@ -77,13 +78,13 @@ func autoFixIndex() { //logging.LogWarnf("exist more than one tree [%s], reindex it", rootID) sql.RemoveTreeQueue(root.Box, rootID) - + deletes++ if util.IsExiting { break } } - if 0 < len(duplicatedRootIDs) { - logging.LogWarnf("exist more than one tree duplicated [%d], reindex it", len(duplicatedRootIDs)) + if 0 < deletes { + logging.LogWarnf("exist more than one tree duplicated [%d], reindex it", deletes) } util.PushStatusBar(Conf.Language(58)) diff --git a/kernel/sql/cache.go b/kernel/sql/cache.go index c0cc49e8f..6b4849d36 100644 --- a/kernel/sql/cache.go +++ b/kernel/sql/cache.go @@ -17,7 +17,7 @@ package sql import ( - "runtime/debug" + "runtime" "time" "github.com/88250/lute/ast" @@ -45,7 +45,7 @@ func DisableCache() { func ClearBlockCache() { memCache.Clear() - debug.FreeOSMemory() + runtime.GC() } func putBlockCache(block *Block) { diff --git a/kernel/sql/database.go b/kernel/sql/database.go index 144b9fb14..1a8984d29 100644 --- a/kernel/sql/database.go +++ b/kernel/sql/database.go @@ -34,6 +34,7 @@ import ( "github.com/88250/lute/parse" "github.com/mattn/go-sqlite3" _ "github.com/mattn/go-sqlite3" + "github.com/siyuan-note/eventbus" "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/treenode" "github.com/siyuan-note/siyuan/kernel/util" @@ -947,7 +948,7 @@ func deleteFileAnnotationRefsByBoxTx(tx *sql.Tx, box string) (err error) { return } -func deleteByRootID(tx *sql.Tx, rootID string) (err error) { +func deleteByRootID(tx *sql.Tx, rootID string, context map[string]interface{}) (err error) { stmt := "DELETE FROM blocks WHERE root_id = ?" if err = execStmtTx(tx, stmt, rootID); nil != err { return @@ -969,6 +970,7 @@ func deleteByRootID(tx *sql.Tx, rootID string) (err error) { return } ClearBlockCache() + eventbus.Publish(eventbus.EvtSQLDeleteBlocks, context, rootID) return } diff --git a/kernel/sql/queue.go b/kernel/sql/queue.go index 1b8e5f6db..3ed95779f 100644 --- a/kernel/sql/queue.go +++ b/kernel/sql/queue.go @@ -147,7 +147,7 @@ func execOp(op *dbQueueOperation, tx *sql.Tx, context map[string]interface{}) (e case "delete": err = batchDeleteByPathPrefix(tx, op.removeTreeBox, op.removeTreePath) case "delete_id": - err = deleteByRootID(tx, op.removeTreeID) + err = deleteByRootID(tx, op.removeTreeID, context) case "rename": err = batchUpdateHPath(tx, op.renameTree.Box, op.renameTree.ID, op.renameTreeOldHPath, op.renameTree.HPath) if nil != err { @@ -285,16 +285,13 @@ func RemoveTreeQueue(box, rootID string) { dbQueueLock.Lock() defer dbQueueLock.Unlock() - var tmp []*dbQueueOperation - // 将已有的 upsert 操作去重 - for _, op := range operationQueue { - if "upsert" == op.action && op.upsertTree.ID != rootID { - tmp = append(tmp, op) + newOp := &dbQueueOperation{removeTreeIDBox: box, removeTreeID: rootID, inQueueTime: time.Now(), action: "delete_id"} + for i, op := range operationQueue { + if "delete_id" == op.action && op.removeTreeIDBox == box && op.removeTreeID == rootID { + operationQueue[i] = newOp + return } } - operationQueue = tmp - - newOp := &dbQueueOperation{removeTreeIDBox: box, removeTreeID: rootID, inQueueTime: time.Now(), action: "delete_id"} operationQueue = append(operationQueue, newOp) } @@ -302,15 +299,12 @@ func RemoveTreePathQueue(treeBox, treePathPrefix string) { dbQueueLock.Lock() defer dbQueueLock.Unlock() - var tmp []*dbQueueOperation - // 将已有的 upsert 操作去重 - for _, op := range operationQueue { - if "upsert" == op.action && (op.removeTreeBox != treeBox || op.upsertTree.Path != treePathPrefix) { - tmp = append(tmp, op) + newOp := &dbQueueOperation{removeTreeBox: treeBox, removeTreePath: treePathPrefix, inQueueTime: time.Now(), action: "delete"} + for i, op := range operationQueue { + if "delete" == op.action && (op.removeTreeBox == treeBox && op.removeTreePath == treePathPrefix) { + operationQueue[i] = newOp + return } } - operationQueue = tmp - - newOp := &dbQueueOperation{removeTreeBox: treeBox, removeTreePath: treePathPrefix, inQueueTime: time.Now(), action: "delete"} operationQueue = append(operationQueue, newOp) }