From 960cf3fe04508f88d385bd141087ddd3381f0d19 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 2 Nov 2023 16:05:35 +0800 Subject: [PATCH] :art: Identify the database view whether is a "mirror" https://github.com/siyuan-note/siyuan/issues/9578 --- kernel/api/av.go | 2 ++ kernel/av/av.go | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/kernel/api/av.go b/kernel/api/av.go index f945c9fe5..bd6d723db 100644 --- a/kernel/api/av.go +++ b/kernel/api/av.go @@ -21,6 +21,7 @@ import ( "github.com/88250/gulu" "github.com/gin-gonic/gin" + "github.com/siyuan-note/siyuan/kernel/av" "github.com/siyuan-note/siyuan/kernel/model" "github.com/siyuan-note/siyuan/kernel/util" ) @@ -60,6 +61,7 @@ func renderAttributeView(c *gin.Context) { "viewID": view.GetID(), "views": views, "view": view, + "isMirror": av.IsMirror(attrView.ID), } } diff --git a/kernel/av/av.go b/kernel/av/av.go index 2a6b38c0d..6385a4224 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -590,6 +590,31 @@ var ( attributeViewBlocksLock = sync.Mutex{} ) +func IsMirror(avID string) bool { + attributeViewBlocksLock.Lock() + defer attributeViewBlocksLock.Unlock() + + blocks := filepath.Join(util.DataDir, "storage", "av", "blocks.msgpack") + if !gulu.File.IsExist(blocks) { + return false + } + + data, err := filelock.ReadFile(blocks) + if nil != err { + logging.LogErrorf("read attribute view blocks failed: %s", err) + return false + } + + avBlocks := map[string][]string{} + if err = msgpack.Unmarshal(data, &avBlocks); nil != err { + logging.LogErrorf("unmarshal attribute view blocks failed: %s", err) + return false + } + + blockIDs := avBlocks[avID] + return nil != blockIDs && 1 < len(blockIDs) +} + func RemoveBlockRel(avID, blockID string) { attributeViewBlocksLock.Lock() defer attributeViewBlocksLock.Unlock()