# # Nice old pyne mailboxes. bodies in a shelve database indexed # by message-id, and headers similarly done. # # This would be a better format for use with filesystems that # hate lots of small files, like ext2, vfat, etc. # import shelve import marshal import os from pyneheaders import * from superbox import superbox class pynebox(superbox): def __init__(self, user, box, prefix=None): if prefix == None: prefix = box.uid self.user = user self.header_db = shelve.open(prefix+".hdr") self.body_db = shelve.open(prefix+".bdy") self.prefix = prefix def get_contents(self): return self.header_db.keys() def nuke(self): """ Delete database entirely. """ self.header_db.close() self.body_db.close() os.remove(self.prefix+".hdr") os.remove(self.prefix+".bdy") def __del__(self): self.header_db.close() self.body_db.close() def load_header(self, msg_id): """ Return message header or None if not found. in form: (date, date_received, message-id, references, subject, from, opts (flags), senduid) """ try: return marshal.loads(self.header_db[msg_id]) except (TypeError,KeyError): return None def _load_article(self, msg_id): """ Returm body for message 'msg_id'. """ try: header = marshal.loads(self.header_db[msg_id]) except (TypeError,KeyError): header = None try: body = self.body_db[msg_id] except KeyError: body = None return (header, body) def _save_article(self, headers, body_text, msg_id): """ Do not use directly. use save_article. """ self.header_db[msg_id] = marshal.dumps(headers) self.body_db[msg_id] = body_text def delete_article(self, msg_id): try: del self.header_db[msg_id] except KeyError: pass try: del self.body_db[msg_id] except KeyError: pass def has_article(self, msg_id): """ Is the article cached? """ # NOTE: we check for presence of headers not bodies if self.header_db.has_key(msg_id): return 1 else: return 0