diff options
Diffstat (limited to 'scripts/minimaws/lib/lxparse.py')
-rw-r--r-- | scripts/minimaws/lib/lxparse.py | 130 |
1 files changed, 123 insertions, 7 deletions
diff --git a/scripts/minimaws/lib/lxparse.py b/scripts/minimaws/lib/lxparse.py index 96669ea99eb..746cba33fe8 100644 --- a/scripts/minimaws/lib/lxparse.py +++ b/scripts/minimaws/lib/lxparse.py @@ -5,6 +5,8 @@ from . import dbaccess +import os +import os.path import subprocess import xml.sax import xml.sax.saxutils @@ -191,6 +193,9 @@ class MachineHandler(ElementHandler): self.romof = attrs.get('romof') self.dbcurs.add_sourcefile(self.sourcefile) + def endMainElement(self, name): + self.dbcurs.close() + def startChildElement(self, name, attrs): if name in self.CHILD_HANDLERS: self.setChildHandler(name, attrs, self.CHILD_HANDLERS[name](self)) @@ -238,9 +243,6 @@ class MachineHandler(ElementHandler): self.manufacturer = handler.text self.dbcurs.add_system(self.id, self.year, self.manufacturer) - def endMainElement(self, name): - self.dbcurs.close() - class ListXmlHandler(ElementHandler): def __init__(self, dbconn, **kwargs): @@ -259,12 +261,10 @@ class ListXmlHandler(ElementHandler): msg=('Expected "mame" element but found "%s"' % (name, )), exception=None, locator=self.locator) - self.dbconn.prepare_for_load() self.machines = 0 def endMainElement(self, name): - # TODO: build index by first letter or whatever - self.dbconn.finalise_load() + self.dbconn.commit() def startChildElement(self, name, attrs): if name != 'machine': @@ -286,11 +286,127 @@ class ListXmlHandler(ElementHandler): pass +class SoftwarePartHandler(ElementHandler): + def __init__(self, parent, **kwargs): + super(SoftwarePartHandler, self).__init__(parent=parent, **kwargs) + self.dbcurs = parent.dbcurs + self.software = parent.id + + def startMainElement(self, name, attrs): + self.id = self.dbcurs.add_softwarepart(self.software, attrs['name'], attrs['interface']) + + def startChildElement(self, name, attrs): + if name == 'feature': + self.dbcurs.add_softwarepartfeaturetype(attrs['name']) + self.dbcurs.add_softwarepartfeature(self.id, attrs['name'], attrs['value']) + self.setChildHandler(name, attrs, self.IGNORE) + + +class SoftwareHandler(ElementHandler): + CHILD_HANDLERS = { + 'description': TextAccumulator, + 'year': TextAccumulator, + 'publisher': TextAccumulator, + 'part': SoftwarePartHandler } + + def __init__(self, parent, **kwargs): + super(SoftwareHandler, self).__init__(parent=parent, **kwargs) + self.dbcurs = self.dbconn.cursor() + self.softwarelist = parent.id + + def startMainElement(self, name, attrs): + self.shortname = attrs['name'] + self.cloneof = attrs.get('cloneof') + self.supported = 0 if (attrs.get('supported', 'yes') == 'yes') else 1 if (attrs.get('supported', 'yes') == 'partial') else 2 + + def endMainElement(self, name): + self.dbcurs.close() + + def startChildElement(self, name, attrs): + if name in self.CHILD_HANDLERS: + self.setChildHandler(name, attrs, self.CHILD_HANDLERS[name](self)) + else: + if name == 'info': + self.dbcurs.add_softwareinfotype(attrs['name']) + self.dbcurs.add_softwareinfo(self.id, attrs['name'], attrs['value']) + elif name == 'sharedfeat': + self.dbcurs.add_softwaresharedfeattype(attrs['name']) + self.dbcurs.add_softwaresharedfeat(self.id, attrs['name'], attrs['value']) + self.setChildHandler(name, attrs, self.IGNORE) + + def endChildHandler(self, name, handler): + if name == 'description': + self.description = handler.text + elif name == 'year': + self.year = handler.text + elif name == 'publisher': + self.publisher = handler.text + self.id = self.dbcurs.add_software(self.softwarelist, self.shortname, self.supported, self.description, self.year, self.publisher) + + +class SoftwareListHandler(ElementHandler): + def __init__(self, dbconn, **kwargs): + super(SoftwareListHandler, self).__init__(parent=None, **kwargs) + self.dbconn = dbconn + + def startDocument(self): + pass + + def endDocument(self): + pass + + def startMainElement(self, name, attrs): + if name != 'softwarelist': + raise xml.sax.SAXParseException( + msg=('Expected "softwarelist" element but found "%s"' % (name, )), + exception=None, + locator=self.locator) + self.shortname = attrs['name'] + self.description = attrs['description'] + self.entries = 0 + dbcurs = self.dbconn.cursor() + self.id = dbcurs.add_softwarelist(self.shortname, self.description) + dbcurs.close() + + def endMainElement(self, name): + self.dbconn.commit() + + def startChildElement(self, name, attrs): + if name != 'software': + raise xml.sax.SAXParseException( + msg=('Expected "software" element but found "%s"' % (name, )), + exception=None, + locator=self.locator) + self.setChildHandler(name, attrs, SoftwareHandler(self)) + + def endChildHandler(self, name, handler): + if name == 'software': + if self.entries >= 1023: + self.dbconn.commit() + self.entries = 0 + else: + self.entries += 1 + + def processingInstruction(self, target, data): + pass + + def load_info(options): + dbconn = dbaccess.UpdateConnection(options.database) + dbconn.prepare_for_load() parser = xml.sax.make_parser() - parser.setContentHandler(ListXmlHandler(dbaccess.UpdateConnection(options.database))) + + parser.setContentHandler(ListXmlHandler(dbconn)) if options.executable is not None: task = subprocess.Popen([options.executable, '-listxml'], stdout=subprocess.PIPE) parser.parse(task.stdout) else: parser.parse(options.file) + + if options.softwarepath: + parser.setContentHandler(SoftwareListHandler(dbconn)) + for path in options.softwarepath: + for filename in [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.xml')]: + parser.parse(filename) + + dbconn.finalise_load() |