def __call__(self, environ, start_response): try: result = self.app(environ, start_response) if isinstance(result, list): self._cleanup_request() return result else: return self._cleanup_iterator(result) except self.flush_on_errors as exc: self._cleanup_request() raise except: ThreadLocalORMSession.close_all() ContextualORMSession.close_all(self._context_func()) raise
'''The Zarkov data model.''' import logging from datetime import datetime import gevent import pymongo.errors from ming import Session, collection, Field from ming import schema as S from ming.orm import ContextualORMSession, session log = logging.getLogger(__name__) doc_session = Session.by_name('zarkov') orm_session = ContextualORMSession( lambda:id(gevent.getcurrent), doc_session) # Singleton collection idgen = collection( 'idgen', doc_session, Field('_id', int, if_missing=0), Field('inc', int)) # Things we want to track -- the 'fact table' from an OLAP perspective event = collection( 'event', doc_session, Field('_id', int), Field('timestamp', datetime, if_missing=datetime.utcnow), Field('type', str), Field('context', {str:None}), Field('extra', None))
def _cleanup_request(self): context = self._context_func() ThreadLocalORMSession.flush_all() ContextualORMSession.flush_all(context) ThreadLocalORMSession.close_all() ContextualORMSession.close_all(context)