songs.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package repository
  2. import (
  3. "errors"
  4. "github.com/felamaslen/go-music-player/pkg/read"
  5. "github.com/jmoiron/sqlx"
  6. "github.com/lib/pq"
  7. )
  8. const BATCH_SIZE = 100
  9. func SelectSong(db *sqlx.DB, id int) (song *read.Song, err error) {
  10. var songs []*read.Song
  11. err = db.Select(&songs, `
  12. select
  13. track_number
  14. ,title
  15. ,artist
  16. ,album
  17. ,duration
  18. ,modified_date
  19. ,base_path
  20. ,relative_path
  21. from songs
  22. where id = $1
  23. `, int64(id))
  24. if len(songs) == 0 {
  25. err = errors.New("No such ID")
  26. } else {
  27. song = songs[0]
  28. }
  29. return
  30. }
  31. func BatchUpsertSongs(db *sqlx.DB, batch *[BATCH_SIZE]*read.Song, batchSize int) error {
  32. var trackNumbers pq.Int64Array
  33. var titles pq.StringArray
  34. var artists pq.StringArray
  35. var albums pq.StringArray
  36. var durations pq.Int64Array
  37. var modifiedDates pq.Int64Array
  38. var basePaths pq.StringArray
  39. var relativePaths pq.StringArray
  40. for i := 0; i < batchSize; i++ {
  41. trackNumbers = append(trackNumbers, int64((*batch)[i].TrackNumber))
  42. titles = append(titles, (*batch)[i].Title)
  43. artists = append(artists, (*batch)[i].Artist)
  44. albums = append(albums, (*batch)[i].Album)
  45. durations = append(durations, int64((*batch)[i].Duration))
  46. modifiedDates = append(modifiedDates, (*batch)[i].ModifiedDate)
  47. basePaths = append(basePaths, (*batch)[i].BasePath)
  48. relativePaths = append(relativePaths, (*batch)[i].RelativePath)
  49. }
  50. _, err := db.Exec(
  51. `
  52. insert into songs (
  53. track_number
  54. ,title
  55. ,artist
  56. ,album
  57. ,duration
  58. ,modified_date
  59. ,base_path
  60. ,relative_path
  61. )
  62. select * from unnest(
  63. $1::integer[]
  64. ,$2::varchar[]
  65. ,$3::varchar[]
  66. ,$4::varchar[]
  67. ,$5::integer[]
  68. ,$6::bigint[]
  69. ,$7::varchar[]
  70. ,$8::varchar[]
  71. )
  72. on conflict (base_path, relative_path) do update
  73. set
  74. track_number = excluded.track_number
  75. ,title = excluded.title
  76. ,artist = excluded.artist
  77. ,album = excluded.album
  78. ,duration = excluded.duration
  79. ,modified_date = excluded.modified_date
  80. `,
  81. trackNumbers,
  82. titles,
  83. artists,
  84. albums,
  85. durations,
  86. modifiedDates,
  87. basePaths,
  88. relativePaths,
  89. )
  90. return err
  91. }