Changed trackIndex database structure
This commit is contained in:
parent
85c3cdf57f
commit
86654773ef
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user