diff options
author | Christopher Allan Webber <cwebber@dustycloud.org> | 2014-11-30 13:29:59 -0600 |
---|---|---|
committer | Christopher Allan Webber <cwebber@dustycloud.org> | 2014-12-03 15:40:57 -0600 |
commit | 4591af32b32e8fa102364e85cc0d479262a98719 (patch) | |
tree | beaea3cd751de6e40861ff8e26eefeb562c6c57c | |
parent | b88ca698dd4dc4eb486b08bdb10be9123ef01e8e (diff) | |
download | mediagoblin-4591af32b32e8fa102364e85cc0d479262a98719.tar.lz mediagoblin-4591af32b32e8fa102364e85cc0d479262a98719.tar.xz mediagoblin-4591af32b32e8fa102364e85cc0d479262a98719.zip |
Adding DatabaseManager as an alternative to DatabaseMaster
This is another step to get to a no-globals configuration. I'm not
sure if this code works yet or not... :)
-rw-r--r-- | mediagoblin/db/open.py | 102 |
1 files changed, 77 insertions, 25 deletions
diff --git a/mediagoblin/db/open.py b/mediagoblin/db/open.py index 34f0bffa..3f863190 100644 --- a/mediagoblin/db/open.py +++ b/mediagoblin/db/open.py @@ -15,40 +15,92 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. -from sqlalchemy import create_engine, event +from contextlib import contextmanager import logging import six +from sqlalchemy import create_engine, event -from mediagoblin.db.base import Base, Session from mediagoblin import mg_globals +from mediagoblin.db.base import Base _log = logging.getLogger(__name__) +from mediagoblin.tools.transition import DISABLE_GLOBALS + +if DISABLE_GLOBALS: + from mediagoblin.db.base import Session + + class DatabaseMaster(object): + def __init__(self, engine): + self.engine = engine + + for k, v in six.iteritems(Base._decl_class_registry): + setattr(self, k, v) + + def commit(self): + Session.commit() + + def save(self, obj): + Session.add(obj) + Session.flush() + + def check_session_clean(self): + for dummy in Session(): + _log.warn("STRANGE: There are elements in the sql session. " + "Please report this and help us track this down.") + break + + def reset_after_request(self): + Session.rollback() + Session.remove() + +else: + from sqlalchemy.orm import sessionmaker + + class DatabaseManager(object): + def __init__(self, engine): + self.engine = engine + self.Session = sessionmaker(bind=engine) + + @contextmanager + def session_scope(self): + session = self.Session() + + ##################################### + # Functions to emulate DatabaseMaster + ##################################### + def commit(): + session.commit() + + def save(obj): + session.add(obj) + session.flush() + + def check_session_clean(): + # Is this implemented right? + for dummy in session: + _log.warn("STRANGE: There are elements in the sql session. " + "Please report this and help us track this down.") + break + + def reset_after_request(): + session.rollback() + session.remove() + + # now attach + session.commit = commit + session.save = save + session.check_session_clean = check_session_clean + session.reset_after_request = reset_after_request + ##################################### + + try: + yield session + finally: + session.rollback() + session.close() -class DatabaseMaster(object): - def __init__(self, engine): - self.engine = engine - - for k, v in six.iteritems(Base._decl_class_registry): - setattr(self, k, v) - - def commit(self): - Session.commit() - - def save(self, obj): - Session.add(obj) - Session.flush() - - def check_session_clean(self): - for dummy in Session(): - _log.warn("STRANGE: There are elements in the sql session. " - "Please report this and help us track this down.") - break - - def reset_after_request(self): - Session.rollback() - Session.remove() def load_models(app_config): |