добавила 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