Changed trackIndex database structure

This commit is contained in:
strNophix 2022-04-27 13:29:13 +02:00
parent 85c3cdf57f
commit 86654773ef

View File

@ -23,13 +23,25 @@ func NewDirTrackIndex(cfg ModelConfig) trackIndex {
} }
tblStmt := ` tblStmt := `
CREATE TABLE IF NOT EXISTS artist (
artist_id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE
);
CREATE TABLE IF NOT EXISTS album (
album_id INTEGER PRIMARY KEY AUTOINCREMENT,
artist_id INTEGER NOT NULL REFERENCES artist(artist_id) DEFERRABLE INITIALLY DEFERRED,
name TEXT
);
CREATE UNIQUE INDEX IF NOT EXISTS artist_album ON album(artist_id, name);
CREATE TABLE IF NOT EXISTS track ( CREATE TABLE IF NOT EXISTS track (
track_id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL, title TEXT NOT NULL,
album TEXT, album_id INTEGER REFERENCES album(album_id) DEFERRABLE INITIALLY DEFERRED,
artist TEXT NOT NULL, artist_id INTEGER NOT NULL REFERENCES artist(artist_id) DEFERRABLE INITIALLY DEFERRED,
uri TEXT NOT NULL, uri TEXT NOT NULL UNIQUE
trackNumber INTEGER,
trackTotal INTEGER
); );
` `
@ -49,19 +61,46 @@ func NewDirTrackIndex(cfg ModelConfig) trackIndex {
} }
func (ti trackIndex) IndexTracks(tracks []track) error { func (ti trackIndex) IndexTracks(tracks []track) error {
var query string
tx, err := ti.db.Begin() tx, err := ti.db.Begin()
check(err) check(err)
stmt, err := tx.Prepare("insert into track(title, album, artist, uri, trackNumber, trackTotal) values (?, ?, ?, ?, ?, ?)") artistSet := make(map[string]bool)
query = `INSERT OR IGNORE INTO artist(name) VALUES (?)`
artistStmt, err := tx.Prepare(query)
check(err)
albumSet := make(map[string]bool)
query = `
INSERT OR IGNORE INTO album (artist_id, name)
VALUES ((SELECT artist_id FROM artist WHERE name = ?), ?);
`
albumStmt, err := tx.Prepare(query)
check(err)
query = `
INSERT OR IGNORE INTO track (title, uri, artist_id, album_id)
VALUES (?, ?, (SELECT artist_id FROM artist WHERE name = ?), (SELECT album_id FROM album WHERE name = ?));
`
trackStmt, err := tx.Prepare(query)
check(err) check(err)
for _, t := range tracks { for _, t := range tracks {
stmt.Exec(t.Title, t.Album, t.Artist, t.TrackPath, t.TrackNumber, t.TrackTotal) if _, ok := artistSet[t.Artist]; !ok {
artistStmt.Exec(t.Artist)
artistSet[t.Artist] = true
}
key := t.Artist + ":" + t.Album
if _, ok := albumSet[key]; !ok {
albumStmt.Exec(t.Artist, t.Album)
albumSet[key] = true
}
trackStmt.Exec(t.Title, t.TrackPath, t.Artist, t.Album)
} }
err = tx.Commit() tx.Commit()
check(err)
return nil return nil
} }