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
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:
"""
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
if(self.mangle):
file = mangle(file)
- hash = file[0:2]
- document = xmlw.parseFile(self.name + "/" + hash + "/" + file + ".xml")
+ hash = makeHash(file)
+ document = xmlw.parseFile(self.name + X + hash + X + file + ".xml")
return document
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:
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: