From 261764f28fb58123c9fdf7c67ed661bf0c7966ca Mon Sep 17 00:00:00 2001 From: Marcel van der Veldt Date: Fri, 15 Jul 2022 19:18:08 +0200 Subject: [PATCH] Add method to clear all items from the cache (#422) --- music_assistant/controllers/music/__init__.py | 10 ++-------- music_assistant/helpers/cache.py | 8 +++++++- music_assistant/helpers/database.py | 17 +++++++++++++---- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/music_assistant/controllers/music/__init__.py b/music_assistant/controllers/music/__init__.py index 092c29f0..ddb97685 100755 --- a/music_assistant/controllers/music/__init__.py +++ b/music_assistant/controllers/music/__init__.py @@ -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 ( diff --git a/music_assistant/helpers/cache.py b/music_assistant/helpers/cache.py index 57a95b2f..db9d1a4a 100644 --- a/music_assistant/helpers/cache.py +++ b/music_assistant/helpers/cache.py @@ -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 diff --git a/music_assistant/helpers/database.py b/music_assistant/helpers/database.py index 3f237dd4..65d7a64d 100755 --- a/music_assistant/helpers/database.py +++ b/music_assistant/helpers/database.py @@ -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) -- 2.34.1