Commit 4ad03aa6 authored by Jim Fulton's avatar Jim Fulton

This one was redundant.

parent 1392c45f
import string, struct, sys, tempfile
import Shared.DC.xml.ppml
import Shared.DC.xml.xyap
ppml=Shared.DC.xml.ppml
xyap=Shared.DC.xml.xyap
xyap=xyap.xyap
p64=ppml.p64
u64=ppml.u64
cp=ppml.cp
try: from cStringIO import StringIO
except: from StringIO import StringIO
export_end_marker='\377'*16
StringType=type('')
class ZopeData:
def __init__(self, parser, tag, attrs):
self._pos=0
self.file=parser.file
self.tempfile=parser.tempfile
def append(self, transaction, f=None):
file=self.file
write=file.write
tfile=self.tempfile
dlen=tfile.tell()
tfile.seek(0)
id=transaction.serial
user, desc, ext = transaction._ude
transaction._ude=None
tlen=transaction._thl
pos=self._pos
file.seek(pos)
tl=tlen+dlen
stl=p64(tl)
write(struct.pack(
">8s" "8s" "c" "H" "H" "H"
, id, stl, ' ', len(user), len(desc), len(ext),
))
if user: write(user)
if desc: write(desc)
if ext: write(ext)
cp(tfile,file,dlen)
write(stl)
self._pos=pos+tl+8
class Transaction:
def __init__(self, parser, tag, attrs):
self.file=parser.file
self.tempfile=parser.tempfile
self.tempfile.seek(0)
tyme=attrs['time']
start=0
stop=string.find(tyme[start:],'-')+start
year=string.atoi(tyme[start:stop])
start=stop+1
stop=string.find(tyme[start:],'-')+start
month=string.atoi(tyme[start:stop])
start=stop+1
stop=string.find(tyme[start:],' ')+start
day=string.atoi(tyme[start:stop])
start=stop+1
stop=string.find(tyme[start:],':')+start
hour=string.atoi(tyme[start:stop])
start=stop+1
stop=string.find(tyme[start:],':')+start
minute=string.atoi(tyme[start:stop])
start=stop+1
second=string.atof(tyme[start:])
t=(((((year-1900)*12+month-1)*31+day-1)*24+hour)*60+minute)
t=struct.pack(">If",t,second*(1L<<32)/60)
self.serial=t
self._user=user=''
self._descr=desc=''
self._ext=ext=''
self._thl= 23+len(user)+len(desc)+len(ext)
self._ude= user, desc, ext
self._index={}
self._tindex=[]
self._pos=0
self._oid='\0\0\0\0\0\0\0\0'
def append(self, data):
version=''
old=self._index.get(self._oid,0)
pnv=None
if old:
file=self.file
file.seek(old)
read=file.read
h=read(42)
doid,oserial,sprev,stloc,vlen,splen = unpack(">8s8s8s8sH8s", h)
if doid != self.serial: raise CorruptedDataError, h
tfile=self.tempfile
write=tfile.write
pos=self._pos
serial=self.serial
oid=self._oid
here=tfile.tell()+pos+self._thl
self._tindex.append((self._oid, here))
serial=self.serial
write(struct.pack(">8s8s8s8sH8s", oid, serial, p64(old), p64(pos),
len(version), p64(len(data))))
for x in data[2:]:
write(x)
return serial
def save_user(self, tag, data):
transaction=self._transaction
if len(data)>2: v=data[2]
else: v=''
self._user=v
transaction._thl=self._transaction._thl+len(v)
transaction._ude=v,transaction._ude[1],transaction._ude[2]
return v
def save_description(self, tag, data):
transaction=self._transaction
if len(data)>2: v=data[2]
else: v=''
a=data[1]
if a.has_key('encoding'): encoding=a['encoding']
else: encoding=''
if encoding:
v=unconvert(encoding,v)
transaction._descr=v
transaction._thl=transaction._thl+len(v)
transaction._ude=transaction._ude[0],v,transaction._ude[2]
return v
def save_rec(self, tag, data):
a=data[1]
if a.has_key('id'):
a['id']=p64(string.atoi(a['id'])+1)
if a.has_key('time'):
start=0
stop=string.find(a['time'][start:],'-')+start
year=string.atoi(a['time'][start:stop])
start=stop+1
stop=string.find(a['time'][start:],'-')+start
month=string.atoi(a['time'][start:stop])
start=stop+1
stop=string.find(a['time'][start:],' ')+start
day=string.atoi(a['time'][start:stop])
start=stop+1
stop=string.find(a['time'][start:],':')+start
hour=string.atoi(a['time'][start:stop])
start=stop+1
stop=string.find(a['time'][start:],':')+start
minute=string.atoi(a['time'][start:stop])
start=stop+1
second=string.atof(a['time'][start:])
a['time']=struct.pack(">If",(((((year-1900)*12)+month-1)*31+day-1)*24+
hour)*60 +minute, second*(1L<<32)/60)
data[1]=a
return data
def start_transaction(self, tag, attrs):
self._transaction=Transaction(self, tag, attrs)
return self._transaction
def start_ZopeData(self, tag, attrs):
self._ZopeData=ZopeData(self, tag, attrs)
return self._ZopeData
def XMLtobbb(infile, outfile, binary=0):
import Shared.DC.xml.pyexpat
if type(infile) is StringType:
data=open(infile).read()
if type(outfile) is StringType:
outfile=open(outfile,'w'+'b')
F=ppml.xmlPickler()
F.end_handlers['user'] = save_user
F.end_handlers['description'] = save_description
F.end_handlers['rec'] = save_rec
F.start_handlers['transaction'] = start_transaction
F.start_handlers['ZopeData'] = start_ZopeData
F.binary=binary
F.file=outfile
F.tempfile=tempfile.TemporaryFile()
p=xml.parsers.pyexpat.ParserCreate()
p.CharacterDataHandler=F.handle_data
p.StartElementHandler=F.unknown_starttag
p.EndElementHandler=F.unknown_endtag
r=p.Parse(data)
return r
def save_record(self, tag, data):
file=self.file
write=file.write
pos=file.tell()
file.seek(pos)
a=data[1]
if a.has_key('id'): oid=a['id']
oid=ppml.p64(string.atoi(oid))
v=''
for x in data[2:]:
v=v+x
l=ppml.p64(len(v))
v=oid+l+v
return v
class zopedata:
def __init__(self, parser, tag, attrs):
self.file=parser.file
write=self.file.write
write('ZEXP')
def append(self, data):
file=self.file
write=file.write
pos=file.tell()
file.seek(pos)
write(data)
def start_zopedata(self, tag, data):
return zopedata(self, tag, data)
def save_zopedata(self, tag, data):
file=self.file
write=file.write
pos=file.tell()
file.seek(pos)
write(export_end_marker)
def XMLtoExport(infile, outfile):
import Shared.DC.xml.pyexpat.pyexpat
pyexpat=Shared.DC.xml.pyexpat.pyexpat
if type(infile) is StringType:
infile=open(infile)
if type(outfile) is StringType:
outfile=open(outfile,'w'+'b')
data=infile.read()
F=ppml.xmlPickler()
F.end_handlers['record'] = save_record
F.end_handlers['ZopeData'] = save_zopedata
F.start_handlers['ZopeData'] = start_zopedata
F.binary=1
F.file=outfile
p=pyexpat.ParserCreate()
p.CharacterDataHandler=F.handle_data
p.StartElementHandler=F.unknown_starttag
p.EndElementHandler=F.unknown_endtag
r=p.Parse(data)
return r
def XMLrecord(oid,len,p):
q=ppml.ToXMLUnpickler
f=StringIO(p)
u=q(f)
u.idprefix=str(oid)+'.'
p=u.load().__str__(4)
if f.tell() < len:
p=p+u.load().__str__(4)
String=' <record id="%s">\n%s </record>\n' % (oid, p)
return String
def ExporttoXML(file):
String=''
if type(file) is StringType:
file=open(file,'rb')
read=file.read
if read(4) !='ZEXP':
raise POSException.ExportError, 'Invalid export header'
String=String+'<?xml version="1.0"?>\012<ZopeData>\n'
while 1:
h=read(16)
if h == export_end_marker: break
if len(h) != 16: raise ExportError, 'Truncated export file'
oid=ppml.u64(h[:8])
l=ppml.u64(h[8:16])
pos=file.tell()
p=read(l)
if len(p) != l: raise ExportError, 'Truncated export file'
String=String+XMLrecord(oid,l,p)
l=l+pos
String=String+'</ZopeData>\n'
return String
# End exportToXML
def XMLstringToExport(data, outfile):
import Shared.DC.xml.pyexpat
if type(outfile) is StringType:
outfile=open(outfile,'w'+'b')
F=ppml.xmlPickler()
F.end_handlers['record'] = save_record
F.end_handlers['ZopeData'] = save_zopedata
F.start_handlers['ZopeData'] = start_zopedata
F.binary=1
F.file=outfile
p=xml.parsers.pyexpat.ParserCreate()
p.CharacterDataHandler=F.handle_data
p.StartElementHandler=F.unknown_starttag
p.EndElementHandler=F.unknown_endtag
r=p.Parse(data)
return r
if __name__=='__main__': exportToXML(sys.argv[1])
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment