Fix bucket_stats error

This commit is contained in:
DullJZ
2025-09-11 00:43:39 +08:00
parent 4441dbc27b
commit 34629444db
+28 -16
View File
@@ -204,31 +204,42 @@ func (s *Service) GetBucketObjectCount(bucketName string) (int64, error) {
func (s *Service) updateBucketStats(bucketName string) error { func (s *Service) updateBucketStats(bucketName string) error {
var stats BucketStats var stats BucketStats
// 获取或创建统计记录
result := s.db.Where("bucket_name = ?", bucketName).FirstOrCreate(&stats, BucketStats{
BucketName: bucketName,
LastCheckedAt: time.Now(),
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
})
if result.Error != nil {
return fmt.Errorf("failed to get bucket stats: %w", result.Error)
}
// 计算新的统计数据 // 计算新的统计数据
var count int64 var count int64
var totalSize int64 var totalSize int64
s.db.Model(&Object{}). if err := s.db.Model(&Object{}).
Where("bucket_name = ?", bucketName). Where("bucket_name = ?", bucketName).
Count(&count) Count(&count).Error; err != nil {
return fmt.Errorf("failed to count objects: %w", err)
}
s.db.Model(&Object{}). if err := s.db.Model(&Object{}).
Where("bucket_name = ?", bucketName). Where("bucket_name = ?", bucketName).
Select("COALESCE(SUM(size), 0)"). Select("COALESCE(SUM(size), 0)").
Scan(&totalSize) Scan(&totalSize).Error; err != nil {
return fmt.Errorf("failed to sum object sizes: %w", err)
}
// 更新统计数据 // 尝试查找现有记录
err := s.db.Where("bucket_name = ?", bucketName).First(&stats).Error
if err == gorm.ErrRecordNotFound {
// 记录不存在,创建新记录
stats = BucketStats{
BucketName: bucketName,
ObjectCount: count,
TotalSize: totalSize,
LastCheckedAt: time.Now(),
}
if err := s.db.Create(&stats).Error; err != nil {
return fmt.Errorf("failed to create bucket stats: %w", err)
}
} else if err != nil {
// 其他数据库错误
return fmt.Errorf("failed to query bucket stats: %w", err)
} else {
// 记录存在,更新统计数据
updates := map[string]interface{}{ updates := map[string]interface{}{
"object_count": count, "object_count": count,
"total_size": totalSize, "total_size": totalSize,
@@ -238,6 +249,7 @@ func (s *Service) updateBucketStats(bucketName string) error {
if err := s.db.Model(&stats).Updates(updates).Error; err != nil { if err := s.db.Model(&stats).Updates(updates).Error; err != nil {
return fmt.Errorf("failed to update bucket stats: %w", err) return fmt.Errorf("failed to update bucket stats: %w", err)
} }
}
return nil return nil
} }