Signed-off-by: Daniel <845765@qq.com>
This commit is contained in:
Daniel 2026-04-17 22:58:28 +08:00
parent 28e6305261
commit 48456518ff
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
2 changed files with 20 additions and 12 deletions

View file

@ -113,7 +113,7 @@ func batchLoadTrees(boxIDs, paths []string, luteEngine *lute.Lute) (ret []*parse
return
}
func LoadTree(boxID, p string, luteEngine *lute.Lute) (ret *parse.Tree, err error) {
func LoadTreeWithFix(boxID, p string, luteEngine *lute.Lute) (ret *parse.Tree, needFix bool, err error) {
rootID := util.GetTreeID(p)
if raw, ok := cache.GetTreeData(rootID); ok {
ret, err = LoadTreeByData(raw, boxID, p, luteEngine)
@ -127,7 +127,7 @@ func LoadTree(boxID, p string, luteEngine *lute.Lute) (ret *parse.Tree, err erro
return
}
data, err = fixTreeJSONData(boxID, p, data, luteEngine)
data, needFix, err = fixTreeJSONData(boxID, p, data, luteEngine)
if nil != err {
return
}
@ -139,6 +139,11 @@ func LoadTree(boxID, p string, luteEngine *lute.Lute) (ret *parse.Tree, err erro
return
}
func LoadTree(boxID, p string, luteEngine *lute.Lute) (ret *parse.Tree, err error) {
ret, _, err = LoadTreeWithFix(boxID, p, luteEngine)
return
}
func LoadTreeByData(data []byte, boxID, p string, luteEngine *lute.Lute) (ret *parse.Tree, err error) {
ret, err = parseJSON2Tree(boxID, p, data, luteEngine)
if nil != err {
@ -386,20 +391,19 @@ func afterWriteTree(tree *parse.Tree) {
}
// fixTreeJSONData 订正树 JSON 数据。
func fixTreeJSONData(boxID, p string, jsonData []byte, luteEngine *lute.Lute) ([]byte, error) {
func fixTreeJSONData(boxID, p string, jsonData []byte, luteEngine *lute.Lute) (data []byte, needFix bool, err error) {
jsonData = removeUnescapedUnicodeNull(jsonData)
var needFix bool
ret, needFix, err := dataparser.ParseJSON(jsonData, luteEngine.ParseOptions)
if err != nil {
logging.LogErrorf("parse json [%s] to tree failed: %s", boxID+p, err)
return nil, err
return
}
ret.Box = boxID
ret.Path = p
if err = treenode.CheckSpec(ret); errors.Is(err, treenode.ErrSpecTooNew) {
return nil, err
return
}
if treenode.UpgradeSpec(ret) {
@ -422,29 +426,29 @@ func fixTreeJSONData(boxID, p string, jsonData []byte, luteEngine *lute.Lute) ([
}
if !needFix {
return jsonData, nil
return jsonData, false, nil
}
renderer := render.NewJSONRenderer(ret, luteEngine.RenderOptions, luteEngine.ParseOptions)
data := renderer.Render()
data = renderer.Render()
if !util.UseSingleLineSave {
buf := bytes.Buffer{}
buf.Grow(1024 * 1024 * 2)
if err = json.Indent(&buf, data, "", "\t"); err != nil {
return nil, err
return
}
data = buf.Bytes()
}
filePath := filepath.Join(util.DataDir, ret.Box, ret.Path)
if err = os.MkdirAll(filepath.Dir(filePath), 0755); err != nil {
return nil, err
return
}
if err = filelock.WriteFile(filePath, data); err != nil {
logging.LogErrorf("write data [%s] failed: %s", filePath, err)
}
return data, nil
return
}
func parseJSON2Tree(boxID, p string, jsonData []byte, luteEngine *lute.Lute) (ret *parse.Tree, err error) {

View file

@ -243,7 +243,11 @@ func LoadTreeByBlockID(id string) (ret *parse.Tree, err error) {
func loadTreeByBlockTree(bt *treenode.BlockTree) (ret *parse.Tree, err error) {
luteEngine := util.NewLute()
ret, err = filesys.LoadTree(bt.BoxID, bt.Path, luteEngine)
ret, needFix, err := filesys.LoadTreeWithFix(bt.BoxID, bt.Path, luteEngine)
if needFix {
treenode.UpsertBlockTree(ret)
sql.IndexTreeQueue(ret)
}
return
}