X-Git-Url: https://code.delx.au/pymsnt/blobdiff_plain/85e6c0f55bd0d46cad7f94d15b52c7b64dc94c08..c0c7bca2bb8b2c215d0031695f1ec49b74457a6d:/src/xdb.py diff --git a/src/xdb.py b/src/xdb.py index 83d4f74..e3caf0e 100644 --- a/src/xdb.py +++ b/src/xdb.py @@ -1,17 +1,15 @@ # Copyright 2004-2005 James Bunton # Licensed for distribution under the GPL version 2, check COPYING for details -import utils -if(utils.checkTwisted()): - from twisted.xish.domish import Element -else: - from tlib.domish import Element +from tlib import xmlw from debug import LogEvent, INFO, WARN import os import os.path +import shutil +import md5 import config -import legacy +X = os.path.sep SPOOL_UMASK = 0077 @@ -21,8 +19,11 @@ def unmangle(file): file = "%s@%s" % ("%".join(chunks), end) return file -def mangle(jid): - return jid.replace("@", "%") +def mangle(file): + return file.replace("@", "%") + +def makeHash(file): + return md5.md5(file).hexdigest()[0:3] class XDB: @@ -34,7 +35,7 @@ class XDB: """ def __init__(self, name, mangle=False): """ Creates an XDB object. If mangle is True then any '@' signs in filenames will be changed to '%' """ - self.name = os.path.abspath(config.spooldir) + '/' + name + self.name = os.path.join(os.path.abspath(config.spooldir), name) if not os.path.exists(self.name): os.makedirs(self.name) self.mangle = mangle @@ -43,8 +44,8 @@ class XDB: if(self.mangle): file = mangle(file) - hash = file[0:2] - document = utils.parseFile(self.name + "/" + hash + "/" + file + ".xml") + hash = makeHash(file) + document = xmlw.parseFile(self.name + X + hash + X + file + ".xml") return document @@ -53,21 +54,26 @@ class XDB: file = mangle(file) prev_umask = os.umask(SPOOL_UMASK) - hash = file[0:2] - pre = self.name + "/" + hash + "/" + hash = makeHash(file) + pre = self.name + X + hash + X if not os.path.exists(pre): os.makedirs(pre) - f = open(pre + file + ".xml", "w") - f.write(text) - f.close() + try: + f = open(pre + file + ".xml.new", "w") + f.write(text) + f.close() + shutil.move(pre + file + ".xml.new", pre + file + ".xml") + except IOError, e: + LogEvent(WARN, "", "IOError " + str(e)) + raise os.umask(prev_umask) def files(self): """ Returns a list containing the files in the current XDB database """ files = [] for dir in os.listdir(self.name): - if(os.path.isdir(self.name + "/" + dir)): - files.extend(os.listdir(self.name + "/" + dir)) + if(os.path.isdir(self.name + X + dir)): + files.extend(os.listdir(self.name + X + dir)) if self.mangle: files = [unmangle(x)[:-4] for x in files] else: @@ -98,7 +104,7 @@ class XDB: except IOError: pass if(not document): - document = Element((None, "xdb")) + document = xmlw.Element((None, "xdb")) # Remove the existing node (if any) for child in document.elements(): @@ -114,7 +120,7 @@ class XDB: def remove(self, file): """ Removes an XDB file """ - file = self.name + "/" + file[0:2] + "/" + file + ".xml" + file = self.name + X + file[0:2] + X + file + ".xml" if(self.mangle): file = mangle(file) try: