From 7145460c189ffcca410443d9abd1521203ad74b3 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Tue, 24 Oct 2023 09:33:59 +0800 Subject: [PATCH] :art: Shallow clone the corresponding database when the template contains database blocks https://github.com/siyuan-note/siyuan/issues/9494 --- kernel/av/av.go | 39 +++++++++++++++++++++++++++++++++++++++ kernel/model/template.go | 18 ++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/kernel/av/av.go b/kernel/av/av.go index c2333f9e7..919f2ee76 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -46,6 +46,45 @@ type AttributeView struct { Views []*View `json:"views"` // 视图 } +func CloneAttributeView(av *AttributeView) (ret *AttributeView) { + ret = &AttributeView{} + data, err := gulu.JSON.MarshalJSON(av) + if nil != err { + logging.LogErrorf("marshal attribute view [%s] failed: %s", av.ID, err) + return nil + } + if err = gulu.JSON.UnmarshalJSON(data, ret); nil != err { + logging.LogErrorf("unmarshal attribute view [%s] failed: %s", av.ID, err) + return nil + } + + ret.ID = ast.NewNodeID() + view, err := ret.GetView() + if nil == err { + view.ID = ast.NewNodeID() + ret.ViewID = view.ID + } else { + view = NewView() + ret.ViewID = view.ID + ret.Views = append(ret.Views, view) + } + + keyIDMap := map[string]string{} + for _, kv := range ret.KeyValues { + newID := ast.NewNodeID() + keyIDMap[kv.Key.ID] = newID + kv.Key.ID = newID + kv.Values = []*Value{} + } + + view.Table.ID = ast.NewNodeID() + for _, column := range view.Table.Columns { + column.ID = keyIDMap[column.ID] + } + view.Table.RowIDs = []string{} + return +} + // KeyValues 描述了属性视图属性列值的结构。 type KeyValues struct { Key *Key `json:"key"` // 属性视图属性列 diff --git a/kernel/model/template.go b/kernel/model/template.go index 3881f027f..2d93529cb 100644 --- a/kernel/model/template.go +++ b/kernel/model/template.go @@ -20,6 +20,7 @@ import ( "bytes" "errors" "fmt" + "github.com/siyuan-note/siyuan/kernel/av" "io/fs" "os" "path/filepath" @@ -277,6 +278,23 @@ func renderTemplate(p, id string) (string, error) { n.TextMarkInlineMathContent = strings.ReplaceAll(n.TextMarkInlineMathContent, "|", "|") } } + + if ast.NodeAttributeView == n.Type { + // 重新生成数据库视图 + attrView, parseErr := av.ParseAttributeView(n.AttributeViewID) + if nil != parseErr { + logging.LogErrorf("parse attribute view [%s] failed: %s", n.AttributeViewID, parseErr) + } else { + cloned := av.CloneAttributeView(attrView) + if nil != cloned { + n.AttributeViewID = cloned.ID + if saveErr := av.SaveAttributeView(cloned); nil != saveErr { + logging.LogErrorf("save attribute view [%s] failed: %s", cloned.ID, saveErr) + } + } + } + } + return ast.WalkContinue }) for _, n := range nodesNeedAppendChild {