From da65f608a551abb530d71d055de7572c6e2f2fd5 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 2 Nov 2023 16:24:50 +0800 Subject: [PATCH] :art: Attribute Panel - Database supports display database block floating window https://github.com/siyuan-note/siyuan/issues/9285 --- kernel/av/av.go | 116 ------------------------- kernel/av/mirror.go | 152 +++++++++++++++++++++++++++++++++ kernel/model/attribute_view.go | 4 + 3 files changed, 156 insertions(+), 116 deletions(-) create mode 100644 kernel/av/mirror.go diff --git a/kernel/av/av.go b/kernel/av/av.go index 6385a4224..0b87967ae 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -25,7 +25,6 @@ import ( "path/filepath" "strconv" "strings" - "sync" "time" "github.com/88250/gulu" @@ -33,7 +32,6 @@ import ( "github.com/siyuan-note/filelock" "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/util" - "github.com/vmihailenco/msgpack/v5" "golang.org/x/text/language" "golang.org/x/text/message" ) @@ -586,120 +584,6 @@ func NewAttributeView(id string) (ret *AttributeView) { return } -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() - - blocks := filepath.Join(util.DataDir, "storage", "av", "blocks.msgpack") - if !gulu.File.IsExist(blocks) { - return - } - - data, err := filelock.ReadFile(blocks) - if nil != err { - logging.LogErrorf("read attribute view blocks failed: %s", err) - return - } - - avBlocks := map[string][]string{} - if err = msgpack.Unmarshal(data, &avBlocks); nil != err { - logging.LogErrorf("unmarshal attribute view blocks failed: %s", err) - return - } - - blockIDs := avBlocks[avID] - if nil == blockIDs { - return - } - - var newBlockIDs []string - for _, v := range blockIDs { - if v != blockID { - newBlockIDs = append(newBlockIDs, v) - } - } - avBlocks[avID] = newBlockIDs - - data, err = msgpack.Marshal(avBlocks) - if nil != err { - logging.LogErrorf("marshal attribute view blocks failed: %s", err) - return - } - if err = filelock.WriteFile(blocks, data); nil != err { - logging.LogErrorf("write attribute view blocks failed: %s", err) - return - } -} - -func UpsertBlockRel(avID, blockID string) { - attributeViewBlocksLock.Lock() - defer attributeViewBlocksLock.Unlock() - - avBlocks := map[string][]string{} - blocks := filepath.Join(util.DataDir, "storage", "av", "blocks.msgpack") - if !gulu.File.IsExist(blocks) { - if err := os.MkdirAll(filepath.Dir(blocks), 0755); nil != err { - logging.LogErrorf("create attribute view dir failed: %s", err) - return - } - } else { - data, err := filelock.ReadFile(blocks) - if nil != err { - logging.LogErrorf("read attribute view blocks failed: %s", err) - return - } - - if err = msgpack.Unmarshal(data, &avBlocks); nil != err { - logging.LogErrorf("unmarshal attribute view blocks failed: %s", err) - return - } - } - - blockIDs := avBlocks[avID] - blockIDs = append(blockIDs, blockID) - blockIDs = gulu.Str.RemoveDuplicatedElem(blockIDs) - avBlocks[avID] = blockIDs - - data, err := msgpack.Marshal(avBlocks) - if nil != err { - logging.LogErrorf("marshal attribute view blocks failed: %s", err) - return - } - if err = filelock.WriteFile(blocks, data); nil != err { - logging.LogErrorf("write attribute view blocks failed: %s", err) - return - } -} - func ParseAttributeView(avID string) (ret *AttributeView, err error) { avJSONPath := GetAttributeViewDataPath(avID) if !gulu.File.IsExist(avJSONPath) { diff --git a/kernel/av/mirror.go b/kernel/av/mirror.go new file mode 100644 index 000000000..215e52b7e --- /dev/null +++ b/kernel/av/mirror.go @@ -0,0 +1,152 @@ +package av + +import ( + "os" + "path/filepath" + "sync" + + "github.com/88250/gulu" + "github.com/siyuan-note/filelock" + "github.com/siyuan-note/logging" + "github.com/siyuan-note/siyuan/kernel/util" + "github.com/vmihailenco/msgpack/v5" +) + +var ( + attributeViewBlocksLock = sync.Mutex{} +) + +func GetMirrorBlockIDs(avID string) []string { + attributeViewBlocksLock.Lock() + defer attributeViewBlocksLock.Unlock() + + blocks := filepath.Join(util.DataDir, "storage", "av", "blocks.msgpack") + if !gulu.File.IsExist(blocks) { + return nil + } + + data, err := filelock.ReadFile(blocks) + if nil != err { + logging.LogErrorf("read attribute view blocks failed: %s", err) + return nil + } + + avBlocks := map[string][]string{} + if err = msgpack.Unmarshal(data, &avBlocks); nil != err { + logging.LogErrorf("unmarshal attribute view blocks failed: %s", err) + return nil + } + + blockIDs := avBlocks[avID] + return blockIDs +} + +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() + + blocks := filepath.Join(util.DataDir, "storage", "av", "blocks.msgpack") + if !gulu.File.IsExist(blocks) { + return + } + + data, err := filelock.ReadFile(blocks) + if nil != err { + logging.LogErrorf("read attribute view blocks failed: %s", err) + return + } + + avBlocks := map[string][]string{} + if err = msgpack.Unmarshal(data, &avBlocks); nil != err { + logging.LogErrorf("unmarshal attribute view blocks failed: %s", err) + return + } + + blockIDs := avBlocks[avID] + if nil == blockIDs { + return + } + + var newBlockIDs []string + for _, v := range blockIDs { + if v != blockID { + newBlockIDs = append(newBlockIDs, v) + } + } + avBlocks[avID] = newBlockIDs + + data, err = msgpack.Marshal(avBlocks) + if nil != err { + logging.LogErrorf("marshal attribute view blocks failed: %s", err) + return + } + if err = filelock.WriteFile(blocks, data); nil != err { + logging.LogErrorf("write attribute view blocks failed: %s", err) + return + } +} + +func UpsertBlockRel(avID, blockID string) { + attributeViewBlocksLock.Lock() + defer attributeViewBlocksLock.Unlock() + + avBlocks := map[string][]string{} + blocks := filepath.Join(util.DataDir, "storage", "av", "blocks.msgpack") + if !gulu.File.IsExist(blocks) { + if err := os.MkdirAll(filepath.Dir(blocks), 0755); nil != err { + logging.LogErrorf("create attribute view dir failed: %s", err) + return + } + } else { + data, err := filelock.ReadFile(blocks) + if nil != err { + logging.LogErrorf("read attribute view blocks failed: %s", err) + return + } + + if err = msgpack.Unmarshal(data, &avBlocks); nil != err { + logging.LogErrorf("unmarshal attribute view blocks failed: %s", err) + return + } + } + + blockIDs := avBlocks[avID] + blockIDs = append(blockIDs, blockID) + blockIDs = gulu.Str.RemoveDuplicatedElem(blockIDs) + avBlocks[avID] = blockIDs + + data, err := msgpack.Marshal(avBlocks) + if nil != err { + logging.LogErrorf("marshal attribute view blocks failed: %s", err) + return + } + if err = filelock.WriteFile(blocks, data); nil != err { + logging.LogErrorf("write attribute view blocks failed: %s", err) + return + } +} diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 121c11379..e72b886a6 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -36,6 +36,7 @@ import ( type BlockAttributeViewKeys struct { AvID string `json:"avID"` AvName string `json:"avName"` + BlockIDs []string `json:"blockIDs"` KeyValues []*av.KeyValues `json:"keyValues"` } @@ -140,9 +141,12 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) { }) } + blockIDs := av.GetMirrorBlockIDs(avID) + ret = append(ret, &BlockAttributeViewKeys{ AvID: avID, AvName: attrView.Name, + BlockIDs: blockIDs, KeyValues: keyValues, }) }