From 3617df1411f336a7edc36bfc1ce9a08752ce444b Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 8 Mar 2024 15:43:33 +0800 Subject: [PATCH] :bug: Fix database failed: invalid character ':' after array element Fix https://github.com/siyuan-note/siyuan/issues/10541 --- kernel/av/av.go | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/kernel/av/av.go b/kernel/av/av.go index 5ad8c352b..4d9e6f844 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -233,8 +233,51 @@ func ParseAttributeView(avID string) (ret *AttributeView, err error) { ret = &AttributeView{} if err = gulu.JSON.UnmarshalJSON(data, ret); nil != err { if strings.Contains(err.Error(), ".relation.contents of type av.Value") { - // v3.0.3 兼容之前旧版本,通过正则将 "relation":{"contents":[".*"],"blockIDs": 替换为 "relation":{"contents":null,"blockIDs": - data = regexp.MustCompile(`"relation":{"contents":\[".*"\],"blockIDs":`).ReplaceAll(data, []byte(`"relation":{"contents":null,"blockIDs":`)) + mapAv := map[string]interface{}{} + if err = gulu.JSON.UnmarshalJSON(data, &mapAv); nil != err { + logging.LogErrorf("unmarshal attribute view [%s] failed: %s", avID, err) + return + } + + // v3.0.3 兼容之前旧版本,将 relation.contents[""] 转换为 null + keyValues := mapAv["keyValues"] + keyValuesMap := keyValues.([]interface{}) + for _, kv := range keyValuesMap { + kvMap := kv.(map[string]interface{}) + if values := kvMap["values"]; nil != values { + valuesMap := values.([]interface{}) + for _, v := range valuesMap { + if vMap := v.(map[string]interface{}); nil != vMap["relation"] { + vMap["relation"].(map[string]interface{})["contents"] = nil + } + } + } + } + + views := mapAv["views"] + viewsMap := views.([]interface{}) + for _, view := range viewsMap { + if table := view.(map[string]interface{})["table"]; nil != table { + tableMap := table.(map[string]interface{}) + if filters := tableMap["filters"]; nil != filters { + filtersMap := filters.([]interface{}) + for _, f := range filtersMap { + if fMap := f.(map[string]interface{}); nil != fMap["value"] { + if valueMap := fMap["value"].(map[string]interface{}); nil != valueMap["relation"] { + valueMap["relation"].(map[string]interface{})["contents"] = nil + } + } + } + } + } + } + + data, err = gulu.JSON.MarshalJSON(mapAv) + if nil != err { + logging.LogErrorf("marshal attribute view [%s] failed: %s", avID, err) + return + } + if err = gulu.JSON.UnmarshalJSON(data, ret); nil != err { logging.LogErrorf("unmarshal attribute view [%s] failed: %s", avID, err) return