48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
"""Точка входа слоя хранения: открыть БД, применить миграции, собрать движок."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
from dataclasses import dataclass
|
|
|
|
from .apply import Applier, ApplyEngine
|
|
from .db import Database
|
|
from .repository import Store
|
|
from .state import StateSnapshot
|
|
|
|
|
|
@dataclass(slots=True)
|
|
class Storage:
|
|
"""Собранный слой хранения для приложения."""
|
|
|
|
db: Database
|
|
store: Store
|
|
engine: ApplyEngine
|
|
|
|
def close(self) -> None:
|
|
self.db.close()
|
|
|
|
def __enter__(self) -> Storage:
|
|
return self
|
|
|
|
def __exit__(self, *exc_info: object) -> None:
|
|
self.close()
|
|
|
|
|
|
def open_storage(
|
|
path: str | os.PathLike[str] | None = None,
|
|
*,
|
|
applier: Applier | None = None,
|
|
actor: str = "system",
|
|
auto_migrate: bool = True,
|
|
) -> Storage:
|
|
"""Открыть хранилище: на пустом ``/data`` схема поднимается автоматически."""
|
|
db = Database(path, auto_migrate=auto_migrate)
|
|
store = Store(db)
|
|
return Storage(db=db, store=store, engine=ApplyEngine(store, applier, actor=actor))
|
|
|
|
|
|
def rollback_to(engine: ApplyEngine, plan_id: int, *, reason: str = "") -> StateSnapshot:
|
|
"""Явный откат состояния к снимку плана (тонкая обёртка для API)."""
|
|
return engine.rollback(plan_id, reason=reason)
|