summaryrefslogtreecommitdiffstatshomepage
path: root/scripts/minimaws/lib/lxparse.py
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2019-12-15 00:19:29 +1100
committer Vas Crabb <vas@vastheman.com>2019-12-15 00:19:29 +1100
commitd506479fdd288ceecd0ee990aca3314af80ded51 (patch)
treedf7e25634e2c494721f53772c00d3947bcb284b2 /scripts/minimaws/lib/lxparse.py
parent7db47ce8ae7a3a75bce1590b6a0ea67d8611a5a0 (diff)
minimaws: load and index some software list data (no way to display it yet)
also fix up some software lists with duplicate part features (nw)
Diffstat (limited to 'scripts/minimaws/lib/lxparse.py')
-rw-r--r--scripts/minimaws/lib/lxparse.py130
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()