| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- package repository
- import (
- "errors"
- "github.com/felamaslen/go-music-player/pkg/read"
- "github.com/jmoiron/sqlx"
- "github.com/lib/pq"
- )
- const BATCH_SIZE = 100
- func SelectSong(db *sqlx.DB, id int) (song *read.Song, err error) {
- var songs []*read.Song
- err = db.Select(&songs, `
- select
- track_number
- ,title
- ,artist
- ,album
- ,duration
- ,modified_date
- ,base_path
- ,relative_path
- from songs
- where id = $1
- `, int64(id))
- if len(songs) == 0 {
- err = errors.New("No such ID")
- } else {
- song = songs[0]
- }
- return
- }
- func BatchUpsertSongs(db *sqlx.DB, batch *[BATCH_SIZE]*read.Song, batchSize int) error {
- var trackNumbers pq.Int64Array
- var titles pq.StringArray
- var artists pq.StringArray
- var albums pq.StringArray
- var durations pq.Int64Array
- var modifiedDates pq.Int64Array
- var basePaths pq.StringArray
- var relativePaths pq.StringArray
- for i := 0; i < batchSize; i++ {
- trackNumbers = append(trackNumbers, int64((*batch)[i].TrackNumber))
- titles = append(titles, (*batch)[i].Title)
- artists = append(artists, (*batch)[i].Artist)
- albums = append(albums, (*batch)[i].Album)
- durations = append(durations, int64((*batch)[i].Duration))
- modifiedDates = append(modifiedDates, (*batch)[i].ModifiedDate)
- basePaths = append(basePaths, (*batch)[i].BasePath)
- relativePaths = append(relativePaths, (*batch)[i].RelativePath)
- }
- _, err := db.Exec(
- `
- insert into songs (
- track_number
- ,title
- ,artist
- ,album
- ,duration
- ,modified_date
- ,base_path
- ,relative_path
- )
- select * from unnest(
- $1::integer[]
- ,$2::varchar[]
- ,$3::varchar[]
- ,$4::varchar[]
- ,$5::integer[]
- ,$6::bigint[]
- ,$7::varchar[]
- ,$8::varchar[]
- )
- on conflict (base_path, relative_path) do update
- set
- track_number = excluded.track_number
- ,title = excluded.title
- ,artist = excluded.artist
- ,album = excluded.album
- ,duration = excluded.duration
- ,modified_date = excluded.modified_date
- `,
- trackNumbers,
- titles,
- artists,
- albums,
- durations,
- modifiedDates,
- basePaths,
- relativePaths,
- )
- return err
- }
|