예제 #1
0
// Deletes all entries that have an outdated timestamp dbmtime. Also cleans up
// entries in Artist and Album table that are not referenced anymore in the
// Track-table.
//
// Returns the number of deleted rows and an error.
func deleteDanglingEntries(db *database.Database) (int64, error) {
	r, err := db.Execute("DELETE FROM Track WHERE dbmtime <> ?", db.Mtime())
	deletedTracks, _ := r.RowsAffected()
	if err != nil {
		return deletedTracks, err
	}

	if _, err := db.Execute("DELETE FROM Album WHERE ID IN " +
		"(SELECT Album.ID FROM Album LEFT JOIN Track ON " +
		"Album.ID = Track.album_id WHERE Track.album_id " +
		"IS NULL);"); err != nil {
		return deletedTracks, err
	}

	if _, err := db.Execute("DELETE FROM Artist WHERE ID IN " +
		"(SELECT Artist.ID FROM Artist LEFT JOIN Album ON " +
		"Artist.ID = Album.artist_id WHERE Album.artist_id " +
		"IS NULL);"); err != nil {
		return deletedTracks, err
	}

	return deletedTracks, nil
}