Browse Source

:art: Synchronize the related entries when the database creates a two-way relation https://github.com/siyuan-note/siyuan/issues/11250 https://github.com/siyuan-note/siyuan/issues/11356

Daniel 1 year ago
parent
commit
b042355363
2 changed files with 32 additions and 6 deletions
  1. 13 5
      kernel/model/attribute_view.go
  2. 19 1
      kernel/model/export.go

+ 13 - 5
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)

+ 19 - 1
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 {