Added support for profiling. Removed the pkg module altogether. Everything except old sync is now using code generated by sqlc.
93 lines
2.0 KiB
Go
93 lines
2.0 KiB
Go
package database
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"music-server/internal/db"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
type SongData struct {
|
|
GameId int
|
|
SongName string
|
|
Path string
|
|
TimesPlayed int
|
|
FileName string
|
|
}
|
|
|
|
var compareError = errors.New("no rows in result set")
|
|
|
|
func AddSong(song SongData) {
|
|
_, err := db.Dbpool.Exec(db.Ctx,
|
|
"INSERT INTO song(game_id, song_name, path, file_name) VALUES ($1, $2, $3, $4)",
|
|
song.GameId, song.SongName, song.Path, song.FileName)
|
|
if err != nil {
|
|
_, _ = fmt.Fprintf(os.Stderr, "Exec failed: %v\n", err)
|
|
}
|
|
}
|
|
|
|
func CheckSong(songPath string) bool {
|
|
var path string
|
|
err := db.Dbpool.QueryRow(db.Ctx,
|
|
"SELECT path FROM song WHERE path = $1", songPath).Scan(&path)
|
|
if err != nil {
|
|
if compareError.Error() != err.Error() {
|
|
_, _ = fmt.Fprintf(os.Stderr, "QueryRow failed: %v\n", err)
|
|
}
|
|
}
|
|
return path != ""
|
|
}
|
|
|
|
func UpdateSong(songName string, fileName string, path string) {
|
|
_, err := db.Dbpool.Exec(db.Ctx,
|
|
"UPDATE song SET song_name=$1, file_name=$2 WHERE path = $3",
|
|
songName, fileName, path)
|
|
if err != nil {
|
|
_, _ = fmt.Fprintf(os.Stderr, "Exec failed: %v\n", err)
|
|
}
|
|
}
|
|
|
|
func FetchAllSongs() []SongData {
|
|
rows, err := db.Dbpool.Query(db.Ctx,
|
|
"SELECT song_name, path FROM song")
|
|
if err != nil {
|
|
if compareError.Error() != err.Error() {
|
|
_, _ = fmt.Fprintf(os.Stderr, "QueryRow failed: %v\n", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var songDataList []SongData
|
|
for rows.Next() {
|
|
var songName string
|
|
var path string
|
|
|
|
err := rows.Scan(&songName, &path)
|
|
if err != nil {
|
|
if compareError.Error() != err.Error() {
|
|
_, _ = fmt.Fprintf(os.Stderr, "QueryRow failed: %v\n", err)
|
|
}
|
|
}
|
|
|
|
songDataList = append(songDataList, SongData{
|
|
SongName: songName,
|
|
Path: path,
|
|
})
|
|
}
|
|
return songDataList
|
|
}
|
|
|
|
func RemoveBrokenSongs(songs []SongData) {
|
|
joined := ""
|
|
for _, song := range songs {
|
|
joined += "'" + song.Path + "',"
|
|
}
|
|
joined = strings.TrimSuffix(joined, ",")
|
|
|
|
_, err := db.Dbpool.Exec(db.Ctx, "DELETE FROM song where path in ($1)", joined)
|
|
if err != nil {
|
|
_, _ = fmt.Fprintf(os.Stderr, "Exec failed: %v\n", err)
|
|
}
|
|
}
|