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
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 (
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
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
# 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)