Skip to content

Commit

Permalink
sqlite3: add new searches to search.py
Browse files Browse the repository at this point in the history
+  -I <I>    Get the includers of <I>
+  -i <I>    Get the includees of <I>
+  -M <C>    Get all members of class <C>
+  -B <C>    Get the base classes of class <C>
+  -S <C>    Get the sub classes of class <C>

Signed-off-by: Adrian Negreanu <adrian.m.negreanu@intel.com>
  • Loading branch information
groleo committed Feb 8, 2014
1 parent 2b80c41 commit c99422b
Showing 1 changed file with 267 additions and 62 deletions.
329 changes: 267 additions & 62 deletions addon/doxypysql/search.py
Expand Up @@ -12,8 +12,8 @@
import sqlite3
import sys
import os
import re
import getopt
import json

class MemberType:
Define="0"
Expand All @@ -29,82 +29,210 @@ class MemberType:
Property="10"
Event="11"

class RequestType:
References="9901"
Struct="9902"
Includers="9903"
Includees="9904"
Members="9905"
BaseClasses="9906"
SubClasses="9907"

g_conn=None
###############################################################################

def escapeLike(val):
return 'LIKE "%' + val.replace("\\", "\\\\").replace("_", "\\_") \
.replace("%", "\\%") + '%" ESCAPE "\\"'

def matchName(name):
if type(name) is str:
return "name "+escapeLike(name)
else:
return 'id=%d' %name

def fileName(id_file):
if g_conn.execute("SELECT COUNT(*) FROM files WHERE id=?",[id_file]).fetchone()[0] > 1:
print "non-uniq fileid"

for r in g_conn.execute("SELECT * FROM files WHERE id=?",[id_file]).fetchall():
return r['name']

return ""

def fileId(name):
if g_conn.execute("SELECT COUNT(*) FROM files WHERE name=?",[name]).fetchone()[0] > 1:
print "non-uniq file name"

def getLine(id_file,line,column):
rv=""
for r in g_conn.execute('SELECT * FROM files WHERE id=%d;' % id_file).fetchall():
rv += "found in file %s:%d:%d" % (r['name'],line,column)
return rv
for r in g_conn.execute("SELECT * FROM files WHERE name=?",[name]).fetchall():
return r['id']

return -1

###############################################################################

def processCallers(caller, path=None, fid=None):
def findReferences(name):
o=[]

cur = g_conn.cursor()
cur.execute("SELECT refid FROM memberdef WHERE name=?",[name])
refids = cur.fetchall()

if len(refids) == 0:
return o

refid = refids[0]['refid']
cur = g_conn.cursor()
if fid is None:
cur.execute("SELECT refid FROM memberdef WHERE name='%s'" % caller)
refids = cur.fetchall()
if len(refids) == 0:
print 'No results found'
return
refid = refids[0]['refid']
print "%s" % refid
for info in cur.execute("SELECT * FROM xrefs WHERE dst LIKE '%"+refid+"%'"):
item={}
cur = g_conn.cursor()
for info in cur.execute("SELECT * FROM xrefs WHERE dst LIKE '%"+refid+"%'"):
cur = g_conn.cursor()
for i2 in cur.execute("SELECT * FROM memberdef WHERE refid='%s'" % info['src']):
print "caller:%s" % i2['name']
for i2 in cur.execute("SELECT * FROM files WHERE id='%s'" % info['id_file']):
print "file : %s:%d" % (i2['name'],info['line'])
for i2 in cur.execute("SELECT * FROM memberdef WHERE refid=?",[info['src']]):
item['name']=i2['name']
item['src']=info['src']
item['file']=fileName(info['id_file'])
item['line']=info['line']

o.append(item)
return o

def processFunction(name):
for r in g_conn.execute('SELECT * FROM memberdef WHERE name LIKE "%'
+name+'%" AND kind='+MemberType.Function+';').fetchall():
print '==> %s %s %s' % (r['type'],r['name'],r['argsstring'])
print getLine(r['id_file'],r['line'],r['column'])

