From cd4bdf6708194228434bed1f71d1cd698863aaaf Mon Sep 17 00:00:00 2001 From: Adrian Negreanu Date: Sat, 1 Feb 2014 21:10:19 +0200 Subject: sqlite3: extract more info memberdef table changes: * rename bstart to bodystart * rename id_bfile to id_bodyfile * add bodyend * add {brief,detailed,inbody}description Signed-off-by: Adrian Negreanu --- src/sqlite3gen.cpp | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/src/sqlite3gen.cpp b/src/sqlite3gen.cpp index 94afed7..c57e4b0 100644 --- a/src/sqlite3gen.cpp +++ b/src/sqlite3gen.cpp @@ -77,9 +77,9 @@ const char *i_q_xrefs="INSERT OR REPLACE INTO xrefs " static sqlite3_stmt *i_s_xrefs=0; ////////////////////////////////////////////////////// const char *i_q_memberdef="INSERT OR REPLACE INTO memberdef " - "( refid, prot, static, const, explicit, inline, final, sealed, new, optional, required, virt, mutable, initonly, readable, writable, gettable, settable, accessor, addable, removable, raisable, name, type, definition, argsstring, scope, initializer, kind, id_bfile, bline, bcolumn, id_file, line, column)" + "( refid, prot, static, const, explicit, inline, final, sealed, new, optional, required, virt, mutable, initonly, readable, writable, gettable, settable, accessor, addable, removable, raisable, name, type, definition, argsstring, scope, initializer, kind, id_bodyfile, bodystart, bodyend, id_file, line, column, detaileddescription, briefdescription, inbodydescription)" "VALUES " - "(:refid,:prot,:static,:const,:explicit,:inline,:final,:sealed,:new,:optional,:required,:virt,:mutable,:initonly,:readable,:writable,:gettable,:settable,:accessor,:addable,:removable,:raisable,:name,:type,:definition,:argsstring,:scope,:initializer,:kind,:id_bfile,:bline,:bcolumn,:id_file,:line,:column)"; + "(:refid,:prot,:static,:const,:explicit,:inline,:final,:sealed,:new,:optional,:required,:virt,:mutable,:initonly,:readable,:writable,:gettable,:settable,:accessor,:addable,:removable,:raisable,:name,:type,:definition,:argsstring,:scope,:initializer,:kind,:id_bodyfile,:bodystart,:bodyend,:id_file,:line,:column,:detaileddescription,:briefdescription,:inbodydescription)"; const char *id_q_memberdef="SELECT id FROM memberdef WHERE refid=:refid and id is not null"; static sqlite3_stmt *id_s_memberdef=0; static sqlite3_stmt *i_s_memberdef=0; @@ -202,12 +202,16 @@ const char * schema_queries[][2] = "raisable INTEGER," "kind INTEGER," "refid TEXT NOT NULL," - "id_bfile INTEGER," - "bline INTEGER," - "bcolumn INTEGER," + "id_bodyfile INTEGER," + "bodystart INTEGER," + "bodyend INTEGER," "id_file INTEGER NOT NULL," "line INTEGER NOT NULL," - "column INTEGER NOT NULL)" + "column INTEGER NOT NULL," + "detaileddescription TEXT," + "briefdescription TEXT," + "inbodydescription TEXT" + ")" }, }; @@ -692,6 +696,12 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def) bindTextParameter(i_s_memberdef,":scope",md->getScopeString().data(),FALSE); } + // Brief and detail description + + bindTextParameter(i_s_memberdef,":briefdescription",md->briefDescription(),FALSE); + bindTextParameter(i_s_memberdef,":detaileddescription",md->documentation(),FALSE); + bindTextParameter(i_s_memberdef,":inbodydescription",md->inbodyDocumentation(),FALSE); + // File location if (md->getDefLine() != -1) { @@ -704,18 +714,16 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def) if (md->getStartBodyLine()!=-1) { - int id_bfile = insertFile(db,md->getBodyDef()->absFilePath()); - if (id_bfile == -1) + int id_bodyfile = insertFile(db,md->getBodyDef()->absFilePath()); + if (id_bodyfile == -1) { sqlite3_clear_bindings(i_s_memberdef); } else { - bindIntParameter(i_s_memberdef,":id_ibfile",id_bfile); - bindIntParameter(i_s_memberdef,":bline",md->getStartBodyLine()); - - // XXX implement getStartBodyColumn - bindIntParameter(i_s_memberdef,":bcolumn",1); + bindIntParameter(i_s_memberdef,":id_bodyfile",id_bodyfile); + bindIntParameter(i_s_memberdef,":bodystart",md->getStartBodyLine()); + bindIntParameter(i_s_memberdef,":bodyend",md->getEndBodyLine()); } } } -- cgit v0.12 From 6f38dd245d56aaa9b6c8e966a4ccebe2f66ceb7d Mon Sep 17 00:00:00 2001 From: Adrian Negreanu Date: Sat, 1 Feb 2014 21:21:04 +0200 Subject: sqlite3: SQLITE_TRANSIENTs In table basecompoundref, use SQLITE_TRANSIENT for base, derived, refid --- src/sqlite3gen.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sqlite3gen.cpp b/src/sqlite3gen.cpp index c57e4b0..846da31 100644 --- a/src/sqlite3gen.cpp +++ b/src/sqlite3gen.cpp @@ -845,19 +845,19 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd) BaseClassDef *bcd; for (bcli.toFirst();(bcd=bcli.current());++bcli) { - bindTextParameter(i_s_basecompoundref,":refid",bcd->classDef->getOutputFileBase()); + bindTextParameter(i_s_basecompoundref,":refid",bcd->classDef->getOutputFileBase(),FALSE); bindIntParameter(i_s_basecompoundref,":prot",bcd->prot); bindIntParameter(i_s_basecompoundref,":virt",bcd->virt); if (!bcd->templSpecifiers.isEmpty()) { - bindTextParameter(i_s_basecompoundref,":base",insertTemplateSpecifierInScope(bcd->classDef->name(),bcd->templSpecifiers)); + bindTextParameter(i_s_basecompoundref,":base",insertTemplateSpecifierInScope(bcd->classDef->name(),bcd->templSpecifiers),FALSE); } else { - bindTextParameter(i_s_basecompoundref,":base",bcd->classDef->displayName()); + bindTextParameter(i_s_basecompoundref,":base",bcd->classDef->displayName(),FALSE); } - bindTextParameter(i_s_basecompoundref,":derived",cd->displayName()); + bindTextParameter(i_s_basecompoundref,":derived",cd->displayName(),FALSE); if (-1==step(db,i_s_basecompoundref)) { sqlite3_clear_bindings(i_s_basecompoundref); continue; -- cgit v0.12 From 733aaaa073a92a316ba888b6992f1172550dd469 Mon Sep 17 00:00:00 2001 From: Adrian Negreanu Date: Wed, 29 Jan 2014 00:58:43 +0200 Subject: testsqlite3: a test for sqlite3gen This verifies the 'memberdef' table against the generated XMLs. It accomplishes this by executing a sql query, constructed by iterating through the children and attributes of the memberdef XML element. The information translated from xml to sql, is then removed from the DOM, and the unprocessed bits are printed as warning messages. usage: testing/testsqlite3.py -d /.../doxygen_sqlite3.db -x /.../xml/test__x11_8cpp.xml output: WARNING: 'location' has unprocessed attr 'bodyend' WARNING: 'memberdef' has unprocessed child elem 'briefdescription' WARNING: 'memberdef' has unprocessed child elem 'detaileddescription' WARNING: 'memberdef' has unprocessed child elem 'inbodydescription' WARNING: 'memberdef' has unprocessed child elem 'location' WARNING: 'memberdef' has unprocessed attr 'kind' WARNING: 'memberdef' has unprocessed attr 'prot' WARNING: 'memberdef' has unprocessed attr 'static' WARNING: 'memberdef' has unprocessed attr 'id' --- testing/testsqlite3.py | 146 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100755 testing/testsqlite3.py 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 + 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:]) -- cgit v0.12