Files

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)