55 lines
1.3 KiB
Python
55 lines
1.3 KiB
Python
import xml.etree.ElementTree as ET
|
|
import pickle
|
|
import os
|
|
import os.path
|
|
import base64
|
|
|
|
class XMLStore:
|
|
|
|
def __init__(self, path, splitFiles = None):
|
|
if splitFiles is None:
|
|
splitFiles = path is None or os.path.isdir( path )
|
|
|
|
self.__path = path
|
|
self.__split = splitFiles
|
|
|
|
self.__xml = None
|
|
|
|
def save(self, state, persistentStates = {}, xml = None):
|
|
print("save(self,{0},{1})".format(state,persistentStates))
|
|
|
|
po = ET.Element("PersistentObject")
|
|
po.attrib["id"] = state["pid"]
|
|
po.attrib["class"] = state["class"]
|
|
po.attrib["module"] = state["module"]
|
|
|
|
for field in state["fields"]:
|
|
attr = ET.SubElement(po,"Attribute")
|
|
attr.attrib["name"] = field
|
|
attr.attrib["protocol"] = "pickle"
|
|
attr.text = base64.b64encode( pickle.dumps(state["fields"][field]) ).decode("utf-8")
|
|
|
|
for pfield in state["pfields"]:
|
|
attr = ET.SubElement(po,"Attribute")
|
|
attr.attrib["name"] = pfield
|
|
attr.attrib["protocol"] = "persistence"
|
|
attr.text = state["pfields"][pfield]
|
|
|
|
if xml is None:
|
|
xml = ET.Element("PersistentObjects")
|
|
xml.attrib["root"] = state["pid"]
|
|
|
|
xml.append( po )
|
|
|
|
for pstate in persistentStates:
|
|
ps = persistentStates[ pstate ]
|
|
if not ps == state:
|
|
self.save( ps, xml = xml )
|
|
|
|
self.__xml = xml
|
|
|
|
def load(self, pid):
|
|
pass
|
|
|
|
def lastXml(self):
|
|
return self.__xml |