Source code for registry.services.datastore.util

from typing import Generator, Tuple, List
from datetime import datetime
from pytz import timezone
from contextlib import contextmanager

from sqlalchemy.engine import Engine
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm.session import Session

from arxiv.base.globals import get_application_config, get_application_global

from .models import Base


[docs]@contextmanager def transaction(commit: bool = True) -> Generator: """Context manager for database transaction.""" session = current_session() try: yield session if commit: session.commit() except Exception as e: # logger.debug('Commit failed, rolling back: %s', str(e)) session.rollback() raise
[docs]def init_app(app: object = None) -> None: """Set default configuration parameters for an application instance.""" config = get_application_config(app) config.setdefault('REGISTRY_DATABASE_URI', 'sqlite://')
def _get_engine(app: object = None) -> Engine: """Get a new :class:`.Engine` for the registry database.""" config = get_application_config(app) database_uri = config.get('REGISTRY_DATABASE_URI', 'sqlite://') return create_engine(database_uri) def _get_session(app: object = None) -> Session: """Get a new :class:`.Session` for the registry database.""" engine = _current_engine() return sessionmaker(bind=engine)() def _current_engine() -> Engine: """Get/create :class:`.Engine` for this context.""" g = get_application_global() if not g: return _get_engine() if 'registry_data_engine' not in g: g.registry_data_engine = _get_engine() return g.registry_data_engine
[docs]def current_session() -> Session: """Get/create database session for this context.""" g = get_application_global() if not g: return _get_session() if 'registry_data_session' not in g: g.registry_data_session = _get_session() return g.registry_data_session
[docs]def create_all() -> None: """Create all tables in the database.""" Base.metadata.create_all(_current_engine())
[docs]def drop_all() -> None: """Drop all tables in the database.""" Base.metadata.drop_all(_current_engine())