#
# 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




syntax highlighted by Code2HTML, v. 0.9.1