Skip to content
Snippets Groups Projects
Factory.py 1.59 KiB
Newer Older
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
import logging
from enum import Enum
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
from common.Settings import get_setting
from common.database.api.Database import Database
from common.database.engines.inmemory.InMemoryDatabaseEngine import InMemoryDatabaseEngine
from common.database.engines.redis.RedisDatabaseEngine import RedisDatabaseEngine

LOGGER = logging.getLogger(__name__)

class DatabaseEngineEnum(Enum):
    INMEMORY = 'inmemory'
    REDIS = 'redis'
    #MONGO = 'mongo'
    #RETHINK = 'rethink'
    #ETCD = 'etcd'

ENGINES = {
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    DatabaseEngineEnum.INMEMORY.value: InMemoryDatabaseEngine,
    DatabaseEngineEnum.REDIS.value: RedisDatabaseEngine,
    #DatabaseEngineEnum.MONGO.value: MongoDatabase,
    #DatabaseEngineEnum.RETHINK.value: RethinkDatabase,
    #DatabaseEngineEnum.ETCD.value: EtcdDatabase,
}

DEFAULT_DB_ENGINE = DatabaseEngineEnum.INMEMORY

def get_database(engine=None, **settings) -> Database:
    # return an instance of Database initialized with selected engine.
    # Engine is selected using following criteria (first that is not None is selected):
    # 1. user selected by parameter (engine=...)
    # 2. environment variable DB_ENGINE
    # 3. default engine: INMEMORY
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    if engine is None: engine = get_setting('DB_ENGINE', default=DEFAULT_DB_ENGINE)
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    if engine is None: raise Exception('Database Engine not specified')
    if isinstance(engine, DatabaseEngineEnum): engine = engine.value
    engine_class = ENGINES.get(engine)
Lluis Gifre Renom's avatar
Lluis Gifre Renom committed
    if engine_class is None: raise Exception('Unsupported DatabaseEngine({})'.format(engine))
    LOGGER.info('Selected Database Engine: {}'.format(engine))
    return Database(engine_class(**settings))