Blame testing/testsqlite3.py

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:])