MCPcopy Create free account
hub / github.com/53AI/53AIHub / cascadeDeleteFileData

Function cascadeDeleteFileData

api/model/file.go:1093–1219  ·  view source on GitHub ↗

cascadeDeleteFileData 级联删除文件相关数据

(eid int64, fileID int64)

Source from the content-addressed store, hash-verified

1091
1092// cascadeDeleteFileData 级联删除文件相关数据
1093func cascadeDeleteFileData(eid int64, fileID int64) error {
1094 var sandboxOutputKey string
1095 var sandboxOutputFileID int64
1096 file, err := GetFileByID(eid, fileID)
1097 if err == nil && file != nil && file.OriginType == FileOriginTypeAIGenerated && file.OriginRefID > 0 {
1098 sandboxOutputFileID = file.OriginRefID
1099 if outputFile, outputErr := GetAIUploadFileByID(file.OriginRefID); outputErr == nil && outputFile != nil {
1100 sandboxOutputKey = outputFile.Key
1101 }
1102 }
1103
1104 // 在删除数据之前,先收集需要清理的向量ID
1105 vectorIDs, err := getVectorIDsForFile(eid, fileID)
1106 if err != nil {
1107 log.Printf("获取文件向量ID失败,将跳过向量清理 - EID: %d, FileID: %d, Error: %v", eid, fileID, err)
1108 vectorIDs = []string{} // 设置为空数组,避免后续处理出错
1109 }
1110
1111 // 开启数据库事务
1112 tx := DB.Begin()
1113 defer func() {
1114 if r := recover(); r != nil {
1115 tx.Rollback()
1116 }
1117 }()
1118
1119 // 按依赖关系顺序删除:关联关系 -> 检索块 -> 文档分块 -> 其他数据 -> 文件
1120
1121 var entityIDs []int64
1122 if err := tx.Model(&EntityChunkRelation{}).
1123 Distinct("entity_id").
1124 Where("eid = ? AND file_id = ?", eid, fileID).
1125 Pluck("entity_id", &entityIDs).Error; err != nil {
1126 tx.Rollback()
1127 return fmt.Errorf("查询实体关联失败: %v", err)
1128 }
1129
1130 if err := tx.Where("eid = ? AND file_id = ?", eid, fileID).Delete(&EntityChunkRelation{}).Error; err != nil {
1131 tx.Rollback()
1132 return fmt.Errorf("删除实体关联失败: %v", err)
1133 }
1134
1135 // 1. 删除分块关联关系
1136 if err := tx.Where("eid = ? AND file_id = ?", eid, fileID).Delete(&ChunkRelation{}).Error; err != nil {
1137 tx.Rollback()
1138 return fmt.Errorf("删除分块关联关系失败: %v", err)
1139 }
1140
1141 // 2. 删除检索块
1142 if err := tx.Where("eid = ? AND file_id = ?", eid, fileID).Delete(&RetrievalChunk{}).Error; err != nil {
1143 tx.Rollback()
1144 return fmt.Errorf("删除检索块失败: %v", err)
1145 }
1146
1147 // 3. 删除文档分块
1148 if err := tx.Where("eid = ? AND file_id = ?", eid, fileID).Delete(&DocumentChunk{}).Error; err != nil {
1149 tx.Rollback()
1150 return fmt.Errorf("删除文档分块失败: %v", err)

Callers 2

deleteFileWithCascadeFunction · 0.85

Calls 11

GetFileByIDFunction · 0.85
GetAIUploadFileByIDFunction · 0.85
getVectorIDsForFileFunction · 0.85
CleanupRelatedJobsFunction · 0.85
DeleteUploadFileByIDFunction · 0.85
cleanupVectorDataAsyncFunction · 0.85
PrintfMethod · 0.80
ErrorfMethod · 0.80
DeleteMethod · 0.65

Tested by

no test coverage detected