1 # Copyright (C) 2014 Ipsilon project Contributors, for license see COPYING
4 from cherrypy.lib.sessions import Session
5 from ipsilon.util.data import Store, SqlQuery
8 import cPickle as pickle
13 SESSION_COLUMNS = ['id', 'data', 'expiration_time']
16 class SessionStore(Store):
17 def _initialize_schema(self):
18 q = self._query(self._db, 'sessions', SESSION_COLUMNS,
22 def _upgrade_schema(self, old_version):
23 raise NotImplementedError()
26 class SqlSession(Session):
35 def setup(cls, **kwargs):
36 """Initialization from cherrypy"""
38 for k, v in kwargs.items():
39 if k == 'storage_dburi':
42 cls._store = SessionStore(database_url=cls.dburi)
43 # pylint: disable=protected-access
44 cls._db = cls._store._db
47 q = SqlQuery(self._db, 'sessions', SESSION_COLUMNS)
48 result = q.select({'id': self.id})
49 return True if result.fetchone() else False
52 q = SqlQuery(self._db, 'sessions', SESSION_COLUMNS)
53 result = q.select({'id': self.id})
56 data = str(base64.b64decode(r[1]))
57 return pickle.loads(data)
59 def _save(self, expiration_time):
62 q = SqlQuery(self._db, 'sessions', SESSION_COLUMNS, trans=True)
63 q.delete({'id': self.id})
64 data = pickle.dumps((self._data, expiration_time), self._proto)
65 q.insert((self.id, base64.b64encode(data), expiration_time))
67 except Exception: # pylint: disable=broad-except
73 q = SqlQuery(self._db, 'sessions', SESSION_COLUMNS)
74 q.delete({'id': self.id})
76 # copy what RamSession does for now
77 def acquire_lock(self):
78 """Acquire an exclusive lock on the currently-loaded session data."""
80 self.locks.setdefault(self.id, threading.RLock()).acquire()
82 def release_lock(self):
83 """Release the lock on the currently-loaded session data."""
84 self.locks[self.id].release()