Implement a character cache, as the database-layer cache is seemingly not working. =/

This commit is contained in:
blitzmann
2015-10-25 19:41:12 -04:00
parent 6496164d95
commit 781abeea53
6 changed files with 25 additions and 23 deletions

View File

@@ -21,11 +21,11 @@ from sqlalchemy import Table, Column, Integer, String, Boolean
from sqlalchemy.orm import mapper
from eos.db import saveddata_meta
from eos.types import Crest
from eos.types import CrestChar
crest_table = Table("crest", saveddata_meta,
Column("ID", Integer, primary_key = True),
Column("name", String, nullable = False, unique = True),
Column("refresh_token", String, nullable = False))
mapper(Crest, crest_table)
mapper(CrestChar, crest_table)

View File

@@ -19,7 +19,7 @@
from eos.db.util import processEager, processWhere
from eos.db import saveddata_session, sd_lock
from eos.types import User, Character, Fit, Price, DamagePattern, Fleet, MiscData, Wing, Squad, TargetResists, Crest
from eos.types import User, Character, Fit, Price, DamagePattern, Fleet, MiscData, Wing, Squad, TargetResists, CrestChar
from eos.db.saveddata.fleet import squadmembers_table
from eos.db.saveddata.fit import projectedFits_table
from sqlalchemy.sql import and_
@@ -419,23 +419,23 @@ def getProjectedFits(fitID):
def getCrestCharacters(eager=None):
eager = processEager(eager)
with sd_lock:
characters = saveddata_session.query(Crest).options(*eager).all()
characters = saveddata_session.query(CrestChar).options(*eager).all()
return characters
@cachedQuery(Crest, 1, "lookfor")
@cachedQuery(CrestChar, 1, "lookfor")
def getCrestCharacter(lookfor, eager=None):
if isinstance(lookfor, int):
if eager is None:
with sd_lock:
character = saveddata_session.query(Crest).get(lookfor)
character = saveddata_session.query(CrestChar).get(lookfor)
else:
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(Crest).options(*eager).filter(Crest.ID == lookfor).first()
character = saveddata_session.query(CrestChar).options(*eager).filter(CrestChar.ID == lookfor).first()
elif isinstance(lookfor, basestring):
eager = processEager(eager)
with sd_lock:
character = saveddata_session.query(Crest).options(*eager).filter(Crest.name == lookfor).first()
character = saveddata_session.query(CrestChar).options(*eager).filter(CrestChar.name == lookfor).first()
else:
raise TypeError("Need integer or string as argument")
return character

View File

@@ -24,7 +24,7 @@ from sqlalchemy.orm import reconstructor
#from tomorrow import threads
class Crest(object):
class CrestChar(object):
def __init__(self, id, name, refresh_token=None):
self.ID = id

View File

@@ -21,7 +21,7 @@ from eos.gamedata import Attribute, Category, Effect, Group, Icon, Item, MarketG
MetaGroup, AttributeInfo, Unit, EffectInfo, MetaType, MetaData, Traits
from eos.saveddata.price import Price
from eos.saveddata.user import User
from eos.saveddata.crest import Crest
from eos.saveddata.crestchar import CrestChar
from eos.saveddata.damagePattern import DamagePattern
from eos.saveddata.targetResists import TargetResists
from eos.saveddata.character import Character, Skill

View File

@@ -9,6 +9,7 @@ import gui.display as d
from eos.types import Cargo
from eos.db import getItem
import time
import webbrowser
class CrestFittings(wx.Frame):
@@ -292,7 +293,7 @@ class CrestMgmt(wx.Dialog):
def addChar(self, event):
sCrest = service.Crest.getInstance()
uri = sCrest.startServer()
wx.LaunchDefaultBrowser(uri)
webbrowser.open(uri)
def delChar(self, event):
item = self.lcCharacters.GetFirstSelected()

View File

@@ -4,7 +4,7 @@ import uuid
from wx.lib.pubsub import pub
import eos.db
from eos.types import Crest as CrestUser
from eos.types import CrestChar
from service import pycrest
import service
from service.server import *
@@ -46,23 +46,19 @@ class Crest():
testing=self.clientTest)
self.implicitCharacter = None
# The database cache does not seem to be working for some reason. Use
# this as a temporary measure
self.charCache = {}
pub.subscribe(self.handleLogin, 'sso_login')
def delCrestCharacter(self, charID):
char = eos.db.getCrestCharacter(charID)
eos.db.remove(char)
wx.CallAfter(pub.sendMessage, 'crest_delete', message=None)
def getCrestCharacters(self):
chars = eos.db.getCrestCharacters()
for char in chars:
if not hasattr(char, "eve"):
char.eve = copy.copy(self.eve)
# Give EVE instance refresh info. This allows us to set it
# without actually making the request to authorize at this time.
char.eve.temptoken_authorize(refresh_token=char.refresh_token)
wx.CallAfter(pub.sendMessage, 'crest_delete', message=None)
return chars
def getCrestCharacter(self, charID):
@@ -74,10 +70,14 @@ class Crest():
raise ValueError("CharacterID does not match currently logged in character.")
return self.implicitCharacter
if charID in self.charCache:
return self.charCache.get(charID)
char = eos.db.getCrestCharacter(charID)
if char and not hasattr(char, "eve"):
char.eve = copy.copy(self.eve)
char.eve.temptoken_authorize(refresh_token=char.refresh_token)
self.charCache[charID] = char
return char
def getFittings(self, charID):
@@ -134,7 +134,7 @@ class Crest():
logger.debug("Got character info: %s" % info)
self.implicitCharacter = CrestUser(info['CharacterID'], info['CharacterName'])
self.implicitCharacter = CrestChar(info['CharacterID'], info['CharacterName'])
self.implicitCharacter.eve = eve
#self.implicitCharacter.fetchImage()
@@ -152,8 +152,9 @@ class Crest():
if char:
char.refresh_token = eve.refresh_token
else:
char = CrestUser(info['CharacterID'], info['CharacterName'], eve.refresh_token)
char = CrestChar(info['CharacterID'], info['CharacterName'], eve.refresh_token)
char.eve = eve
self.charCache[int(info['CharacterID'])] = char
eos.db.save(char)
wx.CallAfter(pub.sendMessage, 'login_success', type=1)