class SessionStoreDatastore(SessionStore): """Session storage in datastore on google appengine """ def __init__(self, storage_url=None, **kw): super(SessionStoreDatastore, self).__init__(storage_url=storage_url) try: self.engine = StorageEngineDatastore(self.storage_url).get_engine() except: raise SessionStoreError("Could not create connection " "for: %s " % self.storage_url) def __contains__(self, key): sessions = self.engine.GqlQuery("SELECT * FROM WhirlySession WHERE session_id = :1", key) s = sessions.get() if s: return True else: return False def __getitem__(self, key): now = datetime.datetime.utcnow() try: q = self.engine.GqlQuery("SELECT * FROM WhirlySession WHERE " "session_id = :1", key) s = q.fetch(limit=1)[0] s.atime = now self.engine.put(s) except IndexError: raise KeyError else: return self.decode(s.data) def __setitem__(self, key, value): pickled = self.encode(value) now = datetime.datetime.utcnow() if key in self: s = self.engine.GqlQuery("SELECT * from WhirlySession WHERE " "session_id = :1", key)[0] s.atime = now s.data = pickled else: s = WhirlySession(session_id=key) s.data = pickled self.engine.put(s) def __delitem__(self, key): q = self.engine.GqlQuery("SELECT * from WhirlySession WHERE " "session_id = :1", key) for s in q: s.delete() def cleanup(self, timeout): timeout = datetime.timedelta(timeout/(24.0*60*60)) last_allowed_time = datetime.datetime.utcnow() - timeout q = self.engine.GqlQuery("SELECT * FROM WhirlySession WHERE " "atime < :1", last_allowed_time) for s in q: s.delete()
def __init__(self, storage_url=None, **kw): super(SessionStoreDatastore, self).__init__(storage_url=storage_url) try: self.engine = StorageEngineDatastore(self.storage_url).get_engine() except: raise SessionStoreError("Could not create connection " "for: %s " % self.storage_url)