feat(store): SQLite WAL, миграции, валидация, аудит, снимки состояния (#20)
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
"""Точка входа слоя хранения: открыть БД, применить миграции, собрать движок."""
|
||||
|
||||
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)
|
||||
Reference in New Issue
Block a user