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... :)
This commit is contained in:
parent
b88ca698dd
commit
4591af32b3
@ -15,40 +15,92 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# 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 logging
|
||||||
|
|
||||||
import six
|
import six
|
||||||
|
from sqlalchemy import create_engine, event
|
||||||
|
|
||||||
from mediagoblin.db.base import Base, Session
|
|
||||||
from mediagoblin import mg_globals
|
from mediagoblin import mg_globals
|
||||||
|
from mediagoblin.db.base import Base
|
||||||
|
|
||||||
_log = logging.getLogger(__name__)
|
_log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
from mediagoblin.tools.transition import DISABLE_GLOBALS
|
||||||
|
|
||||||
class DatabaseMaster(object):
|
if DISABLE_GLOBALS:
|
||||||
def __init__(self, engine):
|
from mediagoblin.db.base import Session
|
||||||
self.engine = engine
|
|
||||||
|
|
||||||
for k, v in six.iteritems(Base._decl_class_registry):
|
class DatabaseMaster(object):
|
||||||
setattr(self, k, v)
|
def __init__(self, engine):
|
||||||
|
self.engine = engine
|
||||||
|
|
||||||
def commit(self):
|
for k, v in six.iteritems(Base._decl_class_registry):
|
||||||
Session.commit()
|
setattr(self, k, v)
|
||||||
|
|
||||||
def save(self, obj):
|
def commit(self):
|
||||||
Session.add(obj)
|
Session.commit()
|
||||||
Session.flush()
|
|
||||||
|
|
||||||
def check_session_clean(self):
|
def save(self, obj):
|
||||||
for dummy in Session():
|
Session.add(obj)
|
||||||
_log.warn("STRANGE: There are elements in the sql session. "
|
Session.flush()
|
||||||
"Please report this and help us track this down.")
|
|
||||||
break
|
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()
|
||||||
|
|
||||||
def reset_after_request(self):
|
|
||||||
Session.rollback()
|
|
||||||
Session.remove()
|
|
||||||
|
|
||||||
|
|
||||||
def load_models(app_config):
|
def load_models(app_config):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user