Blame testing/testsqlite3.py

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