def findFunction(name):
o=[]
for r in g_conn.execute('SELECT * FROM memberdef WHERE '+matchName(name)+' AND kind=?',[MemberType.Function]).fetchall():
item={}
item['name'] = r['name']
item['definition'] = r['definition']
item['argsstring'] = r['argsstring']
item['file'] = fileName(r['id_file'])
item['line'] = r['line']
item['detaileddescription'] = r['detaileddescription']
o.append(item)
return o

def processMacro(name):
for r in g_conn.execute('SELECT * FROM memberdef WHERE name LIKE "%'
+name+'%" AND kind='+MemberType.Define+';').fetchall():
mname = r['name']

def findMacro(name):
o=[]
for r in g_conn.execute('SELECT * FROM memberdef WHERE '+matchName(name)+' AND kind=?',[MemberType.Define]).fetchall():
item={}
item['name'] = r['name']
if r['argsstring']:
mname += r['argsstring']
print '%s' % (mname)
print getLine(r['id_file'],r['line'],r['column'])
item['argsstring'] = r['argsstring']
item['definition'] = r['initializer']
item['file'] = fileName(r['id_file'])
item['line'] = r['line']
o.append(item)
return o


def findTypedef(name):
o=[]
for r in g_conn.execute('SELECT * FROM memberdef WHERE '+matchName(name)+' AND kind=?',[MemberType.Typedef]).fetchall():
item={}
item['name'] = r['name']
item['definition'] = r['definition']
item['file'] = fileName(r['id_file'])
item['line'] = r['line']
o.append(item)
return o


def findVariable(name):
o=[]
for r in g_conn.execute('SELECT * FROM memberdef WHERE '+matchName(name)+' AND kind=?',[MemberType.Variable]).fetchall():
item={}
item['name'] = r['name']
item['definition'] = r['definition']
item['file'] = fileName(r['id_file'])
item['line'] = r['line']
o.append(item)
return o

def findParams(name):
o=[]
for r in g_conn.execute('SELECT id FROM memberdef WHERE '+matchName(name)).fetchall():
#a=("SELECT * FROM params where id=(SELECT id_param FROM memberdef_params where id_memberdef=?",[id_memberdef])
item={}
item['id'] = r['id']
o.append(item)
return o


def findStruct(name):
o=[]
for r in g_conn.execute('SELECT * FROM compounddef WHERE '+matchName(name)).fetchall():
item={}
item['name'] = r['name']
o.append(item)
return o

def findIncluders(name):
o=[]
fid = fileId(name)
for r in g_conn.execute('SELECT * FROM includes WHERE id_dst=?',[fid]).fetchall():
item={}
item['name'] = fileName(r['id_src'])
o.append(item)
return o

def findIncludees(name):
o=[]
fid = fileId(name)
for r in g_conn.execute('SELECT * FROM includes WHERE id_src=?',[fid]).fetchall():
item={}
item['name'] = r['dst']
o.append(item)
return o


def processType(name, path=None):
for r in g_conn.execute('SELECT * FROM memberdef WHERE name LIKE "%'
+name+'%" AND kind='+MemberType.Typedef+';').fetchall():
print '%s' % (r['name'])
print getLine(r['id_file'],r['line'],r['column'])
def findMembers(name):
o=[]
for r in g_conn.execute('SELECT * FROM memberdef WHERE scope LIKE "%'+name+'%";').fetchall():
item={}
item['name'] = r['name']
item['definition'] = r['definition']
item['argsstring'] = r['argsstring']
item['file'] = fileName(r['id_file'])
item['line'] = r['line']
item['documentation'] = r['documentation']
o.append(item)
return o


def processVariable(name):
for r in g_conn.execute('SELECT * FROM memberdef WHERE name LIKE "%'+
name + '%" AND kind='+MemberType.Variable+';').fetchall():
print '> %s' % (r['name'])
print getLine(r['id_file'],r['line'],r['column'])
def findBaseClasses(name):
o=[]
for r in g_conn.execute('SELECT base FROM basecompoundref WHERE derived=?',[name]).fetchall():
item={}
item['name'] = r['base']
o.append(item)
return o


def findSubClasses(name):
o=[]
for r in g_conn.execute('SELECT derived FROM basecompoundref WHERE base=?',[name]).fetchall():
item={}
item['name'] = r['derived']
o.append(item)
return o


###############################################################################

def usage():
print """Usage: search.py [options]
print """Usage: search.py [Options]
Options:
-h, --help
-d <D> Use database <D> for queries
-c <F> Search for callers of <F>
-f <F> Search for function <F>
-m <M> Search for macro <M>
-t <T> Search for type <T>
-v <V> Search for variable <V>
-r <F> Search for references to <F>
-f <F> Search for definition of function <F>
-m <M> Search for definition of macro <M>
-t <T> Search for definition of type <T>
-v <V> Search for definition of variable <V>
-I <I> Get the includers of <I>
-i <I> Get the includees of <I>
-M <C> Get all members of class <C>
-B <C> Get the base classes of class <C>
-S <C> Get the sub classes of class <C>
"""

def openDb(dbname):
Expand All @@ -121,39 +249,116 @@ def openDb(dbname):
g_conn.row_factory = sqlite3.Row

###############################################################################
def process(kind,o):
request_processors = {
MemberType.Function: findFunction,
MemberType.Define: findMacro,
MemberType.Variable: findVariable,
MemberType.Typedef: findTypedef,
RequestType.References: findReferences,
RequestType.Struct: findStruct,
RequestType.Includers: findIncluders,
RequestType.Includees: findIncludees,
RequestType.Members: findMembers,
RequestType.BaseClasses: findBaseClasses,
RequestType.SubClasses: findSubClasses
}
return request_processors[kind](o)


def main(argv):
def processHref(ref):
j={}

# is it in memberdef ?
table="memberdef"
if ( g_conn.execute("SELECT count(*) from %s WHERE refid='%s'" % (table,ref) ).fetchone()[0] > 0 ):
for r in g_conn.execute("SELECT kind,id FROM %s WHERE refid='%s'" % (table,ref) ).fetchall():
j=process(str(r['kind']),int(r['id']))

# is it in compounddef ?
table="compounddef"
if ( g_conn.execute("SELECT count(*) from %s WHERE refid='%s'" % (table,ref)).fetchone()[0] > 0 ):
for r in g_conn.execute("SELECT id FROM %s WHERE refid='%s'" % (table,ref) ).fetchall():
j=process(RequestType.Struct,int(r['id']))

return j


def serveCgi():
import cgi

print 'Content-Type: application/json\n'

fieldStorage = cgi.FieldStorage()
form = dict((key, fieldStorage.getvalue(key)) for key in fieldStorage.keys())

if 'href' in form:
ref = form['href']
else:
print '{"result": null, "error": "no refid given"}'
sys.exit(0)

openDb('doxygen_sqlite3.db')

j = processHref(ref)

print json.dumps({"result":j,"error":None})


def serveCli(argv):
try:
opts, args = getopt.getopt(argv, "hc:d:f:m:t:v:",["help"])
opts, args = getopt.getopt(argv, "hr:I:i:d:f:m:t:v:H:M:B:S:",["help"])
except getopt.GetoptError:
usage()
sys.exit(1)

ref=None
dbname=None
j={}

for a, o in opts:
if a in ('-h', '--help'):
usage()
sys.exit(0)
elif a in ('-d'):
dbname=o
elif a in ('-c'):
openDb(dbname)
processCallers(o)
continue
elif a in ('-r'):
kind=RequestType.References
elif a in ('-I'):
kind=RequestType.Includers
elif a in ('-i'):
kind=RequestType.Includees
elif a in ('-M'):
kind=RequestType.Members
elif a in ('-B'):
kind=RequestType.BaseClasses
elif a in ('-S'):
kind=RequestType.SubClasses
elif a in ('-f'):
openDb(dbname)
processFunction(o)
kind=MemberType.Function
elif a in ('-m'):
openDb(dbname)
processMacro(o)
kind=MemberType.Define
elif a in ('-t'):
openDb(dbname)
processType(o)
kind=MemberType.Typedef
elif a in ('-v'):
openDb(dbname)
processVariable(o)
kind=MemberType.Variable
elif a in ('-H'):
ref = o

openDb(dbname)
if ref != None:
j=processHref(ref)
else:
j=process(kind,o)
print json.dumps(j)


def main(argv):
if 'REQUEST_METHOD' in os.environ:
serveCgi()
else:
serveCli(argv)

if __name__ == '__main__':
main(sys.argv[1:])

0 comments on commit c99422b

Please sign in to comment.