db: Clear MappedPlaylists before deleting

Otherwise we end up with a bunch of (playlistid, trackid) pairs in the
map table that don't refer to a valid playlist anymore.

Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
Anna Schumaker 2021-10-16 18:33:00 -04:00
parent 729b1efc9a
commit 8917600970
5 changed files with 16 additions and 2 deletions

View File

@ -25,7 +25,9 @@ class Genre(playlist.MappedPlaylist):
playlist.MappedPlaylist.__init__(self, row, "emblem-generic", "genre_map")
self._name = row["name"]
def delete(self): Table.delete(self)
def delete(self):
self.clear()
Table.delete(self)
@GObject.Property
def name(self): return self._name

View File

@ -50,6 +50,10 @@ class MappedPlaylist(Playlist):
f"({self.rowkey}, trackid) VALUES (?, ?)",
[ self.rowid, track.rowid ]).rowcount == 1
def clear(self):
sql.execute(f"DELETE FROM {self.map_table} "
f"WHERE {self.rowkey}=?", [ self.rowid ])
def get_n_tracks(self):
cur = sql.execute(f"SELECT COUNT(*) FROM {self.map_table} "
f"WHERE {self._rowkey}=?", [ self._rowid ])

View File

@ -19,8 +19,11 @@ class TestGenre(unittest.TestCase):
self.assertEqual(genre.get_property("map-table"), "genre_map")
def test_delete(self):
track = db.make_fake_track(1, 1, "Test Track", "/a/b/c/1.ogg")
genre = db.genre.Table.find("Test Genre")
genre.add_track(track)
genre.delete()
self.assertEqual(genre.get_n_tracks(), 0)
self.assertIsNone(db.genre.Table.lookup("Test Genre"))
def test_add_remove_track(self):

View File

@ -157,8 +157,11 @@ class TestUserPlaylist(unittest.TestCase):
self.assertFalse(plist.plist_state.loop)
def test_delete(self):
track = db.make_fake_track(1, 1, "Test Track", "/a/b/c/1.ogg")
plist = db.user.Table.find("Test Playlist")
plist.add_track(track)
plist.delete()
self.assertEqual(plist.get_n_tracks(), 0)
self.assertIsNone(db.user.Table.lookup("Test Playlist"))
def test_add_remove_track(self):

View File

@ -35,7 +35,9 @@ class UserPlaylist(playlist.MappedPlaylist):
playlist.MappedPlaylist.__init__(self, row, icon_name, map_table)
self._name = row["name"]
def delete(self): Table.delete(self)
def delete(self):
self.clear()
Table.delete(self)
@GObject.Property
def name(self): return self._name