in internal/repo/directory.go [89:128]
func (d *Directory) UpsertParentDirs(storageClass StorageClass, bucket string, objName string, newSize int64, newCount int64) error {
storageColumn := "size_" + strings.ToLower(string(storageClass))
query := fmt.Sprintf(`
INSERT INTO directory (bucket, name, %[1]s, count, parent)
VALUES ($1, $2, $3, $4, $5)
ON CONFLICT(bucket, name)
DO UPDATE
SET %[1]s = %[1]s + $3,
count = count + $4;
`, storageColumn)
if len(bucket) == 0 || len(objName) == 0 {
return errors.New("bucket or name argument is empty")
}
dirName := getParentDir(objName)
tx, err := d.DB.Begin()
if err != nil {
return err
}
defer tx.Rollback() // no-op if commit succeeds
for {
if _, err = tx.Exec(query, bucket, dirName, newSize, newCount, getParentDir(dirName)); err != nil {
return err
}
// Last directory to update is root
if dirName == "/" {
break
}
dirName = getParentDir(dirName)
}
if err := tx.Commit(); err != nil {
return err
}
return nil
}