diff --git a/mypkg/database/db_manager.py b/mypkg/database/db_manager.py new file mode 100644 index 0000000..ce256f2 --- /dev/null +++ b/mypkg/database/db_manager.py @@ -0,0 +1,72 @@ +# mypkg/database/db_manager.py +import json +import os +from typing import Dict, Optional +from datetime import datetime +from ..models.package import Package + + +class DatabaseManager: + """Управляет базой данных установленных пакетов""" + + DB_PATH = "/var/lib/mypkg/installed.json" + + def __init__(self, root: str = "/"): + """ + Args: + root: корень файловой системы (для песочницы) + """ + self.root = root + self.db_path = os.path.join(root, self.DB_PATH.lstrip('/')) + self.installed: Dict[str, Package] = {} + self._load() + + def _load(self): + """Загружает базу из файла""" + if not os.path.exists(self.db_path): + return + + try: + with open(self.db_path, 'r') as f: + data = json.load(f) + + for name, pkg_data in data.items(): + pkg = Package(**pkg_data) + pkg.installed = True + if pkg_data.get('install_date'): + pkg.install_date = datetime.fromisoformat(pkg_data['install_date']) + self.installed[name] = pkg + except Exception as e: + print(f"Ошибка загрузки базы: {e}") + + def save(self): + """Сохраняет базу в файл""" + os.makedirs(os.path.dirname(self.db_path), exist_ok=True) + + data = {} + for name, pkg in self.installed.items(): + data[name] = pkg.to_dict() + + with open(self.db_path, 'w') as f: + json.dump(data, f, indent=2) + + def add_package(self, package: Package): + """Добавляет пакет в базу""" + package.installed = True + package.install_date = datetime.now() + self.installed[package.name] = package + self.save() + + def remove_package(self, name: str): + """Удаляет пакет из базы""" + if name in self.installed: + del self.installed[name] + self.save() + + def is_installed(self, name: str) -> bool: + """Проверяет, установлен ли пакет""" + return name in self.installed + + def get_package(self, name: str) -> Optional[Package]: + """Возвращает установленный пакет""" + return self.installed.get(name) \ No newline at end of file