func()

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
}