🎨 改进已经损坏的数据处理 Fix https://github.com/siyuan-note/siyuan/issues/5853

This commit is contained in:
Liang Ding 2022-09-09 17:11:49 +08:00
parent 38c70f13a4
commit 8f3dd9fbf4
No known key found for this signature in database
GPG key ID: 136F30F901A2231D
2 changed files with 25 additions and 9 deletions

View file

@ -92,8 +92,8 @@ func ListNotebooks() (ret []*Box, err error) {
continue
}
to := filepath.Join(util.WorkspaceDir, "corrupted", time.Now().Format("2006-01-02-150405"), dir.Name())
if renameErr := gulu.File.CopyDir(boxDirPath, to); nil != renameErr {
logging.LogErrorf("copy corrupted box [%s] failed: %s", boxDirPath, renameErr)
if copyErr := gulu.File.CopyDir(boxDirPath, to); nil != copyErr {
logging.LogErrorf("copy corrupted box [%s] failed: %s", boxDirPath, copyErr)
continue
}
if removeErr := os.RemoveAll(boxDirPath); nil != removeErr {

View file

@ -137,12 +137,7 @@ func (box *Box) docIAL(p string) (ret map[string]string) {
data, err := filelock.NoLockFileRead(filePath)
if util.IsCorruptedSYData(data) {
filelock.UnlockFile(filePath)
if removeErr := os.RemoveAll(filePath); nil == removeErr {
logging.LogInfof("removed corrupted data file [path=%s, length=%d]", filePath, len(data))
} else {
logging.LogWarnf("remove corrupted data file [path=%s, length=%d] failed: %s", filePath, len(data), removeErr)
}
box.moveCorruptedData(filePath)
return nil
}
if nil != err {
@ -152,12 +147,28 @@ func (box *Box) docIAL(p string) (ret map[string]string) {
ret = readDocIAL(data)
if nil == ret {
logging.LogWarnf("tree [%s] is corrupted", filePath)
box.moveCorruptedData(filePath)
return nil
}
cache.PutDocIAL(p, ret)
return ret
}
func (box *Box) moveCorruptedData(filePath string) {
filelock.UnlockFile(filePath)
base := filepath.Base(filePath)
to := filepath.Join(util.WorkspaceDir, "corrupted", time.Now().Format("2006-01-02-150405"), box.ID, base)
if copyErr := gulu.File.CopyFile(filePath, to); nil != copyErr {
logging.LogErrorf("copy corrupted data file [%s] failed: %s", filePath, copyErr)
return
}
if removeErr := os.RemoveAll(filePath); nil != removeErr {
logging.LogErrorf("remove corrupted data file [%s] failed: %s", filePath, removeErr)
return
}
logging.LogWarnf("moved corrupted data file [%s] to [%s]", filePath, to)
}
func readDocIAL(data []byte) (ret map[string]string) {
doc := map[string]interface{}{}
if err := gulu.JSON.UnmarshalJSON(data, &doc); nil != err {
@ -165,7 +176,12 @@ func readDocIAL(data []byte) (ret map[string]string) {
return nil
}
props := doc["Properties"].(map[string]interface{})
propsArg := doc["Properties"]
if nil == propsArg {
return nil
}
props := propsArg.(map[string]interface{})
ret = map[string]string{}
for k, v := range props {
ret[k] = v.(string)