scan.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package repository
  2. import (
  3. "github.com/felamaslen/go-music-player/pkg/config"
  4. "github.com/felamaslen/go-music-player/pkg/database"
  5. "github.com/felamaslen/go-music-player/pkg/logger"
  6. "github.com/felamaslen/go-music-player/pkg/read"
  7. "github.com/lib/pq"
  8. )
  9. const BATCH_SIZE = 100
  10. const LOG_EVERY = 100;
  11. func InsertMusicIntoDatabase(songs chan *read.Song) {
  12. var l = logger.CreateLogger(config.GetConfig().LogLevel)
  13. db := database.GetConnection()
  14. var batch [BATCH_SIZE]*read.Song
  15. var batchSize = 0
  16. var numAdded = 0
  17. var processBatch = func() {
  18. if batchSize == 0 {
  19. return
  20. }
  21. l.Debug("[INSERT] Processing batch\n")
  22. var trackNumbers pq.Int64Array
  23. var titles pq.StringArray
  24. var artists pq.StringArray
  25. var albums pq.StringArray
  26. var durations pq.Int64Array
  27. var modifiedDates pq.Int64Array
  28. var basePaths pq.StringArray
  29. var relativePaths pq.StringArray
  30. for i := 0; i < batchSize; i++ {
  31. trackNumbers = append(trackNumbers, int64(batch[i].TrackNumber))
  32. titles = append(titles, batch[i].Title)
  33. artists = append(artists, batch[i].Artist)
  34. albums = append(albums, batch[i].Album)
  35. durations = append(durations, int64(batch[i].Duration))
  36. modifiedDates = append(modifiedDates, batch[i].ModifiedDate)
  37. basePaths = append(basePaths, batch[i].BasePath)
  38. relativePaths = append(relativePaths, batch[i].RelativePath)
  39. }
  40. db.MustExec(
  41. `
  42. insert into songs (
  43. track_number
  44. ,title
  45. ,artist
  46. ,album
  47. ,duration
  48. ,modified_date
  49. ,base_path
  50. ,relative_path
  51. )
  52. select * from unnest(
  53. $1::integer[]
  54. ,$2::varchar[]
  55. ,$3::varchar[]
  56. ,$4::varchar[]
  57. ,$5::integer[]
  58. ,$6::bigint[]
  59. ,$7::varchar[]
  60. ,$8::varchar[]
  61. )
  62. on conflict (base_path, relative_path) do update
  63. set
  64. track_number = excluded.track_number
  65. ,title = excluded.title
  66. ,artist = excluded.artist
  67. ,album = excluded.album
  68. ,duration = excluded.duration
  69. ,modified_date = excluded.modified_date
  70. `,
  71. trackNumbers,
  72. titles,
  73. artists,
  74. albums,
  75. durations,
  76. modifiedDates,
  77. basePaths,
  78. relativePaths,
  79. )
  80. l.Debug("[INSERT] Processed batch\n")
  81. batchSize = 0
  82. }
  83. for {
  84. select {
  85. case song, more := <- songs:
  86. if !more {
  87. processBatch()
  88. l.Verbose("[INSERT] Finished inserting %d songs\n", numAdded)
  89. return
  90. }
  91. batch[batchSize] = song
  92. batchSize++
  93. numAdded++
  94. if numAdded % LOG_EVERY == 0 {
  95. l.Verbose("[INSERT] Inserted %d\n", numAdded)
  96. }
  97. if batchSize >= BATCH_SIZE {
  98. processBatch()
  99. }
  100. }
  101. }
  102. }