diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 2e529ed09..f5c570e6a 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1629,10 +1629,18 @@ func updateAttributeViewColRelation(operation *Operation) (err error) { continue } - srcKeyValues := keyValues - for _, srcVal := range srcKeyValues.Values { + for _, srcVal := range keyValues.Values { for _, blockID := range srcVal.Relation.BlockIDs { - destVal := &av.Value{ID: ast.NewNodeID(), KeyID: destKeyValues.Key.ID, BlockID: blockID, Type: keyValues.Key.Type, Relation: &av.ValueRelation{}, CreatedAt: now, UpdatedAt: now + 1000} + destVal := destAv.GetValue(destKeyValues.Key.ID, blockID) + if nil == destVal { + destVal = &av.Value{ID: ast.NewNodeID(), KeyID: destKeyValues.Key.ID, BlockID: blockID, Type: keyValues.Key.Type, Relation: &av.ValueRelation{}, CreatedAt: now, UpdatedAt: now + 1000} + } else { + destVal.Type = keyValues.Key.Type + if nil == destVal.Relation { + destVal.Relation = &av.ValueRelation{} + } + destVal.UpdatedAt = now + } destVal.Relation.BlockIDs = append(destVal.Relation.BlockIDs, srcVal.BlockID) destVal.Relation.BlockIDs = gulu.Str.RemoveDuplicatedElem(destVal.Relation.BlockIDs) destKeyValues.Values = append(destKeyValues.Values, destVal) @@ -3232,12 +3240,12 @@ func UpdateAttributeViewCell(tx *Transaction, avID, keyID, rowID, cellID string, // 将游离行绑定到新建的块上 bindBlockAv(tx, avID, rowID) } - } else { // 之前绑定了块 + } else { // 之前绑定了块 if isUpdatingBlockKey { // 正在更新主键 if val.IsDetached { // 现在是游离行 // 将绑定的块从属性视图中移除 unbindBlockAv(tx, avID, rowID) - } else { // 现在绑定了块 + } else { // 现在绑定了块 if oldBoundBlockID != val.BlockID { // 之前绑定的块和现在绑定的块不一样 // 换绑块 unbindBlockAv(tx, avID, oldBoundBlockID) diff --git a/kernel/model/export.go b/kernel/model/export.go index 58c31d7aa..795aedffa 100644 --- a/kernel/model/export.go +++ b/kernel/model/export.go @@ -180,7 +180,7 @@ func ExportAv2CSV(avID, blockID string) (zipPath string, err error) { } writer.Flush() - zipPath = exportFolder + ".db.zip" + zipPath = getUniqueFilename(exportFolder + ".db.zip") zip, err := gulu.Zip.Create(zipPath) if nil != err { logging.LogErrorf("create export .db.zip [%s] failed: %s", exportFolder, err) @@ -209,6 +209,24 @@ func ExportAv2CSV(avID, blockID string) (zipPath string, err error) { return } +func getUniqueFilename(filePath string) string { + if !gulu.File.IsExist(filePath) { + return filePath + } + + ext := filepath.Ext(filePath) + base := strings.TrimSuffix(filepath.Base(filePath), ext) + dir := filepath.Dir(filePath) + i := 1 + for { + newPath := filepath.Join(dir, base+" ("+strconv.Itoa(i)+ext) + ")" + if !gulu.File.IsExist(newPath) { + return newPath + } + i++ + } +} + func Export2Liandi(id string) (err error) { tree, err := LoadTreeByBlockID(id) if nil != err {