X-Git-Url: https://plomlompom.com/repos/%7B%7B%20web_path%20%7D%7D/decks/%7B%7Bdeck_id%7D%7D/cards/%7B%7Bcard_id%7D%7D/static/gitweb.js?a=blobdiff_plain;f=plomtask%2Fdb.py;h=fe67e5cc799303efada094f510b537616a30bbd0;hb=4815fe5c7be508e67ceec144968a81bdd6a923d4;hp=2d9ae2714ca9a2e625036ea44f295880db986f16;hpb=7eb81e526c45118a295dbfc12be01f92dc809974;p=plomtask diff --git a/plomtask/db.py b/plomtask/db.py index 2d9ae27..fe67e5c 100644 --- a/plomtask/db.py +++ b/plomtask/db.py @@ -121,7 +121,46 @@ class BaseModel(Generic[BaseModelId]): table_name = '' to_save: list[str] = [] id_: None | BaseModelId - cache_: dict[BaseModelId, Self] = {} + cache_: dict[BaseModelId, Self] + + @classmethod + def get_cached(cls: type[BaseModelInstance], + id_: BaseModelId) -> BaseModelInstance | None: + """Get object of id_ from class's cache, or None if not found.""" + # pylint: disable=consider-iterating-dictionary + cache = cls.get_cache() + if id_ in cache.keys(): + obj = cache[id_] + assert isinstance(obj, cls) + return obj + return None + + @classmethod + def empty_cache(cls) -> None: + """Empty class's cache.""" + cls.cache_ = {} + + @classmethod + def get_cache(cls: type[BaseModelInstance]) -> dict[Any, BaseModel[Any]]: + """Get cache dictionary, create it if not yet existing.""" + if not hasattr(cls, 'cache_'): + d: dict[Any, BaseModel[Any]] = {} + cls.cache_ = d + return cls.cache_ + + def cache(self) -> None: + """Update object in class's cache.""" + if self.id_ is None: + raise HandledException('Cannot cache object without ID.') + cache = self.__class__.get_cache() + cache[self.id_] = self + + def uncache(self) -> None: + """Remove self from cache.""" + if self.id_ is None: + raise HandledException('Cannot un-cache object without ID.') + cache = self.__class__.get_cache() + del cache[self.id_] @classmethod def from_table_row(cls: type[BaseModelInstance], @@ -149,6 +188,22 @@ class BaseModel(Generic[BaseModelId]): break return obj, from_cache + @classmethod + def all(cls: type[BaseModelInstance], + db_conn: DatabaseConnection) -> list[BaseModelInstance]: + """Collect all objects of class.""" + items: dict[BaseModelId, BaseModelInstance] = {} + for k, v in cls.get_cache().items(): + assert isinstance(v, cls) + items[k] = v + already_recorded = items.keys() + for id_ in db_conn.column_all(cls.table_name, 'id'): + if id_ not in already_recorded: + # pylint: disable=no-member + item = cls.by_id(db_conn, id_) # type: ignore[attr-defined] + items[item.id_] = item + return list(items.values()) + def set_int_id(self, id_: int | None) -> None: """Set id_ if >= 1 or None, else fail.""" if (id_ is not None) and id_ < 1: @@ -168,47 +223,3 @@ class BaseModel(Generic[BaseModelId]): if update_with_lastrowid: self.id_ = cursor.lastrowid # type: ignore[assignment] self.cache() - - @classmethod - def get_cached(cls: type[BaseModelInstance], - id_: BaseModelId) -> BaseModelInstance | None: - """Get object of id_ from class's cache, or None if not found.""" - # pylint: disable=consider-iterating-dictionary - if id_ in cls.cache_.keys(): - obj = cls.cache_[id_] - assert isinstance(obj, cls) - return obj - return None - - def cache(self) -> None: - """Update object in class's cache.""" - if self.id_ is None: - raise HandledException('Cannot cache object without ID.') - self.__class__.cache_[self.id_] = self - - def uncache(self) -> None: - """Remove self from cache.""" - if self.id_ is None: - raise HandledException('Cannot un-cache object without ID.') - del self.__class__.cache_[self.id_] - - @classmethod - def empty_cache(cls) -> None: - """Empty class's cache.""" - cls.cache_ = {} - - @classmethod - def all(cls: type[BaseModelInstance], - db_conn: DatabaseConnection) -> list[BaseModelInstance]: - """Collect all objects of class.""" - items: dict[BaseModelId, BaseModelInstance] = {} - for k, v in cls.cache_.items(): - assert isinstance(v, cls) - items[k] = v - already_recorded = items.keys() - for id_ in db_conn.column_all(cls.table_name, 'id'): - if id_ not in already_recorded: - # pylint: disable=no-member - item = cls.by_id(db_conn, id_) # type: ignore[attr-defined] - items[item.id_] = item - return list(items.values())