"""插件运行时自有数据库端口。""" from __future__ import annotations from collections.abc import Callable, Sequence from pathlib import Path PluginDatabaseEnsure = Callable[[str, Sequence[type], Path | None], None] PluginDatabaseRelease = Callable[[str], None] PluginDatabaseDestroy = Callable[[str], None] def _ignore_ensure( _plugin_id: str, _models: Sequence[type], _migrations: Path | None, ) -> None: """组合根尚未装配时忽略插件建库。""" def _ignore_release(_plugin_id: str) -> None: """组合根尚未装配时忽略插件数据库释放。""" def _ignore_destroy(_plugin_id: str) -> None: """组合根尚未装配时忽略插件数据库销毁。""" class PluginDatabase: """封装插件自有数据库的建立、释放与销毁能力。""" def __init__( self, *, ensure: PluginDatabaseEnsure = _ignore_ensure, release: PluginDatabaseRelease = _ignore_release, destroy: PluginDatabaseDestroy = _ignore_destroy, ) -> None: """保存由启动组合根提供的建库、释放与销毁函数。""" self._ensure = ensure self._release = release self._destroy = destroy def ensure( self, plugin_id: str, models: Sequence[type], migrations: Path | None, ) -> None: """按插件声明建立自有数据库,两项声明都为空时不建库。""" self._ensure(plugin_id, models, migrations) def release(self, plugin_id: str) -> None: """释放插件自有数据库的连接,保留数据。""" self._release(plugin_id) def destroy(self, plugin_id: str) -> None: """销毁插件自有数据库,仅限删除插件数据的路径调用。""" self._destroy(plugin_id) _plugin_database = PluginDatabase() def configure_plugin_database(database: PluginDatabase) -> None: """由启动组合根替换插件自有数据库实现。""" global _plugin_database _plugin_database = database def get_plugin_database() -> PluginDatabase: """返回当前插件自有数据库端口。""" return _plugin_database