123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- package av
- import (
- "os"
- "path/filepath"
- "sync"
- "github.com/88250/gulu"
- "github.com/88250/lute/ast"
- "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 GetBlockRels() (ret map[string][]string) {
- AttributeViewBlocksLock.Lock()
- defer AttributeViewBlocksLock.Unlock()
- ret = map[string][]string{}
- blocks := filepath.Join(util.DataDir, "storage", "av", "blocks.msgpack")
- if !filelock.IsExist(blocks) {
- return
- }
- data, err := filelock.ReadFile(blocks)
- if nil != err {
- logging.LogErrorf("read attribute view blocks failed: %s", err)
- return
- }
- if err = msgpack.Unmarshal(data, &ret); nil != err {
- logging.LogErrorf("unmarshal attribute view blocks failed: %s", err)
- return
- }
- return
- }
- func IsMirror(avID string) bool {
- AttributeViewBlocksLock.Lock()
- defer AttributeViewBlocksLock.Unlock()
- blocks := filepath.Join(util.DataDir, "storage", "av", "blocks.msgpack")
- if !filelock.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 !filelock.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 BatchUpsertBlockRel(nodes []*ast.Node) {
- AttributeViewBlocksLock.Lock()
- defer AttributeViewBlocksLock.Unlock()
- avBlocks := map[string][]string{}
- blocks := filepath.Join(util.DataDir, "storage", "av", "blocks.msgpack")
- if !filelock.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
- }
- }
- for _, n := range nodes {
- if ast.NodeAttributeView != n.Type {
- continue
- }
- if "" == n.AttributeViewID || "" == n.ID {
- continue
- }
- blockIDs := avBlocks[n.AttributeViewID]
- blockIDs = append(blockIDs, n.ID)
- blockIDs = gulu.Str.RemoveDuplicatedElem(blockIDs)
- avBlocks[n.AttributeViewID] = 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 UpsertBlockRel(avID, blockID string) {
- AttributeViewBlocksLock.Lock()
- defer AttributeViewBlocksLock.Unlock()
- avBlocks := map[string][]string{}
- blocks := filepath.Join(util.DataDir, "storage", "av", "blocks.msgpack")
- if !filelock.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
- }
- }
|