Пример #1
0
 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)
Пример #2
0
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)