| | """Database package exports. |
| | |
| | This package exposes both the new SQLAlchemy-based ``DatabaseManager`` and the |
| | legacy SQLite-backed ``Database`` class that the existing application modules |
| | still import via ``from database import Database``. During the transition phase |
| | we dynamically load the legacy implementation from the root ``database.py`` |
| | module (renamed here as ``legacy_database`` when importing) and fall back to the |
| | new manager if that module is unavailable. |
| | """ |
| |
|
| | from importlib import util as _importlib_util |
| | from pathlib import Path as _Path |
| | from typing import Optional as _Optional |
| |
|
| | from .db_manager import DatabaseManager |
| |
|
| | def _load_legacy_database() -> _Optional[type]: |
| | """Load the legacy Database class from the root-level ``database.py`` if it exists.""" |
| | legacy_path = _Path(__file__).resolve().parent.parent / "database.py" |
| | if not legacy_path.exists(): |
| | return None |
| |
|
| | spec = _importlib_util.spec_from_file_location("legacy_database", legacy_path) |
| | if spec is None or spec.loader is None: |
| | return None |
| |
|
| | module = _importlib_util.module_from_spec(spec) |
| | try: |
| | spec.loader.exec_module(module) |
| | except Exception: |
| | |
| | return None |
| |
|
| | return getattr(module, "Database", None) |
| |
|
| |
|
| | _LegacyDatabase = _load_legacy_database() |
| |
|
| | if _LegacyDatabase is not None: |
| | Database = _LegacyDatabase |
| | else: |
| | Database = DatabaseManager |
| |
|
| | __all__ = ["DatabaseManager", "Database", "CryptoDatabase"] |
| |
|
| | |
| | CryptoDatabase = Database |
| |
|