cool. On Tue, Oct 21, 2008 at 1:19 PM, Bibby <[EMAIL PROTECTED]> wrote:
> > Hi, all. > > Below is patch to use bsddb to store sessions. > > Note: Patch author is [EMAIL PROTECTED], not me. But he agreed to > public this patch under the license which webpy used. > > Refer google group 'python-cn' (thread is in Chinese): > > http://groups.google.com/group/python-cn/browse_thread/thread/6b995c68193223b6/c21a04077e9db7be#c21a04077e9db7be > > Download link: > > http://python-cn.googlegroups.com/attach/2044891ef481e378/webpy-session-BDBStore.patch > > diff --git a/web/session.py b/web/session.py > index 996b58f..e5b6956 100644 > --- a/web/session.py > +++ b/web/session.py > @@ -3,7 +3,7 @@ Session Management > (from web.py) > """ > > -import os, time, datetime, random, base64 > +import os, time, datetime, random, base64, bsddb > try: > import cPickle as pickle > except ImportError: > @@ -221,6 +221,60 @@ class DiskStore(Store): > if now - atime > timeout : > os.remove(path) > > +class BDBStore(Store): > + """Store for saving a session in bsddb > + > + >>> import tempfile > + >>> root = tempfile.mkdtemp() > + >>> s = BDBStore(root) > + >>> s['a'] = 'foo' > + >>> s['a'] > + 'foo' > + >>> time.sleep(0.01) > + >>> s.cleanup(0.01) > + >>> s['a'] > + Traceback (most recent call last): > + ... > + KeyError: 'a' > + """ > + def __init__(self, root): > + if hasattr(root, '__getitem__') and hasattr(root, > '__setitem__'): > + self.db = root > + return > + if not os.path.isdir(root): > + os.makedirs(root) > + dbenv = bsddb.db.DBEnv() > + #dbenv.set_shm_key(23) > + dbenv.open(root, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL > | bsddb.db.DB_THREAD) > + d = bsddb.db.DB(dbenv) > + d.open('sessions.db', bsddb.db.DB_BTREE, bsddb.db.DB_CREATE, > 0666) > + self.db = bsddb._DBWithCursor(d) > + > + def __contains__(self, key): > + return key in self.db > + > + def __getitem__(self, key): > + if key in self.db: > + return pickle.loads(self.db[key])[1] > + else: > + raise KeyError, key > + > + def __setitem__(self, key, value): > + self.db[key] = pickle.dumps((time.time(), value)) > + > + def __delitem__(self, key): > + if key in self.db: > + del self.db[key] > + > + def cleanup(self, timeout): > + if not hasattr(self.db, 'iteritems'): > + return > + now = time.time() > + db = self.db > + for key, value in db.iteritems(): > + if now - pickle.loads(value[0]): > + del db[key] > + > class DBStore(Store): > """Store for saving a session in database > Needs a table with the following columns: > > > -- ----------------------------------------------- Yours Faithfully Daniel Yang --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web.py" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/webpy?hl=en -~----------~----~----~----~------~----~------~--~---
