Add method to clear all items from the cache (#422)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Fri, 15 Jul 2022 17:18:08 +0000 (19:18 +0200)
committerGitHub <noreply@github.com>
Fri, 15 Jul 2022 17:18:08 +0000 (19:18 +0200)
music_assistant/controllers/music/__init__.py
music_assistant/helpers/cache.py
music_assistant/helpers/database.py

index 092c29f000cf471a595926f00861247acb717b67..ddb976852154c89cf1d0631cb4d2ffd7d590b928 100755 (executable)
@@ -10,11 +10,7 @@ from music_assistant.controllers.music.artists import ArtistsController
 from music_assistant.controllers.music.playlists import PlaylistController
 from music_assistant.controllers.music.radio import RadioController
 from music_assistant.controllers.music.tracks import TracksController
-from music_assistant.helpers.database import (
-    TABLE_CACHE,
-    TABLE_PLAYLOG,
-    TABLE_TRACK_LOUDNESS,
-)
+from music_assistant.helpers.database import TABLE_PLAYLOG, TABLE_TRACK_LOUDNESS
 from music_assistant.helpers.datetime import utc_timestamp
 from music_assistant.helpers.uri import parse_uri
 from music_assistant.models.config import MusicProviderConfig
@@ -426,9 +422,7 @@ class MusicController:
         for prov_id in removed_providers:
 
             # clean cache items from deleted provider(s)
-            await self.mass.database.delete_where_query(
-                TABLE_CACHE, f"key LIKE '%{prov_id}%'"
-            )
+            self.mass.cache.clear(prov_id)
 
             # cleanup media items from db matched to deleted provider
             for ctrl in (
index 57a95b2fe101b7b3e936eef24cc1a4651b081511..db9d1a4acbc258b7f218546c66c75d8443f57c92 100644 (file)
@@ -7,7 +7,7 @@ import json
 import time
 from collections import OrderedDict
 from collections.abc import MutableMapping
-from typing import TYPE_CHECKING, Any, Iterator
+from typing import TYPE_CHECKING, Any, Iterator, Optional
 
 from music_assistant.helpers.database import TABLE_CACHE
 
@@ -94,6 +94,12 @@ class Cache:
         self._mem_cache.pop(cache_key, None)
         await self.mass.database.delete(TABLE_CACHE, {"key": cache_key})
 
+    async def clear(self, key_filter: Optional[str] = None) -> None:
+        """Clear all/partial items from cache."""
+        self._mem_cache = {}
+        query = f"key LIKE '%{key_filter}%'" if key_filter else None
+        await self.mass.database.delete(TABLE_CACHE, query=query)
+
     async def auto_cleanup(self):
         """Sceduled auto cleanup task."""
         # for now we simply reset the memory cache
index 3f237dd4dc90049c218c411b1a5da4f21f3e535e..65d7a64d6a885f04f52dcf63d93e1b338a4d364a 100755 (executable)
@@ -156,13 +156,22 @@ class Database:
         # return updated item
         return await self.get_row(table, match)
 
-    async def delete(self, table: str, match: Dict[str, Any]) -> None:
+    async def delete(
+        self, table: str, match: Optional[dict] = None, query: Optional[str] = None
+    ) -> None:
         """Delete data in given table."""
-        sql_query = f"DELETE FROM {table}"
-        sql_query += " WHERE " + " AND ".join((f"{x} = :{x}" for x in match))
+        assert "where" not in query.lower()
+        sql_query = f"DELETE FROM {table} "
+        if match:
+            sql_query += " WHERE " + " AND ".join((f"{x} = :{x}" for x in match))
+        elif query and "query" not in query.lower():
+            sql_query += "WHERE " + query
+        elif query:
+            sql_query += query
+
         await self.execute(sql_query, match)
 
-    async def delete_where_query(self, table: str, query: str) -> None:
+    async def delete_where_query(self, table: str, query: Optional[str] = None) -> None:
         """Delete data in given table using given where clausule."""
         sql_query = f"DELETE FROM {table} WHERE {query}"
         await self.execute(sql_query)