navidrome/db/migration/20230209181414_change_image...

61 lines
1.3 KiB
Go

package migrations
import (
"database/sql"
"path/filepath"
"strings"
"github.com/navidrome/navidrome/consts"
"github.com/navidrome/navidrome/log"
"github.com/pressly/goose/v3"
"golang.org/x/exp/slices"
)
func init() {
goose.AddMigration(upChangeImageFilesListSeparator, downChangeImageFilesListSeparator)
}
func upChangeImageFilesListSeparator(tx *sql.Tx) error {
//nolint:gosec
rows, err := tx.Query(`select id, image_files from album`)
if err != nil {
return err
}
stmt, err := tx.Prepare("update album set image_files = ? where id = ?")
if err != nil {
return err
}
var id string
var imageFiles sql.NullString
for rows.Next() {
err = rows.Scan(&id, &imageFiles)
if err != nil {
return err
}
files := upChangeImageFilesListSeparatorDirs(imageFiles.String)
if files == imageFiles.String {
continue
}
_, err = stmt.Exec(files, id)
if err != nil {
log.Error("Error updating album's image file list", "files", files, "id", id, err)
}
}
return rows.Err()
}
func upChangeImageFilesListSeparatorDirs(filePaths string) string {
allPaths := filepath.SplitList(filePaths)
slices.Sort(allPaths)
allPaths = slices.Compact(allPaths)
return strings.Join(allPaths, consts.Zwsp)
}
func downChangeImageFilesListSeparator(tx *sql.Tx) error {
// This code is executed when the migration is rolled back.
return nil
}