X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=ipsilon%2Futil%2Fsessions.py;h=8df3b4d6dc7734200384ac23d9901bc495ae0a2a;hb=cff71af03913b5b0987171205ef0c460b2f6fff8;hp=f5390dc813787b0d83821f7ab80d054d2c651511;hpb=cfe24fa3dc15d87f3ace944a2d62a0f4c5ee496c;p=cascardo%2Fipsilon.git diff --git a/ipsilon/util/sessions.py b/ipsilon/util/sessions.py index f5390dc..8df3b4d 100644 --- a/ipsilon/util/sessions.py +++ b/ipsilon/util/sessions.py @@ -2,7 +2,7 @@ import base64 from cherrypy.lib.sessions import Session -from ipsilon.util.data import SqlStore, SqlQuery +from ipsilon.util.data import Store, SqlQuery import threading try: import cPickle as pickle @@ -10,13 +10,37 @@ except ImportError: import pickle -SESSION_COLUMNS = ['id', 'data', 'expiration_time'] +SESSION_TABLE = {'columns': ['id', 'data', 'expiration_time'], + 'primary_key': ('id', ), + 'indexes': [('expiration_time',)] + } + + +class SessionStore(Store): + def _initialize_schema(self): + q = self._query(self._db, 'sessions', SESSION_TABLE, + trans=False) + q.create() + + def _upgrade_schema(self, old_version): + if old_version == 1: + # In schema version 2, we added indexes and primary keys + # pylint: disable=protected-access + table = self._query(self._db, 'sessions', SESSION_TABLE, + trans=False)._table + self._db.add_constraint(table.primary_key) + for index in table.indexes: + self._db.add_index(index) + return 2 + else: + raise NotImplementedError() class SqlSession(Session): dburi = None _db = None + _store = None _proto = 2 locks = {} @@ -28,15 +52,17 @@ class SqlSession(Session): if k == 'storage_dburi': cls.dburi = v - cls._db = SqlStore(cls.dburi) + cls._store = SessionStore(database_url=cls.dburi) + # pylint: disable=protected-access + cls._db = cls._store._db def _exists(self): - q = SqlQuery(self._db, 'sessions', SESSION_COLUMNS) + q = SqlQuery(self._db, 'sessions', SESSION_TABLE) result = q.select({'id': self.id}) return True if result.fetchone() else False def _load(self): - q = SqlQuery(self._db, 'sessions', SESSION_COLUMNS) + q = SqlQuery(self._db, 'sessions', SESSION_TABLE) result = q.select({'id': self.id}) r = result.fetchone() if r: @@ -46,7 +72,7 @@ class SqlSession(Session): def _save(self, expiration_time): q = None try: - q = SqlQuery(self._db, 'sessions', SESSION_COLUMNS, trans=True) + q = SqlQuery(self._db, 'sessions', SESSION_TABLE, trans=True) q.delete({'id': self.id}) data = pickle.dumps((self._data, expiration_time), self._proto) q.insert((self.id, base64.b64encode(data), expiration_time)) @@ -57,7 +83,7 @@ class SqlSession(Session): raise def _delete(self): - q = SqlQuery(self._db, 'sessions', SESSION_COLUMNS) + q = SqlQuery(self._db, 'sessions', SESSION_TABLE) q.delete({'id': self.id}) # copy what RamSession does for now