view roundup/backends/sessions.py @ 1244:8dd4f736370b

merge from maintenance branch
author Richard Jones <richard@users.sourceforge.net>
date Thu, 03 Oct 2002 06:56:30 +0000
parents 32e41ddf2edb
children 378081f066cc bc4770c0595d
line wrap: on
line source

#$Id: sessions.py,v 1.3 2002-09-10 00:11:50 richard Exp $
'''
This module defines a very basic store that's used by the CGI interface
to store session information.
'''

import anydbm, whichdb, os, marshal

class Sessions:
    ''' Back onto an anydbm store.

        Keys are session id strings, values are marshalled data.
    '''
    def __init__(self, config):
        self.config = config
        self.dir = config.DATABASE
        # ensure files are group readable and writable
        os.umask(0002)

    def clear(self):
        path = os.path.join(self.dir, 'sessions')
        if os.path.exists(path):
            os.remove(path)
        elif os.path.exists(path+'.db'):    # dbm appends .db
            os.remove(path+'.db')

    def determine_db_type(self, path):
        ''' determine which DB wrote the class file
        '''
        db_type = ''
        if os.path.exists(path):
            db_type = whichdb.whichdb(path)
            if not db_type:
                raise hyperdb.DatabaseError, "Couldn't identify database type"
        elif os.path.exists(path+'.db'):
            # if the path ends in '.db', it's a dbm database, whether
            # anydbm says it's dbhash or not!
            db_type = 'dbm'
        return db_type

    def get(self, sessionid, value):
        db = self.opendb('c')
        try:
            if db.has_key(sessionid):
                values = marshal.loads(db[sessionid])
            else:
                return None
            return values.get(value, None)
        finally:
            db.close()

    def set(self, sessionid, **newvalues):
        db = self.opendb('c')
        try:
            if db.has_key(sessionid):
                values = marshal.loads(db[sessionid])
            else:
                values = {}
            values.update(newvalues)
            db[sessionid] = marshal.dumps(values)
        finally:
            db.close()

    def list(self):
        db = self.opendb('r')
        try:
            return db.keys()
        finally:
            db.close()

    def destroy(self, sessionid):
        db = self.opendb('c')
        try:
            if db.has_key(sessionid):
                del db[sessionid]
        finally:
            db.close()

    def opendb(self, mode):
        '''Low-level database opener that gets around anydbm/dbm
           eccentricities.
        '''
        # figure the class db type
        path = os.path.join(os.getcwd(), self.dir, 'sessions')
        db_type = self.determine_db_type(path)

        # new database? let anydbm pick the best dbm
        if not db_type:
            return anydbm.open(path, 'c')

        # open the database with the correct module
        dbm = __import__(db_type)
        return dbm.open(path, mode)

    def commit(self):
        pass

Roundup Issue Tracker: http://roundup-tracker.org/