Scheduled maintenance on Saturday, 27 September 2025, from 07:00 AM to 4:00 PM GMT (09:00 AM to 6:00 PM CEST) - some services may be unavailable -

Skip to content
Snippets Groups Projects
Database.py 1.57 KiB
Newer Older
  • Learn to ignore specific revisions
  • Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    import logging
    from typing import List
    from ..engines._DatabaseEngine import _DatabaseEngine
    from .context.Context import Context
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    from .Exceptions import WrongDatabaseEngine, MutexException
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
    
    LOGGER = logging.getLogger(__name__)
    
    class Database:
        def __init__(self, database_engine : _DatabaseEngine):
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            if not isinstance(database_engine, _DatabaseEngine):    
                raise WrongDatabaseEngine('database_engine must inherit from _DatabaseEngine')
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            self._database_engine = database_engine
            self._acquired = False
            self._owner_key = None
    
        def __enter__(self) -> '_DatabaseEngine':
            self._acquired, self._owner_key = self._database_engine.lock()
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            if not self._acquired: raise MutexException('Unable to acquire database lock')
    
    Lluis Gifre Renom's avatar
    Lluis Gifre Renom committed
            return self
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            self._database_engine.unlock(self._owner_key)
    
        def clear_all(self, keep_keys=set()):
            LOGGER.info('Cleaning up...')
            keys = self._database_engine.keys()
            LOGGER.info('  keys before = {}'.format(str(keys)))
            for key in keys:
                if(key in keep_keys): continue
                self._database_engine.delete(key)
            LOGGER.info('  keys after  = {}'.format(str(self._database_engine.keys())))
    
        def dump(self) -> List[str]:
            entries = self._database_engine.dump()
            entries.sort()
            return ['[{:>4s}] {:100s} :: {}'.format(k_type, k_name, k_value) for k_name,k_type,k_value in entries]
    
        def context(self, context_uuid : str) -> Context: return Context(context_uuid, self._database_engine)