func()

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()
}