add bulk genre insert
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/gorilla/securecookie"
|
"github.com/gorilla/securecookie"
|
||||||
"github.com/jinzhu/gorm"
|
"github.com/jinzhu/gorm"
|
||||||
@@ -112,6 +113,21 @@ func (db *DB) GetOrCreateKey(key string) string {
|
|||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (db *DB) InsertBulkLeftMany(table string, head []string, left int, col []int) error {
|
||||||
|
var rows []string
|
||||||
|
var values []interface{}
|
||||||
|
for _, c := range col {
|
||||||
|
rows = append(rows, "(?, ?)")
|
||||||
|
values = append(values, left, c)
|
||||||
|
}
|
||||||
|
q := fmt.Sprintf("INSERT OR IGNORE INTO %q (%s) VALUES %s",
|
||||||
|
table,
|
||||||
|
strings.Join(head, ", "),
|
||||||
|
strings.Join(rows, ", "),
|
||||||
|
)
|
||||||
|
return db.Exec(q, values...).Error
|
||||||
|
}
|
||||||
|
|
||||||
func (db *DB) GetUserByID(id int) *User {
|
func (db *DB) GetUserByID(id int) *User {
|
||||||
user := &User{}
|
user := &User{}
|
||||||
err := db.
|
err := db.
|
||||||
@@ -136,6 +152,10 @@ func (db *DB) GetUserByName(name string) *User {
|
|||||||
return user
|
return user
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (db *DB) Begin() *DB {
|
||||||
|
return &DB{DB: db.DB.Begin()}
|
||||||
|
}
|
||||||
|
|
||||||
type ChunkFunc func(*gorm.DB, []int64) error
|
type ChunkFunc func(*gorm.DB, []int64) error
|
||||||
|
|
||||||
func (db *DB) TransactionChunked(data []int64, cb ChunkFunc) error {
|
func (db *DB) TransactionChunked(data []int64, cb ChunkFunc) error {
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ type Scanner struct {
|
|||||||
// these two are for the transaction we do for every folder.
|
// these two are for the transaction we do for every folder.
|
||||||
// the boolean is there so we dont begin or commit multiple
|
// the boolean is there so we dont begin or commit multiple
|
||||||
// times in the handle folder or post children callback
|
// times in the handle folder or post children callback
|
||||||
trTx *gorm.DB
|
trTx *db.DB
|
||||||
trTxOpen bool
|
trTxOpen bool
|
||||||
// these two are for keeping state between noted in the tree.
|
// these two are for keeping state between noted in the tree.
|
||||||
// eg. keep track of a parents folder or the path to a cover
|
// eg. keep track of a parents folder or the path to a cover
|
||||||
@@ -411,38 +411,24 @@ func (s *Scanner) handleTrack(it *item) error {
|
|||||||
// ** begin set album artist basics
|
// ** begin set album artist basics
|
||||||
artistName := firstTag("Unknown Artist", trTags.AlbumArtist, trTags.Artist)
|
artistName := firstTag("Unknown Artist", trTags.AlbumArtist, trTags.Artist)
|
||||||
artist := &db.Artist{}
|
artist := &db.Artist{}
|
||||||
err = s.trTx.
|
s.trTx.
|
||||||
Select("id").
|
|
||||||
Where("name=?", artistName).
|
Where("name=?", artistName).
|
||||||
First(artist).
|
Assign(db.Artist{
|
||||||
Error
|
Name: artistName,
|
||||||
if gorm.IsRecordNotFoundError(err) {
|
NameUDec: decoded(artistName),
|
||||||
artist.Name = artistName
|
}).
|
||||||
artist.NameUDec = decoded(artistName)
|
FirstOrCreate(artist)
|
||||||
if err := s.trTx.Save(artist).Error; err != nil {
|
|
||||||
return fmt.Errorf("writing artists table: %w", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
track.ArtistID = artist.ID
|
track.ArtistID = artist.ID
|
||||||
|
|
||||||
// ** begin set genre
|
// ** begin set genre
|
||||||
genreTag := firstTag("Unknown Genre", trTags.Genre)
|
genreTag := firstTag("Unknown Genre", trTags.Genre)
|
||||||
genres := strings.Split(genreTag, s.genreSplit)
|
genreNames := strings.Split(genreTag, s.genreSplit)
|
||||||
genreIDs := []int{}
|
genreIDs := []int{}
|
||||||
for _, genreName := range genres {
|
for _, genreName := range genreNames {
|
||||||
// TODO insert or ignore
|
|
||||||
genre := &db.Genre{}
|
genre := &db.Genre{}
|
||||||
err = s.trTx.
|
s.trTx.FirstOrCreate(genre, db.Genre{
|
||||||
Select("id").
|
Name: genreName,
|
||||||
Where("name=?", genreName).
|
})
|
||||||
First(genre).
|
|
||||||
Error
|
|
||||||
if gorm.IsRecordNotFoundError(err) {
|
|
||||||
genre.Name = genreName
|
|
||||||
if err := s.trTx.Save(genre).Error; err != nil {
|
|
||||||
return fmt.Errorf("writing genres table: %w", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
genreIDs = append(genreIDs, genre.ID)
|
genreIDs = append(genreIDs, genre.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -450,11 +436,14 @@ func (s *Scanner) handleTrack(it *item) error {
|
|||||||
if err := s.trTx.Save(track).Error; err != nil {
|
if err := s.trTx.Save(track).Error; err != nil {
|
||||||
return fmt.Errorf("writing track table: %w", err)
|
return fmt.Errorf("writing track table: %w", err)
|
||||||
}
|
}
|
||||||
for _, genreID := range genreIDs {
|
err = s.trTx.InsertBulkLeftMany(
|
||||||
trackGenre := &db.TrackGenre{TrackID: track.ID, GenreID: genreID}
|
"track_genres",
|
||||||
if err := s.trTx.Save(trackGenre).Error; err != nil {
|
[]string{"track_id", "genre_id"},
|
||||||
return fmt.Errorf("writing track table: %w", err)
|
track.ID,
|
||||||
}
|
genreIDs,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("insert bulk track genres: %w", err)
|
||||||
}
|
}
|
||||||
s.seenTracksNew++
|
s.seenTracksNew++
|
||||||
|
|
||||||
@@ -464,11 +453,14 @@ func (s *Scanner) handleTrack(it *item) error {
|
|||||||
// the folder hasn't been modified or already has it's tags
|
// the folder hasn't been modified or already has it's tags
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
for _, genreID := range genreIDs {
|
err = s.trTx.InsertBulkLeftMany(
|
||||||
albumGenre := &db.AlbumGenre{AlbumID: folder.ID, GenreID: genreID}
|
"album_genres",
|
||||||
if err := s.trTx.Save(albumGenre).Error; err != nil {
|
[]string{"album_id", "genre_id"},
|
||||||
return fmt.Errorf("writing album table: %w", err)
|
folder.ID,
|
||||||
}
|
genreIDs,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("insert bulk album genres: %w", err)
|
||||||
}
|
}
|
||||||
folder.TagTitle = trTags.Album()
|
folder.TagTitle = trTags.Album()
|
||||||
folder.TagTitleUDec = decoded(trTags.Album())
|
folder.TagTitleUDec = decoded(trTags.Album())
|
||||||
|
|||||||
Reference in New Issue
Block a user