diff --git a/eos/db/__init__.py b/eos/db/__init__.py index 55d261645..8867d63c5 100644 --- a/eos/db/__init__.py +++ b/eos/db/__init__.py @@ -58,9 +58,7 @@ if saveddata_connectionstring is not None: saveddata_meta = MetaData() saveddata_meta.bind = saveddata_engine - base = sessionmaker(bind=saveddata_engine, autoflush=False, expire_on_commit=False) - saveddata_session = base() - character_session = base() + saveddata_session = sessionmaker(bind=saveddata_engine, autoflush=False, expire_on_commit=False)() # Lock controlling any changes introduced to session sd_lock = threading.Lock() @@ -77,7 +75,7 @@ from eos.db.saveddata.queries import getUser, getCharacter, getFit, getFitsWithS getFitList, getFleetList, getFleet, save, remove, commit, add, \ getCharactersForUser, getMiscData, getSquadsIDsWithFitID, getWing, \ getSquad, getBoosterFits, getProjectedFits, getTargetResistsList, getTargetResists,\ - clearPrices, countAllFits, getCharacter + clearPrices, countAllFits #If using in memory saveddata, you'll want to reflect it so the data structure is good. if config.saveddata_connectionstring == "sqlite:///:memory:": diff --git a/eos/db/saveddata/fit.py b/eos/db/saveddata/fit.py index c55a76551..a40d8c7fb 100644 --- a/eos/db/saveddata/fit.py +++ b/eos/db/saveddata/fit.py @@ -138,6 +138,9 @@ mapper(Fit, fits_table, primaryjoin=fitImplants_table.c.fitID == fits_table.c.ID, secondaryjoin=fitImplants_table.c.implantID == Implant.ID, secondary=fitImplants_table), + "_Fit__character": relation( + Character, + backref="fits"), "_Fit__damagePattern": relation(DamagePattern), "_Fit__targetResists": relation(TargetResists), "projectedOnto": relationship( diff --git a/eos/db/saveddata/queries.py b/eos/db/saveddata/queries.py index 718da544a..b71f6b98a 100644 --- a/eos/db/saveddata/queries.py +++ b/eos/db/saveddata/queries.py @@ -18,7 +18,7 @@ #=============================================================================== from eos.db.util import processEager, processWhere -from eos.db import saveddata_session, character_session, sd_lock +from eos.db import saveddata_session, sd_lock from eos.types import User, Character, Fit, Price, DamagePattern, Fleet, MiscData, Wing, Squad, TargetResists from eos.db.saveddata.fleet import squadmembers_table from eos.db.saveddata.fit import projectedFits_table @@ -144,13 +144,16 @@ def getUser(lookfor, eager=None): def getCharacter(lookfor, eager=None): if isinstance(lookfor, int): if eager is None: - character = saveddata_session.query(Character).get(lookfor) + with sd_lock: + character = saveddata_session.query(Character).get(lookfor) else: eager = processEager(eager) - character = saveddata_session.query(Character).options(*eager).filter(Character.ID == lookfor).first() + with sd_lock: + character = saveddata_session.query(Character).options(*eager).filter(Character.ID == lookfor).first() elif isinstance(lookfor, basestring): eager = processEager(eager) - character = saveddata_session.query(Character).options(*eager).filter(Character.name == lookfor).first() + with sd_lock: + character = saveddata_session.query(Character).options(*eager).filter(Character.name == lookfor).first() else: raise TypeError("Need integer or string as argument") return character diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py index 5237067a2..29df2dbcf 100644 --- a/eos/saveddata/fit.py +++ b/eos/saveddata/fit.py @@ -97,7 +97,7 @@ class Fit(object): self.__mode = self.ship.validateModeItem(item) else: self.__mode = self.ship.validateModeItem(None) - self.__character = eos.db.saveddata.queries.getCharacter(self.characterID) + self.build() def build(self): @@ -166,8 +166,6 @@ class Fit(object): @character.setter def character(self, char): self.__character = char - if char is not None: - self.characterID = char.ID @property def ship(self):