|
Packit Service |
50c9f2 |
#! /usr/bin/python
|
|
Packit Service |
50c9f2 |
from xml.etree import cElementTree as ET
|
|
Packit Service |
50c9f2 |
import os
|
|
Packit Service |
50c9f2 |
import sqlite3
|
|
Packit Service |
50c9f2 |
import sys
|
|
Packit Service |
50c9f2 |
import getopt
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
# map XML attributes/elements to SQL rows
|
|
Packit Service |
50c9f2 |
# --POC: iterate through the children and attributes of the memberdef elelement
|
|
Packit Service |
50c9f2 |
# and search it in doxygen_sqlite3.db
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
g_conn=None
|
|
Packit Service |
50c9f2 |
val=[]
|
|
Packit Service |
50c9f2 |
def print_unprocessed_attributes(node):
|
|
Packit Service |
50c9f2 |
for key in node.attrib:
|
|
Packit Service |
50c9f2 |
print "WARNING: '%s' has unprocessed attr '%s'" % (node.tag,key)
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
def extract_attribute(node,attribute,pnl):
|
|
Packit Service |
50c9f2 |
if not attribute in node.attrib:
|
|
Packit Service |
50c9f2 |
return
|
|
Packit Service |
50c9f2 |
pnl.append("%s = ?" % attribute)
|
|
Packit Service |
50c9f2 |
val.append(node.attrib[attribute])
|
|
Packit Service |
50c9f2 |
node.attrib.pop(attribute)
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
def extract_element(node,chld,pnl):
|
|
Packit Service |
50c9f2 |
# deal with <tag />
|
|
Packit Service |
50c9f2 |
if chld.text == None:
|
|
Packit Service |
50c9f2 |
if len(chld.attrib)==0:
|
|
Packit Service |
50c9f2 |
node.remove(chld)
|
|
Packit Service |
50c9f2 |
return
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
a=chld.text.strip()
|
|
Packit Service |
50c9f2 |
if not a == "":
|
|
Packit Service |
50c9f2 |
pnl.append("%s =?" % chld.tag)
|
|
Packit Service |
50c9f2 |
val.append(chld.text.strip())
|
|
Packit Service |
50c9f2 |
else:
|
|
Packit Service |
50c9f2 |
pnl.append("%s IS NULL OR %s = ''" % (chld.tag,chld.tag))
|
|
Packit Service |
50c9f2 |
node.remove(chld)
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
def process_memberdef(node):
|
|
Packit Service |
50c9f2 |
q=[]
|
|
Packit Service |
50c9f2 |
for chld in node.getchildren():
|
|
Packit Service |
50c9f2 |
if chld.tag == "referencedby":
|
|
Packit Service |
50c9f2 |
continue
|
|
Packit Service |
50c9f2 |
if chld.tag == "references":
|
|
Packit Service |
50c9f2 |
continue
|
|
Packit Service |
50c9f2 |
if chld.tag == "param":
|
|
Packit Service |
50c9f2 |
continue
|
|
Packit Service |
50c9f2 |
if chld.tag == "type":
|
|
Packit Service |
50c9f2 |
continue
|
|
Packit Service |
50c9f2 |
if chld.tag == "location":
|
|
Packit Service |
50c9f2 |
extract_attribute(chld,"line",q)
|
|
Packit Service |
50c9f2 |
extract_attribute(chld,"column",q)
|
|
Packit Service |
50c9f2 |
extract_attribute(chld,"bodystart",q)
|
|
Packit Service |
50c9f2 |
extract_attribute(chld,"bodyend",q)
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
q.append("id_bodyfile=(select id from files where name=?)")
|
|
Packit Service |
50c9f2 |
val.append(chld.attrib["bodyfile"])
|
|
Packit Service |
50c9f2 |
chld.attrib.pop("bodyfile")
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
q.append("id_file=(select id from files where name=?)")
|
|
Packit Service |
50c9f2 |
val.append(chld.attrib["file"])
|
|
Packit Service |
50c9f2 |
chld.attrib.pop("file")
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
print_unprocessed_attributes(chld)
|
|
Packit Service |
50c9f2 |
if len(chld.attrib) == 0:
|
|
Packit Service |
50c9f2 |
node.remove(chld)
|
|
Packit Service |
50c9f2 |
else:
|
|
Packit Service |
50c9f2 |
extract_element(node,chld,q)
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
for chld in node.getchildren():
|
|
Packit Service |
50c9f2 |
print "WARNING: '%s' has unprocessed child elem '%s'" % (node.tag,chld.tag)
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
extract_attribute(node,"kind",q)
|
|
Packit Service |
50c9f2 |
extract_attribute(node,"prot",q)
|
|
Packit Service |
50c9f2 |
extract_attribute(node,"static",q)
|
|
Packit Service |
50c9f2 |
extract_attribute(node,"mutable",q)
|
|
Packit Service |
50c9f2 |
extract_attribute(node,"const",q)
|
|
Packit Service |
50c9f2 |
extract_attribute(node,"virt",q)
|
|
Packit Service |
50c9f2 |
extract_attribute(node,"explicit",q)
|
|
Packit Service |
50c9f2 |
extract_attribute(node,"inline",q)
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
q.append("refid=?")
|
|
Packit Service |
50c9f2 |
val.append(node.attrib['id'])
|
|
Packit Service |
50c9f2 |
node.attrib.pop('id')
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
print_unprocessed_attributes(node)
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
query="SELECT * FROM memberdef WHERE %s" % " AND ".join(q)
|
|
Packit Service |
50c9f2 |
r=[]
|
|
Packit Service |
50c9f2 |
try:
|
|
Packit Service |
50c9f2 |
r = g_conn.execute(query,val).fetchall()
|
|
Packit Service |
50c9f2 |
except sqlite3.OperationalError,e:
|
|
Packit Service |
50c9f2 |
print "SQL_ERROR:%s"%e
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
del val[:]
|
|
Packit Service |
50c9f2 |
if not len(r) > 0:
|
|
Packit Service |
50c9f2 |
print "TEST_ERROR: Member not found in SQL DB"
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
def load_xml(name):
|
|
Packit Service |
50c9f2 |
context = ET.iterparse(name, events=("start", "end"))
|
|
Packit Service |
50c9f2 |
event, root = context.next()
|
|
Packit Service |
50c9f2 |
for event, elem in context:
|
|
Packit Service |
50c9f2 |
if event == "end" and elem.tag == "memberdef":
|
|
Packit Service |
50c9f2 |
process_memberdef(elem)
|
|
Packit Service |
50c9f2 |
print "\n== Unprocessed XML =="
|
|
Packit Service |
50c9f2 |
# ET.dump(root)
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
def open_db(dbname):
|
|
Packit Service |
50c9f2 |
global g_conn
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
if dbname == None:
|
|
Packit Service |
50c9f2 |
dbname = "doxygen_sqlite3.db"
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
if not os.path.isfile(dbname):
|
|
Packit Service |
50c9f2 |
raise BaseException("No such file %s" % dbname )
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
g_conn = sqlite3.connect(dbname)
|
|
Packit Service |
50c9f2 |
g_conn.execute('PRAGMA temp_store = MEMORY;')
|
|
Packit Service |
50c9f2 |
g_conn.row_factory = sqlite3.Row
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
def main(argv):
|
|
Packit Service |
50c9f2 |
try:
|
|
Packit Service |
50c9f2 |
opts, args = getopt.getopt(argv, "hd:x:",["help"])
|
|
Packit Service |
50c9f2 |
except getopt.GetoptError:
|
|
Packit Service |
50c9f2 |
sys.exit(1)
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
dbname=None
|
|
Packit Service |
50c9f2 |
xmlfile=None
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
for a, o in opts:
|
|
Packit Service |
50c9f2 |
if a in ('-h', '--help'):
|
|
Packit Service |
50c9f2 |
sys.exit(0)
|
|
Packit Service |
50c9f2 |
elif a in ('-d'):
|
|
Packit Service |
50c9f2 |
dbname=o
|
|
Packit Service |
50c9f2 |
continue
|
|
Packit Service |
50c9f2 |
elif a in ('-x'):
|
|
Packit Service |
50c9f2 |
xmlfile=o
|
|
Packit Service |
50c9f2 |
continue
|
|
Packit Service |
50c9f2 |
open_db(dbname)
|
|
Packit Service |
50c9f2 |
load_xml(xmlfile)
|
|
Packit Service |
50c9f2 |
|
|
Packit Service |
50c9f2 |
if __name__ == '__main__':
|
|
Packit Service |
50c9f2 |
main(sys.argv[1:])
|