добавила DatabaseManager для хранения установленных пакетов
This commit is contained in:
72
mypkg/database/db_manager.py
Normal file
72
mypkg/database/db_manager.py
Normal file
@@ -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)
|
||||
Reference in New Issue
Block a user