diff options
author | Dimitri van Heesch <dimitri@stack.nl> | 2014-02-03 20:26:05 (GMT) |
---|---|---|
committer | Dimitri van Heesch <dimitri@stack.nl> | 2014-02-03 20:26:05 (GMT) |
commit | 0dc96d28963f2260786650be0a5fa360d02045ae (patch) | |
tree | 7925f59cfb99e02d977131101c488f824605629c /testing | |
parent | b4d5ef176eced8315523baea464cfda733ecb9aa (diff) | |
parent | cd68727a749fb2d3fd7ade308a080646989564a2 (diff) | |
download | Doxygen-0dc96d28963f2260786650be0a5fa360d02045ae.zip Doxygen-0dc96d28963f2260786650be0a5fa360d02045ae.tar.gz Doxygen-0dc96d28963f2260786650be0a5fa360d02045ae.tar.bz2 |
Merge branch 'master' of github.com:doxygen/doxygen
Diffstat (limited to 'testing')
-rwxr-xr-x | testing/testsqlite3.py | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/testing/testsqlite3.py b/testing/testsqlite3.py new file mode 100755 index 0000000..e8ab16c --- /dev/null +++ b/testing/testsqlite3.py @@ -0,0 +1,146 @@ +#! /usr/bin/python +from xml.etree import cElementTree as ET +import os +import sqlite3 +import sys +import getopt + +# map XML attributes/elements to SQL rows +# --POC: iterate through the children and attributes of the memberdef elelement +# and search it in doxygen_sqlite3.db + +g_conn=None +val=[] +def print_unprocessed_attributes(node): + for key in node.attrib: + print "WARNING: '%s' has unprocessed attr '%s'" % (node.tag,key) + +def extract_attribute(node,attribute,pnl): + if not attribute in node.attrib: + return + pnl.append("%s = ?" % attribute) + val.append(node.attrib[attribute]) + node.attrib.pop(attribute) + +def extract_element(node,chld,pnl): + # deal with <tag /> + if chld.text == None: + if len(chld.attrib)==0: + node.remove(chld) + return + + a=chld.text.strip() + if not a == "": + pnl.append("%s =?" % chld.tag) + val.append(chld.text.strip()) + else: + pnl.append("%s IS NULL OR %s = ''" % (chld.tag,chld.tag)) + node.remove(chld) + +def process_memberdef(node): + q=[] + for chld in node.getchildren(): + if chld.tag == "referencedby": + continue + if chld.tag == "references": + continue + if chld.tag == "param": + continue + if chld.tag == "type": + continue + if chld.tag == "location": + extract_attribute(chld,"line",q) + extract_attribute(chld,"column",q) + extract_attribute(chld,"bodystart",q) + extract_attribute(chld,"bodyend",q) + + q.append("id_bodyfile=(select id from files where name=?)") + val.append(chld.attrib["bodyfile"]) + chld.attrib.pop("bodyfile") + + q.append("id_file=(select id from files where name=?)") + val.append(chld.attrib["file"]) + chld.attrib.pop("file") + + print_unprocessed_attributes(chld) + if len(chld.attrib) == 0: + node.remove(chld) + else: + extract_element(node,chld,q) + + for chld in node.getchildren(): + print "WARNING: '%s' has unprocessed child elem '%s'" % (node.tag,chld.tag) + + extract_attribute(node,"kind",q) + extract_attribute(node,"prot",q) + extract_attribute(node,"static",q) + extract_attribute(node,"mutable",q) + extract_attribute(node,"const",q) + extract_attribute(node,"virt",q) + extract_attribute(node,"explicit",q) + extract_attribute(node,"inline",q) + + q.append("refid=?") + val.append(node.attrib['id']) + node.attrib.pop('id') + + print_unprocessed_attributes(node) + + query="SELECT * FROM memberdef WHERE %s" % " AND ".join(q) + r=[] + try: + r = g_conn.execute(query,val).fetchall() + except sqlite3.OperationalError,e: + print "SQL_ERROR:%s"%e + + del val[:] + if not len(r) > 0: + print "TEST_ERROR: Member not found in SQL DB" + + +def load_xml(name): + context = ET.iterparse(name, events=("start", "end")) + event, root = context.next() + for event, elem in context: + if event == "end" and elem.tag == "memberdef": + process_memberdef(elem) + print "\n== Unprocessed XML ==" +# ET.dump(root) + + +def open_db(dbname): + global g_conn + + if dbname == None: + dbname = "doxygen_sqlite3.db" + + if not os.path.isfile(dbname): + raise BaseException("No such file %s" % dbname ) + + g_conn = sqlite3.connect(dbname) + g_conn.execute('PRAGMA temp_store = MEMORY;') + g_conn.row_factory = sqlite3.Row + +def main(argv): + try: + opts, args = getopt.getopt(argv, "hd:x:",["help"]) + except getopt.GetoptError: + sys.exit(1) + + dbname=None + xmlfile=None + + for a, o in opts: + if a in ('-h', '--help'): + sys.exit(0) + elif a in ('-d'): + dbname=o + continue + elif a in ('-x'): + xmlfile=o + continue + open_db(dbname) + load_xml(xmlfile) + +if __name__ == '__main__': + main(sys.argv[1:]) |