import threading, time, pickle, random, os
-import cookie
+from . import cookie
__all__ = ["db", "get"]
def gennonce(length):
nonce = ""
- for i in xrange(length):
+ for i in range(length):
nonce += chr(random.randint(0, 255))
return nonce
self.lock = threading.Lock()
class db(object):
- def __init__(self, cookiename = "wrwsess", path = "/"):
+ def __init__(self, backdb = None, cookiename = "wrwsess", path = "/"):
self.live = {}
self.cookiename = cookiename
self.path = path
self.lock = threading.Lock()
self.cthread = None
self.freezetime = 3600
+ self.backdb = backdb
def clean(self):
now = int(time.time())
with self.lock:
dlist = []
- for sess in self.live.itervalues():
+ for sess in self.live.values():
if sess.atime + self.freezetime < now:
try:
if sess.dirty():
return sess
def thaw(self, sessid):
- raise KeyError()
-
- def freeze(self, sess):
- raise TypeError()
-
- def get(self, req):
- return req.item(self.fetch)
-
- class backeddb(db):
- def __init__(self, backdb, *args, **kw):
- super().__init__(*args, **kw)
- self.backdb = backdb
-
- def thaw(self, sessid):
+ if self.backdb is None:
+ raise KeyError()
data = self.backdb[sessid]
try:
return pickle.loads(data)
- except Exception, e:
+ except:
raise KeyError()
def freeze(self, sess):
- self.backdb[sess.id] = pickle.dumps(sess)
+ if self.backdb is None:
+ raise TypeError()
+ self.backdb[sess.id] = pickle.dumps(sess, -1)
sess.frozen()
+ def get(self, req):
+ return req.item(self.fetch)
+
class dirback(object):
def __init__(self, path):
self.path = path
with open(os.path.join(self.path, key), "w") as out:
out.write(value)
- default = backeddb(dirback(os.path.join("/tmp", "wrwsess-" + str(os.getuid()))))
+ default = db(backdb = dirback(os.path.join("/tmp", "wrwsess-" + str(os.getuid()))))
def get(req):
return default.get(req)
import inspect
-import req, dispatch, session, form
+from . import req, dispatch, session, form
def wsgiwrap(callable):
def wrapper(env, startreq):
class sessiondata(object):
@classmethod
- def get(cls, req):
+ def get(cls, req, create = True):
sess = cls.sessdb().get(req)
with sess.lock:
try:
return sess[cls]
except KeyError:
+ if not create:
+ return None
ret = cls(req)
sess[cls] = ret
return ret
class autodirty(sessiondata):
@classmethod
def get(cls, req):
- ret = super(autodirty, cls).get(req)
+ ret = super().get(req)
if "_is_dirty" not in ret.__dict__:
ret.__dict__["_is_dirty"] = False
return ret
return self._is_dirty
def __setattr__(self, name, value):
- super(autodirty, self).__setattr__(name, value)
+ super().__setattr__(name, value)
if "_is_dirty" in self.__dict__:
self.__dict__["_is_dirty"] = True
def __delattr__(self, name):
- super(autodirty, self).__delattr__(name, value)
+ super().__delattr__(name, value)
if "_is_dirty" in self.__dict__:
self.__dict__["_is_dirty"] = True
class manudirty(object):
def __init__(self, *args, **kwargs):
- super(manudirty, self).__init__(*args, **kwargs)
+ super().__init__(*args, **kwargs)
self.__dirty = False
def sessfrozen(self):