python-objectbroker/objectbroker/XMLStore.py

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