def __init__(self, storage_url=None, **kw): super(SessionStoreMySQL, self).__init__(storage_url=storage_url) try: self.engine = StorageEngineMySQL(self.storage_url).get_engine() except StorageEngineError: raise SessionStoreError("Could not create connection " "for: %s " % self.storage_url)
class SessionStoreMySQL(SessionStore): """ Session storage in MySQL database. """ def __init__(self, storage_url=None, **kw): super(SessionStoreMySQL, self).__init__(storage_url=storage_url) try: self.engine = StorageEngineMySQL(self.storage_url).get_engine() except StorageEngineError: raise SessionStoreError("Could not create connection " "for: %s " % self.storage_url) def __contains__(self, key): k = whirly.utils.sqlify(key) data = self.engine.query(RELATION_DB_SQL_QUERY_SESSION % k) return bool(data) def __getitem__(self, key): now = whirly.utils.sqlify(datetime.datetime.utcnow()) k = whirly.utils.sqlify(key) try: s = self.engine.query(RELATION_DB_SQL_QUERY_SESSION % k)[0] self.engine.execute(RELATION_DB_SQL_UPDATE_SESSION_ATIME % (now, k)) except IndexError: raise KeyError else: return self.decode(s.data) def __setitem__(self, key, value): pickled = self.encode(value) p = whirly.utils.sqlify(pickled) #XXX should sqlify??? k = whirly.utils.sqlify(key) #XXX should sqlify??? now = whirly.utils.sqlify(datetime.datetime.utcnow()) if key in self: self.engine.execute(RELATION_DB_SQL_UPDATE_SESSION_DATA % (p, now, k)) else: self.engine.execute(RELATION_DB_SQL_INSERT_SESSION % (k, p)) def __delitem__(self, key): k = whirly.utils.sqlify(key) self.engine.execute(RELATION_DB_SQL_DELETE_SESSION % k) def cleanup(self, timeout): timeout = datetime.timedelta(timeout/(24.0*60*60)) last_allowed_time = datetime.datetime.utcnow() - timeout l = whirly.utils.sqlify(last_allowed_time) try: self.engine.execute(RELATION_DB_SQL_CLEANUP_SESSION % l) except ProgrammingError, e: if e[0] == 1146: self.engine.execute(RELATION_DB_SQL_CREATE_TABLE) self.engine.execute(RELATION_DB_SQL_CLEANUP_SESSION % l)