Source code for ska_db_oda.unit_of_work.filesystemunitofwork

"""
FilesystemUnitOfWork adds unit of work transaction support to the FilesystemRepository.
"""
# We mimic the database commit/rollback by accessing the transactions inside the repository
# pylint: disable=protected-access
import logging
from os import PathLike
from pathlib import Path
from typing import Union

from ska_db_oda.domain.repository import (
    ExecutionBlockRepository,
    ProjectRepository,
    ProposalRepository,
    SBDefinitionRepository,
    SBInstanceRepository,
)
from ska_db_oda.infrastructure.filesystem.mapping import (
    ExecutionBlockMapping,
    ProjectMapping,
    ProposalMapping,
    SBDefinitionMapping,
    SBInstanceMapping,
)
from ska_db_oda.infrastructure.filesystem.repository import FilesystemBridge
from ska_db_oda.unit_of_work.abstractunitofwork import AbstractUnitOfWork

LOGGER = logging.getLogger(__name__)


[docs] class FilesystemUnitOfWork(AbstractUnitOfWork): """ Implementation of the AbstractUnitOfWork which persists the data in the filesystem """ def __init__(self, base_working_dir: Union[str, PathLike] = Path("/var/lib/oda")): self._base_working_dir = base_working_dir def __enter__(self): self.sbds = SBDefinitionRepository( FilesystemBridge(SBDefinitionMapping(), self._base_working_dir) ) self.sbis = SBInstanceRepository( FilesystemBridge(SBInstanceMapping(), self._base_working_dir) ) self.ebs = ExecutionBlockRepository( FilesystemBridge(ExecutionBlockMapping(), self._base_working_dir) ) self.prjs = ProjectRepository( FilesystemBridge(ProjectMapping(), self._base_working_dir) ) self.prsls = ProposalRepository( FilesystemBridge(ProposalMapping(), self._base_working_dir) ) return super().__enter__()
[docs] def commit(self) -> None: """Implementation of the AbstractUnitOfWork method. See :func:`~ska_db_oda.unit_of_work.abstractunitofwork.AbstractUnitOfWork.commit` docstring for details """ self._commit_transactions_for_repo(self.sbds._bridge) self._commit_transactions_for_repo(self.sbis._bridge) self._commit_transactions_for_repo(self.ebs._bridge) self._commit_transactions_for_repo(self.prjs._bridge) self._commit_transactions_for_repo(self.prsls._bridge)
[docs] def rollback(self) -> None: """Implementation of the AbstractUnitOfWork method. See :func:`~ska_db_oda.unit_of_work.abstractunitofwork.AbstractUnitOfWork.rollback` docstring for details """ self._rollback_transactions_for_repo(self.sbds._bridge) self._rollback_transactions_for_repo(self.sbis._bridge) self._rollback_transactions_for_repo(self.ebs._bridge) self._rollback_transactions_for_repo(self.prjs._bridge) self._rollback_transactions_for_repo(self.prsls._bridge)
def _commit_transactions_for_repo(self, repo_bridge: FilesystemBridge) -> None: """ Mimics the commit of a database transaction by writing the entities that are 'pending' in the filesystem Repository """ for path, entity_string in repo_bridge._transactions.items(): LOGGER.debug("Committing entity to filesystem path %s", path) path.write_text(entity_string) repo_bridge._transactions.clear() def _rollback_transactions_for_repo(self, repo_bridge: FilesystemBridge) -> None: """ Mimics the rollback of a database transaction by removing the entities that are 'pending' in the filesystem Repository """ repo_bridge._transactions.clear()