in internal/repo/directory.go [48:86]
func (d *Directory) UpsertArchiveParentDirs(oldStorageClass StorageClass, newStorageClass StorageClass, bucket, objName string, size int64) error {
oldStorageColumn := "size_" + strings.ToLower(string(oldStorageClass))
newStorageColumn := "size_" + strings.ToLower(string(newStorageClass))
query := fmt.Sprintf(`
INSERT INTO directory (bucket, name, %[2]s, parent, count)
VALUES ($1, $2, $3, $4, 1)
ON CONFLICT(bucket, name)
DO UPDATE
SET %[1]s = %[1]s - $3,
%[2]s = %[2]s + $3;
`, oldStorageColumn, newStorageColumn)
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, size, getParentDir(dirName)); err != nil {
return err
}
// Last directory to update is root
if dirName == "/" {
break
}
dirName = getParentDir(dirName)
}
return tx.Commit()
}