|
Packit |
1c1d7e |
/******************************************************************************
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Copyright (C) 1997-2015 by Dimitri van Heesch.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Permission to use, copy, modify, and distribute this software and its
|
|
Packit |
1c1d7e |
* documentation under the terms of the GNU General Public License is hereby
|
|
Packit |
1c1d7e |
* granted. No representations are made about the suitability of this software
|
|
Packit |
1c1d7e |
* for any purpose. It is provided "as is" without express or implied warranty.
|
|
Packit |
1c1d7e |
* See the GNU General Public License for more details.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
* Documents produced by Doxygen are derivative works derived from the
|
|
Packit |
1c1d7e |
* input used in their production; they are not affected by this license.
|
|
Packit |
1c1d7e |
*
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <stdlib.h>
|
|
Packit |
1c1d7e |
#include <stdio.h>
|
|
Packit |
1c1d7e |
#include "settings.h"
|
|
Packit |
1c1d7e |
#include "message.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if USE_SQLITE3
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "qtbc.h"
|
|
Packit |
1c1d7e |
#include "sqlite3gen.h"
|
|
Packit |
1c1d7e |
#include "doxygen.h"
|
|
Packit |
1c1d7e |
#include "config.h"
|
|
Packit |
1c1d7e |
#include "util.h"
|
|
Packit |
1c1d7e |
#include "docparser.h"
|
|
Packit |
1c1d7e |
#include "language.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "dot.h"
|
|
Packit |
1c1d7e |
#include "arguments.h"
|
|
Packit |
1c1d7e |
#include "classlist.h"
|
|
Packit |
1c1d7e |
#include "filedef.h"
|
|
Packit |
1c1d7e |
#include "namespacedef.h"
|
|
Packit |
1c1d7e |
#include "filename.h"
|
|
Packit |
1c1d7e |
#include "groupdef.h"
|
|
Packit |
1c1d7e |
#include "pagedef.h"
|
|
Packit |
1c1d7e |
#include "dirdef.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include <qdir.h>
|
|
Packit |
1c1d7e |
#include <string.h>
|
|
Packit |
1c1d7e |
#include <sqlite3.h>
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//#define DBG_CTX(x) printf x
|
|
Packit |
1c1d7e |
#define DBG_CTX(x) do { } while(0)
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
const char * schema_queries[][2] = {
|
|
Packit |
1c1d7e |
{ "includes",
|
|
Packit |
1c1d7e |
"CREATE TABLE IF NOT EXISTS includes (\n"
|
|
Packit |
1c1d7e |
"\t-- #include relations.\n"
|
|
Packit |
1c1d7e |
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tlocal INTEGER NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tid_src INTEGER NOT NULL, -- File id of the includer.\n"
|
|
Packit |
1c1d7e |
"\tid_dst INTEGER NOT NULL -- File id of the includee.\n"
|
|
Packit |
1c1d7e |
");\n"
|
|
Packit |
1c1d7e |
"CREATE UNIQUE INDEX idx_includes ON includes\n"
|
|
Packit |
1c1d7e |
"\t(local, id_src, id_dst);"
|
|
Packit |
1c1d7e |
},
|
|
Packit |
1c1d7e |
{ "innerclass",
|
|
Packit |
1c1d7e |
"CREATE TABLE IF NOT EXISTS innerclass (\n"
|
|
Packit |
1c1d7e |
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\trefid INTEGER NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tprot INTEGER NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tname TEXT NOT NULL\n"
|
|
Packit |
1c1d7e |
");"
|
|
Packit |
1c1d7e |
},
|
|
Packit |
1c1d7e |
{ "files",
|
|
Packit |
1c1d7e |
"CREATE TABLE IF NOT EXISTS files (\n"
|
|
Packit |
1c1d7e |
"\t-- Names of source files and includes.\n"
|
|
Packit |
1c1d7e |
"\tname TEXT PRIMARY KEY NOT NULL\n"
|
|
Packit |
1c1d7e |
");"
|
|
Packit |
1c1d7e |
},
|
|
Packit |
1c1d7e |
{ "refids",
|
|
Packit |
1c1d7e |
"CREATE TABLE IF NOT EXISTS refids (\n"
|
|
Packit |
1c1d7e |
"\trefid TEXT PRIMARY KEY NOT NULL\n"
|
|
Packit |
1c1d7e |
");"
|
|
Packit |
1c1d7e |
},
|
|
Packit |
1c1d7e |
{ "xrefs",
|
|
Packit |
1c1d7e |
"CREATE TABLE IF NOT EXISTS xrefs (\n"
|
|
Packit |
1c1d7e |
"\t-- Cross reference relation.\n"
|
|
Packit |
1c1d7e |
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\trefid_src INTEGER NOT NULL, -- referrer id.\n"
|
|
Packit |
1c1d7e |
"\trefid_dst INTEGER NOT NULL, -- referee id.\n"
|
|
Packit |
1c1d7e |
"\tid_file INTEGER NOT NULL, -- file where the reference is happening.\n"
|
|
Packit |
1c1d7e |
"\tline INTEGER NOT NULL, -- line where the reference is happening.\n"
|
|
Packit |
1c1d7e |
"\tcolumn INTEGER NOT NULL -- column where the reference is happening.\n"
|
|
Packit |
1c1d7e |
");\n"
|
|
Packit |
1c1d7e |
"CREATE UNIQUE INDEX idx_xrefs ON xrefs\n"
|
|
Packit |
1c1d7e |
"\t(refid_src, refid_dst, id_file, line, column);"
|
|
Packit |
1c1d7e |
},
|
|
Packit |
1c1d7e |
{ "memberdef",
|
|
Packit |
1c1d7e |
"CREATE TABLE IF NOT EXISTS memberdef (\n"
|
|
Packit |
1c1d7e |
"\t-- All processed identifiers.\n"
|
|
Packit |
1c1d7e |
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\trefid INTEGER NOT NULL, -- see the refids table\n"
|
|
Packit |
1c1d7e |
"\tname TEXT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tdefinition TEXT,\n"
|
|
Packit |
1c1d7e |
"\ttype TEXT,\n"
|
|
Packit |
1c1d7e |
"\targsstring TEXT,\n"
|
|
Packit |
1c1d7e |
"\tscope TEXT,\n"
|
|
Packit |
1c1d7e |
"\tinitializer TEXT,\n"
|
|
Packit |
1c1d7e |
"\tbitfield TEXT,\n"
|
|
Packit |
1c1d7e |
"\tread TEXT,\n"
|
|
Packit |
1c1d7e |
"\twrite TEXT,\n"
|
|
Packit |
1c1d7e |
"\tprot INTEGER DEFAULT 0, -- 0:public 1:protected 2:private 3:package\n"
|
|
Packit |
1c1d7e |
"\tstatic INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tconst INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\texplicit INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tinline INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tfinal INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tsealed INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tnew INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\toptional INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\trequired INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tvolatile INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tvirt INTEGER DEFAULT 0, -- 0:no 1:virtual 2:pure-virtual\n"
|
|
Packit |
1c1d7e |
"\tmutable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tinitonly INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tattribute INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tproperty INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\treadonly INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tbound INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tconstrained INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\ttransient INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tmaybevoid INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tmaybedefault INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tmaybeambiguous INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\treadable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\twritable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tgettable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tprivategettable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tprotectedgettable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tsettable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tprivatesettable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tprotectedsettable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\taccessor INTEGER DEFAULT 0, -- 0:no 1:assign 2:copy 3:retain 4:string 5:weak\n"
|
|
Packit |
1c1d7e |
"\taddable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\tremovable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
"\traisable INTEGER DEFAULT 0, -- 0:no 1:yes\n"
|
|
Packit |
1c1d7e |
/// @todo make a `kind' table
|
|
Packit |
1c1d7e |
"\tkind INTEGER DEFAULT 0, -- 0:define 1:function 2:variable 3:typedef 4:enum 5:enumvalue 6:signal 7:slot 8:friend 9:DCOP 10:property 11:event\n"
|
|
Packit |
1c1d7e |
"\tbodystart INTEGER DEFAULT 0, -- starting line of definition\n"
|
|
Packit |
1c1d7e |
"\tbodyend INTEGER DEFAULT 0, -- ending line of definition\n"
|
|
Packit |
1c1d7e |
"\tid_bodyfile INTEGER DEFAULT 0, -- file of definition\n"
|
|
Packit |
1c1d7e |
"\tid_file INTEGER NOT NULL, -- file where this identifier is located\n"
|
|
Packit |
1c1d7e |
"\tline INTEGER NOT NULL, -- line where this identifier is located\n"
|
|
Packit |
1c1d7e |
"\tcolumn INTEGER NOT NULL, -- column where this identifier is located\n"
|
|
Packit |
1c1d7e |
/// @todo make a `detaileddescription' table
|
|
Packit |
1c1d7e |
"\tdetaileddescription TEXT,\n"
|
|
Packit |
1c1d7e |
"\tbriefdescription TEXT,\n"
|
|
Packit |
1c1d7e |
"\tinbodydescription TEXT\n"
|
|
Packit |
1c1d7e |
");"
|
|
Packit |
1c1d7e |
},
|
|
Packit |
1c1d7e |
{ "compounddef",
|
|
Packit |
1c1d7e |
"CREATE TABLE IF NOT EXISTS compounddef (\n"
|
|
Packit |
1c1d7e |
"\t-- class/struct definitions.\n"
|
|
Packit |
1c1d7e |
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tname TEXT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tkind TEXT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\trefid INTEGER NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tprot INTEGER NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tid_file INTEGER NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tline INTEGER NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tcolumn INTEGER NOT NULL\n"
|
|
Packit |
1c1d7e |
");"
|
|
Packit |
1c1d7e |
},
|
|
Packit |
1c1d7e |
{ "basecompoundref",
|
|
Packit |
1c1d7e |
"CREATE TABLE IF NOT EXISTS basecompoundref (\n"
|
|
Packit |
1c1d7e |
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tbase TEXT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tderived TEXT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\trefid INTEGER NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tprot INTEGER NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tvirt INTEGER NOT NULL\n"
|
|
Packit |
1c1d7e |
");"
|
|
Packit |
1c1d7e |
},
|
|
Packit |
1c1d7e |
{ "derivedcompoundref",
|
|
Packit |
1c1d7e |
"CREATE TABLE IF NOT EXISTS derivedcompoundref (\n"
|
|
Packit |
1c1d7e |
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tbase TEXT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tderived TEXT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\trefid INTEGER NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tprot INTEGER NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tvirt INTEGER NOT NULL\n"
|
|
Packit |
1c1d7e |
");"
|
|
Packit |
1c1d7e |
},
|
|
Packit |
1c1d7e |
{ "params",
|
|
Packit |
1c1d7e |
"CREATE TABLE IF NOT EXISTS params (\n"
|
|
Packit |
1c1d7e |
"\t-- All processed parameters.\n"
|
|
Packit |
1c1d7e |
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tattributes TEXT,\n"
|
|
Packit |
1c1d7e |
"\ttype TEXT,\n"
|
|
Packit |
1c1d7e |
"\tdeclname TEXT,\n"
|
|
Packit |
1c1d7e |
"\tdefname TEXT,\n"
|
|
Packit |
1c1d7e |
"\tarray TEXT,\n"
|
|
Packit |
1c1d7e |
"\tdefval TEXT,\n"
|
|
Packit |
1c1d7e |
"\tbriefdescription TEXT\n"
|
|
Packit |
1c1d7e |
");"
|
|
Packit |
1c1d7e |
"CREATE UNIQUE INDEX idx_params ON params\n"
|
|
Packit |
1c1d7e |
"\t(type, defname);"
|
|
Packit |
1c1d7e |
},
|
|
Packit |
1c1d7e |
{ "memberdef_params",
|
|
Packit |
1c1d7e |
"CREATE TABLE IF NOT EXISTS memberdef_params (\n"
|
|
Packit |
1c1d7e |
"\t-- Junction table for memberdef parameters.\n"
|
|
Packit |
1c1d7e |
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tid_memberdef INTEGER NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tid_param INTEGER NOT NULL\n"
|
|
Packit |
1c1d7e |
");"
|
|
Packit |
1c1d7e |
},
|
|
Packit |
1c1d7e |
{ "innernamespaces",
|
|
Packit |
1c1d7e |
"CREATE TABLE IF NOT EXISTS innernamespaces (\n"
|
|
Packit |
1c1d7e |
"\trowid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\trefid INTEGER NOT NULL,\n"
|
|
Packit |
1c1d7e |
"\tname TEXT NOT NULL\n"
|
|
Packit |
1c1d7e |
");"
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
struct SqlStmt {
|
|
Packit |
1c1d7e |
const char *query;
|
|
Packit |
1c1d7e |
sqlite3_stmt *stmt;
|
|
Packit |
1c1d7e |
sqlite3 *db;
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
SqlStmt incl_insert = { "INSERT INTO includes "
|
|
Packit |
1c1d7e |
"( local, id_src, id_dst ) "
|
|
Packit |
1c1d7e |
"VALUES "
|
|
Packit |
1c1d7e |
"(:local,:id_src,:id_dst )"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
SqlStmt incl_select = { "SELECT COUNT(*) FROM includes WHERE "
|
|
Packit |
1c1d7e |
"local=:local AND id_src=:id_src AND id_dst=:id_dst"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
SqlStmt innerclass_insert={"INSERT INTO innerclass "
|
|
Packit |
1c1d7e |
"( refid, prot, name )"
|
|
Packit |
1c1d7e |
"VALUES "
|
|
Packit |
1c1d7e |
"(:refid,:prot,:name )"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
SqlStmt files_select = {"SELECT rowid FROM files WHERE name=:name"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
SqlStmt files_insert = {"INSERT INTO files "
|
|
Packit |
1c1d7e |
"( name )"
|
|
Packit |
1c1d7e |
"VALUES "
|
|
Packit |
1c1d7e |
"(:name )"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
SqlStmt refids_select = {"SELECT rowid FROM refids WHERE "
|
|
Packit |
1c1d7e |
"refid=:refid"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
SqlStmt refids_insert = {"INSERT INTO refids "
|
|
Packit |
1c1d7e |
"( refid )"
|
|
Packit |
1c1d7e |
"VALUES "
|
|
Packit |
1c1d7e |
"(:refid )"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
SqlStmt xrefs_insert= {"INSERT INTO xrefs "
|
|
Packit |
1c1d7e |
"( refid_src, refid_dst, id_file, line, column )"
|
|
Packit |
1c1d7e |
"VALUES "
|
|
Packit |
1c1d7e |
"(:refid_src,:refid_dst,:id_file,:line,:column )"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
SqlStmt memberdef_insert={"INSERT INTO memberdef "
|
|
Packit |
1c1d7e |
"("
|
|
Packit |
1c1d7e |
"refid,"
|
|
Packit |
1c1d7e |
"name,"
|
|
Packit |
1c1d7e |
"definition,"
|
|
Packit |
1c1d7e |
"type,"
|
|
Packit |
1c1d7e |
"argsstring,"
|
|
Packit |
1c1d7e |
"scope,"
|
|
Packit |
1c1d7e |
"initializer,"
|
|
Packit |
1c1d7e |
"bitfield,"
|
|
Packit |
1c1d7e |
"read,"
|
|
Packit |
1c1d7e |
"write,"
|
|
Packit |
1c1d7e |
"prot,"
|
|
Packit |
1c1d7e |
"static,"
|
|
Packit |
1c1d7e |
"const,"
|
|
Packit |
1c1d7e |
"explicit,"
|
|
Packit |
1c1d7e |
"inline,"
|
|
Packit |
1c1d7e |
"final,"
|
|
Packit |
1c1d7e |
"sealed,"
|
|
Packit |
1c1d7e |
"new,"
|
|
Packit |
1c1d7e |
"optional,"
|
|
Packit |
1c1d7e |
"required,"
|
|
Packit |
1c1d7e |
"volatile,"
|
|
Packit |
1c1d7e |
"virt,"
|
|
Packit |
1c1d7e |
"mutable,"
|
|
Packit |
1c1d7e |
"initonly,"
|
|
Packit |
1c1d7e |
"attribute,"
|
|
Packit |
1c1d7e |
"property,"
|
|
Packit |
1c1d7e |
"readonly,"
|
|
Packit |
1c1d7e |
"bound,"
|
|
Packit |
1c1d7e |
"constrained,"
|
|
Packit |
1c1d7e |
"transient,"
|
|
Packit |
1c1d7e |
"maybevoid,"
|
|
Packit |
1c1d7e |
"maybedefault,"
|
|
Packit |
1c1d7e |
"maybeambiguous,"
|
|
Packit |
1c1d7e |
"readable,"
|
|
Packit |
1c1d7e |
"writable,"
|
|
Packit |
1c1d7e |
"gettable,"
|
|
Packit |
1c1d7e |
"protectedsettable,"
|
|
Packit |
1c1d7e |
"protectedgettable,"
|
|
Packit |
1c1d7e |
"settable,"
|
|
Packit |
1c1d7e |
"privatesettable,"
|
|
Packit |
1c1d7e |
"privategettable,"
|
|
Packit |
1c1d7e |
"accessor,"
|
|
Packit |
1c1d7e |
"addable,"
|
|
Packit |
1c1d7e |
"removable,"
|
|
Packit |
1c1d7e |
"raisable,"
|
|
Packit |
1c1d7e |
"kind,"
|
|
Packit |
1c1d7e |
"bodystart,"
|
|
Packit |
1c1d7e |
"bodyend,"
|
|
Packit |
1c1d7e |
"id_bodyfile,"
|
|
Packit |
1c1d7e |
"id_file,"
|
|
Packit |
1c1d7e |
"line,"
|
|
Packit |
1c1d7e |
"column,"
|
|
Packit |
1c1d7e |
"detaileddescription,"
|
|
Packit |
1c1d7e |
"briefdescription,"
|
|
Packit |
1c1d7e |
"inbodydescription"
|
|
Packit |
1c1d7e |
")"
|
|
Packit |
1c1d7e |
"VALUES "
|
|
Packit |
1c1d7e |
"("
|
|
Packit |
1c1d7e |
":refid,"
|
|
Packit |
1c1d7e |
":name,"
|
|
Packit |
1c1d7e |
":definition,"
|
|
Packit |
1c1d7e |
":type,"
|
|
Packit |
1c1d7e |
":argsstring,"
|
|
Packit |
1c1d7e |
":scope,"
|
|
Packit |
1c1d7e |
":initializer,"
|
|
Packit |
1c1d7e |
":bitfield,"
|
|
Packit |
1c1d7e |
":read,"
|
|
Packit |
1c1d7e |
":write,"
|
|
Packit |
1c1d7e |
":prot,"
|
|
Packit |
1c1d7e |
":static,"
|
|
Packit |
1c1d7e |
":const,"
|
|
Packit |
1c1d7e |
":explicit,"
|
|
Packit |
1c1d7e |
":inline,"
|
|
Packit |
1c1d7e |
":final,"
|
|
Packit |
1c1d7e |
":sealed,"
|
|
Packit |
1c1d7e |
":new,"
|
|
Packit |
1c1d7e |
":optional,"
|
|
Packit |
1c1d7e |
":required,"
|
|
Packit |
1c1d7e |
":volatile,"
|
|
Packit |
1c1d7e |
":virt,"
|
|
Packit |
1c1d7e |
":mutable,"
|
|
Packit |
1c1d7e |
":initonly,"
|
|
Packit |
1c1d7e |
":attribute,"
|
|
Packit |
1c1d7e |
":property,"
|
|
Packit |
1c1d7e |
":readonly,"
|
|
Packit |
1c1d7e |
":bound,"
|
|
Packit |
1c1d7e |
":constrained,"
|
|
Packit |
1c1d7e |
":transient,"
|
|
Packit |
1c1d7e |
":maybevoid,"
|
|
Packit |
1c1d7e |
":maybedefault,"
|
|
Packit |
1c1d7e |
":maybeambiguous,"
|
|
Packit |
1c1d7e |
":readable,"
|
|
Packit |
1c1d7e |
":writable,"
|
|
Packit |
1c1d7e |
":gettable,"
|
|
Packit |
1c1d7e |
":protectedsettable,"
|
|
Packit |
1c1d7e |
":protectedgettable,"
|
|
Packit |
1c1d7e |
":settable,"
|
|
Packit |
1c1d7e |
":privatesettable,"
|
|
Packit |
1c1d7e |
":privategettable,"
|
|
Packit |
1c1d7e |
":accessor,"
|
|
Packit |
1c1d7e |
":addable,"
|
|
Packit |
1c1d7e |
":removable,"
|
|
Packit |
1c1d7e |
":raisable,"
|
|
Packit |
1c1d7e |
":kind,"
|
|
Packit |
1c1d7e |
":bodystart,"
|
|
Packit |
1c1d7e |
":bodyend,"
|
|
Packit |
1c1d7e |
":id_bodyfile,"
|
|
Packit |
1c1d7e |
":id_file,"
|
|
Packit |
1c1d7e |
":line,"
|
|
Packit |
1c1d7e |
":column,"
|
|
Packit |
1c1d7e |
":detaileddescription,"
|
|
Packit |
1c1d7e |
":briefdescription,"
|
|
Packit |
1c1d7e |
":inbodydescription"
|
|
Packit |
1c1d7e |
")"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
SqlStmt compounddef_insert={"INSERT INTO compounddef "
|
|
Packit |
1c1d7e |
"( name, kind, prot, refid, id_file, line, column ) "
|
|
Packit |
1c1d7e |
"VALUES "
|
|
Packit |
1c1d7e |
"(:name,:kind,:prot,:refid,:id_file,:line,:column )"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
SqlStmt basecompoundref_insert={"INSERT INTO basecompoundref "
|
|
Packit |
1c1d7e |
"( base, derived, refid, prot, virt ) "
|
|
Packit |
1c1d7e |
"VALUES "
|
|
Packit |
1c1d7e |
"(:base,:derived,:refid,:prot,:virt )"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
SqlStmt derivedcompoundref_insert={"INSERT INTO derivedcompoundref "
|
|
Packit |
1c1d7e |
"( refid, prot, virt, base, derived ) "
|
|
Packit |
1c1d7e |
"VALUES "
|
|
Packit |
1c1d7e |
"(:refid,:prot,:virt,:base,:derived )"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
SqlStmt params_select = { "SELECT rowid FROM params WHERE "
|
|
Packit |
1c1d7e |
"(attributes IS NULL OR attributes=:attributes) AND "
|
|
Packit |
1c1d7e |
"(type IS NULL OR type=:type) AND "
|
|
Packit |
1c1d7e |
"(declname IS NULL OR declname=:declname) AND "
|
|
Packit |
1c1d7e |
"(defname IS NULL OR defname=:defname) AND "
|
|
Packit |
1c1d7e |
"(array IS NULL OR array=:array) AND "
|
|
Packit |
1c1d7e |
"(defval IS NULL OR defval=:defval) AND "
|
|
Packit |
1c1d7e |
"(briefdescription IS NULL OR briefdescription=:briefdescription)"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
SqlStmt params_insert = { "INSERT INTO params "
|
|
Packit |
1c1d7e |
"( attributes, type, declname, defname, array, defval, briefdescription ) "
|
|
Packit |
1c1d7e |
"VALUES "
|
|
Packit |
1c1d7e |
"(:attributes,:type,:declname,:defname,:array,:defval,:briefdescription)"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
SqlStmt memberdef_params_insert={ "INSERT INTO memberdef_params "
|
|
Packit |
1c1d7e |
"( id_memberdef, id_param)"
|
|
Packit |
1c1d7e |
"VALUES "
|
|
Packit |
1c1d7e |
"(:id_memberdef,:id_param)"
|
|
Packit |
1c1d7e |
,NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
SqlStmt innernamespace_insert={"INSERT INTO innernamespaces "
|
|
Packit |
1c1d7e |
"( refid, name)"
|
|
Packit |
1c1d7e |
"VALUES "
|
|
Packit |
1c1d7e |
"(:refid,:name)",
|
|
Packit |
1c1d7e |
NULL
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
class TextGeneratorSqlite3Impl : public TextGeneratorIntf
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
public:
|
|
Packit |
1c1d7e |
TextGeneratorSqlite3Impl(StringList &l) : l(l) {
|
|
Packit |
1c1d7e |
l.setAutoDelete(TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void writeString(const char * /*s*/,bool /*keepSpaces*/) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void writeBreak(int) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX(("writeBreak\n"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
void writeLink(const char * /*extRef*/,const char *file,
|
|
Packit |
1c1d7e |
const char *anchor,const char * /*text*/
|
|
Packit |
1c1d7e |
) const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString *rs=new QCString(file);
|
|
Packit |
1c1d7e |
if (anchor)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
rs->append("_1").append(anchor);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
l.append(rs);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
private:
|
|
Packit |
1c1d7e |
StringList &l;
|
|
Packit |
1c1d7e |
// the list is filled by linkifyText and consumed by the caller
|
|
Packit |
1c1d7e |
};
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool bindTextParameter(SqlStmt &s,const char *name,const char *value, bool _static=TRUE)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int idx = sqlite3_bind_parameter_index(s.stmt, name);
|
|
Packit |
1c1d7e |
if (idx==0) {
|
|
Packit |
1c1d7e |
msg("sqlite3_bind_parameter_index(%s)[%s] failed: %s\n", name, s.query, sqlite3_errmsg(s.db));
|
|
Packit |
1c1d7e |
return false;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
int rv = sqlite3_bind_text(s.stmt, idx, value, -1, _static==TRUE?SQLITE_STATIC:SQLITE_TRANSIENT);
|
|
Packit |
1c1d7e |
if (rv!=SQLITE_OK) {
|
|
Packit |
1c1d7e |
msg("sqlite3_bind_text(%s)[%s] failed: %s\n", name, s.query, sqlite3_errmsg(s.db));
|
|
Packit |
1c1d7e |
return false;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return true;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool bindIntParameter(SqlStmt &s,const char *name,int value)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int idx = sqlite3_bind_parameter_index(s.stmt, name);
|
|
Packit |
1c1d7e |
if (idx==0) {
|
|
Packit |
1c1d7e |
msg("sqlite3_bind_parameter_index(%s)[%s] failed: %s\n", name, s.query, sqlite3_errmsg(s.db));
|
|
Packit |
1c1d7e |
return false;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
int rv = sqlite3_bind_int(s.stmt, idx, value);
|
|
Packit |
1c1d7e |
if (rv!=SQLITE_OK) {
|
|
Packit |
1c1d7e |
msg("sqlite3_bind_int(%s)[%s] failed: %s\n", name, s.query, sqlite3_errmsg(s.db));
|
|
Packit |
1c1d7e |
return false;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return true;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int step(SqlStmt &s,bool getRowId=FALSE, bool select=FALSE)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int rowid=-1;
|
|
Packit |
1c1d7e |
int rc = sqlite3_step(s.stmt);
|
|
Packit |
1c1d7e |
if (rc!=SQLITE_DONE && rc!=SQLITE_ROW)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("sqlite3_step: %s\n", sqlite3_errmsg(s.db));
|
|
Packit |
1c1d7e |
sqlite3_reset(s.stmt);
|
|
Packit |
1c1d7e |
sqlite3_clear_bindings(s.stmt);
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (getRowId && select) rowid = sqlite3_column_int(s.stmt, 0); // works on selects, doesn't on inserts
|
|
Packit |
1c1d7e |
if (getRowId && !select) rowid = sqlite3_last_insert_rowid(s.db); //works on inserts, doesn't on selects
|
|
Packit |
1c1d7e |
sqlite3_reset(s.stmt);
|
|
Packit |
1c1d7e |
sqlite3_clear_bindings(s.stmt); // XXX When should this really be called
|
|
Packit |
1c1d7e |
return rowid;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int insertFile(const char* name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int rowid=-1;
|
|
Packit |
1c1d7e |
if (name==0) return rowid;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bindTextParameter(files_select,":name",name);
|
|
Packit |
1c1d7e |
rowid=step(files_select,TRUE,TRUE);
|
|
Packit |
1c1d7e |
if (rowid==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(files_insert,":name",name);
|
|
Packit |
1c1d7e |
rowid=step(files_insert,TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return rowid;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int insertRefid(const char *refid)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int rowid=-1;
|
|
Packit |
1c1d7e |
if (refid==0) return rowid;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bindTextParameter(refids_select,":refid",refid);
|
|
Packit |
1c1d7e |
rowid=step(refids_select,TRUE,TRUE);
|
|
Packit |
1c1d7e |
if (rowid==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(refids_insert,":refid",refid);
|
|
Packit |
1c1d7e |
rowid=step(refids_insert,TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return rowid;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static bool insertMemberReference(int refid_src, int refid_dst,
|
|
Packit |
1c1d7e |
int id_file, int line, int column)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (id_file==-1||refid_src==-1||refid_dst==-1)
|
|
Packit |
1c1d7e |
return false;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (
|
|
Packit |
1c1d7e |
!bindIntParameter(xrefs_insert,":refid_src",refid_src) ||
|
|
Packit |
1c1d7e |
!bindIntParameter(xrefs_insert,":refid_dst",refid_dst) ||
|
|
Packit |
1c1d7e |
!bindIntParameter(xrefs_insert,":id_file",id_file) ||
|
|
Packit |
1c1d7e |
!bindIntParameter(xrefs_insert,":line",line) ||
|
|
Packit |
1c1d7e |
!bindIntParameter(xrefs_insert,":column",column)
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return false;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
step(xrefs_insert);
|
|
Packit |
1c1d7e |
return true;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void insertMemberReference(const MemberDef *src, const MemberDef *dst)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString qrefid_dst = dst->getOutputFileBase() + "_1" + dst->anchor();
|
|
Packit |
1c1d7e |
QCString qrefid_src = src->getOutputFileBase() + "_1" + src->anchor();
|
|
Packit |
1c1d7e |
if (dst->getStartBodyLine()!=-1 && dst->getBodyDef())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int refid_src = insertRefid(qrefid_src.data());
|
|
Packit |
1c1d7e |
int refid_dst = insertRefid(qrefid_dst.data());
|
|
Packit |
1c1d7e |
int id_file = insertFile("no-file"); // TODO: replace no-file with proper file
|
|
Packit |
1c1d7e |
insertMemberReference(refid_src,refid_dst,id_file,dst->getStartBodyLine(),-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void insertMemberFunctionParams(int id_memberdef, const MemberDef *md, const Definition *def)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ArgumentList *declAl = md->declArgumentList();
|
|
Packit |
1c1d7e |
ArgumentList *defAl = md->argumentList();
|
|
Packit |
1c1d7e |
if (declAl!=0 && declAl->count()>0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ArgumentListIterator declAli(*declAl);
|
|
Packit |
1c1d7e |
ArgumentListIterator defAli(*defAl);
|
|
Packit |
1c1d7e |
Argument *a;
|
|
Packit |
1c1d7e |
for (declAli.toFirst();(a=declAli.current());++declAli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
Argument *defArg = defAli.current();
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (!a->attrib.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(params_select,":attributes",a->attrib.data());
|
|
Packit |
1c1d7e |
bindTextParameter(params_insert,":attributes",a->attrib.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!a->type.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
StringList l;
|
|
Packit |
1c1d7e |
linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->type);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
StringListIterator li(l);
|
|
Packit |
1c1d7e |
QCString *s;
|
|
Packit |
1c1d7e |
while ((s=li.current()))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString qrefid_src = md->getOutputFileBase() + "_1" + md->anchor();
|
|
Packit |
1c1d7e |
int refid_src = insertRefid(qrefid_src.data());
|
|
Packit |
1c1d7e |
int refid_dst = insertRefid(s->data());
|
|
Packit |
1c1d7e |
int id_file = insertFile(stripFromPath(def->getDefFileName()));
|
|
Packit |
1c1d7e |
insertMemberReference(refid_src,refid_dst,id_file,md->getDefLine(),-1);
|
|
Packit |
1c1d7e |
++li;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
bindTextParameter(params_select,":type",a->type.data());
|
|
Packit |
1c1d7e |
bindTextParameter(params_insert,":type",a->type.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!a->name.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(params_select,":declname",a->name.data());
|
|
Packit |
1c1d7e |
bindTextParameter(params_insert,":declname",a->name.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(params_select,":defname",defArg->name.data());
|
|
Packit |
1c1d7e |
bindTextParameter(params_insert,":defname",defArg->name.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!a->array.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(params_select,":array",a->array.data());
|
|
Packit |
1c1d7e |
bindTextParameter(params_insert,":array",a->array.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!a->defval.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
StringList l;
|
|
Packit |
1c1d7e |
linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,a->defval);
|
|
Packit |
1c1d7e |
bindTextParameter(params_select,":defval",a->defval.data());
|
|
Packit |
1c1d7e |
bindTextParameter(params_insert,":defval",a->defval.data());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (defArg) ++defAli;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int id_param=step(params_select,TRUE,TRUE);
|
|
Packit |
1c1d7e |
if (id_param==0) {
|
|
Packit |
1c1d7e |
id_param=step(params_insert,TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (id_param==-1) {
|
|
Packit |
1c1d7e |
msg("error INSERT params failed\n");
|
|
Packit |
1c1d7e |
continue;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_params_insert,":id_memberdef",id_memberdef);
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_params_insert,":id_param",id_param);
|
|
Packit |
1c1d7e |
step(memberdef_params_insert);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void insertMemberDefineParams(int id_memberdef,const MemberDef *md, const Definition *def)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (md->argumentList()->count()==0) // special case for "foo()" to
|
|
Packit |
1c1d7e |
// disguish it from "foo".
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX(("no params\n"));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ArgumentListIterator ali(*md->argumentList());
|
|
Packit |
1c1d7e |
Argument *a;
|
|
Packit |
1c1d7e |
for (ali.toFirst();(a=ali.current());++ali)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(params_insert,":defname",a->type.data());
|
|
Packit |
1c1d7e |
int id_param=step(params_insert,TRUE);
|
|
Packit |
1c1d7e |
if (id_param==-1) {
|
|
Packit |
1c1d7e |
msg("error INSERT param(%s) failed\n", a->type.data());
|
|
Packit |
1c1d7e |
continue;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_params_insert,":id_memberdef",id_memberdef);
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_params_insert,":id_param",id_param);
|
|
Packit |
1c1d7e |
step(memberdef_params_insert);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void stripQualifiers(QCString &typeStr)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bool done=FALSE;
|
|
Packit |
1c1d7e |
while (!done)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (typeStr.stripPrefix("static "));
|
|
Packit |
1c1d7e |
else if (typeStr.stripPrefix("virtual "));
|
|
Packit |
1c1d7e |
else if (typeStr.stripPrefix("volatile "));
|
|
Packit |
1c1d7e |
else if (typeStr=="virtual") typeStr="";
|
|
Packit |
1c1d7e |
else done=TRUE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int prepareStatement(sqlite3 *db, SqlStmt &s)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int rc;
|
|
Packit |
1c1d7e |
rc = sqlite3_prepare_v2(db,s.query,-1,&s.stmt,0);
|
|
Packit |
1c1d7e |
if (rc!=SQLITE_OK)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("prepare failed for %s\n%s\n", s.query, sqlite3_errmsg(db));
|
|
Packit |
1c1d7e |
s.db = NULL;
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
s.db = db;
|
|
Packit |
1c1d7e |
return rc;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int prepareStatements(sqlite3 *db)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, memberdef_insert) ||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, files_insert) ||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, files_select) ||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, refids_insert) ||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, refids_select) ||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, incl_insert)||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, incl_select)||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, params_insert) ||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, params_select) ||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, xrefs_insert) ||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, innerclass_insert) ||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, compounddef_insert) ||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, basecompoundref_insert) ||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, derivedcompoundref_insert) ||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, memberdef_params_insert)||
|
|
Packit |
1c1d7e |
-1==prepareStatement(db, innernamespace_insert)
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void beginTransaction(sqlite3 *db)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char * sErrMsg = 0;
|
|
Packit |
1c1d7e |
sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &sErrMsg);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void endTransaction(sqlite3 *db)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char * sErrMsg = 0;
|
|
Packit |
1c1d7e |
sqlite3_exec(db, "END TRANSACTION", NULL, NULL, &sErrMsg);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void pragmaTuning(sqlite3 *db)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
char * sErrMsg = 0;
|
|
Packit |
1c1d7e |
sqlite3_exec(db, "PRAGMA synchronous = OFF", NULL, NULL, &sErrMsg);
|
|
Packit |
1c1d7e |
sqlite3_exec(db, "PRAGMA journal_mode = MEMORY", NULL, NULL, &sErrMsg);
|
|
Packit |
1c1d7e |
sqlite3_exec(db, "PRAGMA temp_store = MEMORY;", NULL, NULL, &sErrMsg);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static int initializeSchema(sqlite3* db)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int rc;
|
|
Packit |
1c1d7e |
sqlite3_stmt *stmt = 0;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
msg("Initializing DB schema...\n");
|
|
Packit |
1c1d7e |
for (unsigned int k = 0; k < sizeof(schema_queries) / sizeof(schema_queries[0]); k++)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
const char *q = schema_queries[k][1];
|
|
Packit |
1c1d7e |
char *errmsg;
|
|
Packit |
1c1d7e |
rc = sqlite3_exec(db, q, NULL, NULL, &errmsg);
|
|
Packit |
1c1d7e |
if (rc != SQLITE_OK)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("failed to execute query: %s\n\t%s\n", q, errmsg);
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
////////////////////////////////////////////
|
|
Packit |
1c1d7e |
static void writeInnerClasses(const ClassSDict *cl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!cl) return;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
ClassSDict::Iterator cli(*cl);
|
|
Packit |
1c1d7e |
ClassDef *cd;
|
|
Packit |
1c1d7e |
for (cli.toFirst();(cd=cli.current());++cli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!cd->isHidden() && cd->name().find('@')==-1) // skip anonymous scopes
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int refid = insertRefid(cd->getOutputFileBase());
|
|
Packit |
1c1d7e |
bindIntParameter(innerclass_insert,":refid", refid);
|
|
Packit |
1c1d7e |
bindIntParameter(innerclass_insert,":prot",cd->protection());
|
|
Packit |
1c1d7e |
bindTextParameter(innerclass_insert,":name",cd->name());
|
|
Packit |
1c1d7e |
step(innerclass_insert);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeInnerNamespaces(const NamespaceSDict *nl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (nl)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
NamespaceSDict::Iterator nli(*nl);
|
|
Packit |
1c1d7e |
NamespaceDef *nd;
|
|
Packit |
1c1d7e |
for (nli.toFirst();(nd=nli.current());++nli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int refid = insertRefid(nd->getOutputFileBase());
|
|
Packit |
1c1d7e |
bindIntParameter(innernamespace_insert,":refid",refid);
|
|
Packit |
1c1d7e |
bindTextParameter(innernamespace_insert,":name",nd->name(),FALSE);
|
|
Packit |
1c1d7e |
step(innernamespace_insert);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeTemplateArgumentList(const ArgumentList * al,
|
|
Packit |
1c1d7e |
const Definition * scope,
|
|
Packit |
1c1d7e |
const FileDef * fileScope)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (al)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ArgumentListIterator ali(*al);
|
|
Packit |
1c1d7e |
Argument *a;
|
|
Packit |
1c1d7e |
for (ali.toFirst();(a=ali.current());++ali)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (!a->type.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#warning linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->type);
|
|
Packit |
1c1d7e |
bindTextParameter(params_select,":type",a->type);
|
|
Packit |
1c1d7e |
bindTextParameter(params_insert,":type",a->type);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!a->name.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(params_select,":declname",a->name);
|
|
Packit |
1c1d7e |
bindTextParameter(params_insert,":declname",a->name);
|
|
Packit |
1c1d7e |
bindTextParameter(params_select,":defname",a->name);
|
|
Packit |
1c1d7e |
bindTextParameter(params_insert,":defname",a->name);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!a->defval.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#warning linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->defval);
|
|
Packit |
1c1d7e |
bindTextParameter(params_select,":defval",a->defval);
|
|
Packit |
1c1d7e |
bindTextParameter(params_insert,":defval",a->defval);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (!step(params_select,TRUE,TRUE))
|
|
Packit |
1c1d7e |
step(params_insert);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void writeMemberTemplateLists(const MemberDef *md)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ArgumentList *templMd = md->templateArguments();
|
|
Packit |
1c1d7e |
if (templMd) // function template prefix
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeTemplateArgumentList(templMd,md->getClassDef(),md->getFileDef());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
static void writeTemplateList(const ClassDef *cd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeTemplateArgumentList(cd->templateArguments(),cd,0);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
////////////////////////////////////////////
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
static void generateSqlite3ForMember(const MemberDef *md, const Definition *def)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// + declaration/definition arg lists
|
|
Packit |
1c1d7e |
// + reimplements
|
|
Packit |
1c1d7e |
// + reimplementedBy
|
|
Packit |
1c1d7e |
// + exceptions
|
|
Packit |
1c1d7e |
// + const/volatile specifiers
|
|
Packit |
1c1d7e |
// - examples
|
|
Packit |
1c1d7e |
// + source definition
|
|
Packit |
1c1d7e |
// + source references
|
|
Packit |
1c1d7e |
// + source referenced by
|
|
Packit |
1c1d7e |
// - body code
|
|
Packit |
1c1d7e |
// + template arguments
|
|
Packit |
1c1d7e |
// (templateArguments(), definitionTemplateParameterLists())
|
|
Packit |
1c1d7e |
// - call graph
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// enum values are written as part of the enum
|
|
Packit |
1c1d7e |
if (md->memberType()==MemberType_EnumValue) return;
|
|
Packit |
1c1d7e |
if (md->isHidden()) return;
|
|
Packit |
1c1d7e |
//if (md->name().at(0)=='@') return; // anonymous member
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// group members are only visible in their group
|
|
Packit |
1c1d7e |
//if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
|
|
Packit |
1c1d7e |
QCString memType;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// memberdef
|
|
Packit |
1c1d7e |
QCString qrefid = md->getOutputFileBase() + "_1" + md->anchor();
|
|
Packit |
1c1d7e |
int refid = insertRefid(qrefid.data());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":refid", refid);
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":kind",md->memberType());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":prot",md->protection());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":static",md->isStatic());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool isFunc=FALSE;
|
|
Packit |
1c1d7e |
switch (md->memberType())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
case MemberType_Function: // fall through
|
|
Packit |
1c1d7e |
case MemberType_Signal: // fall through
|
|
Packit |
1c1d7e |
case MemberType_Friend: // fall through
|
|
Packit |
1c1d7e |
case MemberType_DCOP: // fall through
|
|
Packit |
1c1d7e |
case MemberType_Slot:
|
|
Packit |
1c1d7e |
isFunc=TRUE;
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
default:
|
|
Packit |
1c1d7e |
break;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (isFunc)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
ArgumentList *al = md->argumentList();
|
|
Packit |
1c1d7e |
if (al!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":const",al->constSpecifier);
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":volatile",al->volatileSpecifier);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":explicit",md->isExplicit());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":inline",md->isInline());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":final",md->isFinal());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":sealed",md->isSealed());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":new",md->isNew());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":optional",md->isOptional());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":required",md->isRequired());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":virt",md->virtualness());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->memberType() == MemberType_Variable)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":mutable",md->isMutable());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":initonly",md->isInitonly());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":attribute",md->isAttribute());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":property",md->isProperty());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":readonly",md->isReadonly());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":bound",md->isBound());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":removable",md->isRemovable());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":constrained",md->isConstrained());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":transient",md->isTransient());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":maybevoid",md->isMaybeVoid());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":maybedefault",md->isMaybeDefault());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":maybeambiguous",md->isMaybeAmbiguous());
|
|
Packit |
1c1d7e |
if (md->bitfieldString())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString bitfield = md->bitfieldString();
|
|
Packit |
1c1d7e |
if (bitfield.at(0)==':') bitfield=bitfield.mid(1);
|
|
Packit |
1c1d7e |
bindTextParameter(memberdef_insert,":bitfield",bitfield.stripWhiteSpace());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (md->memberType() == MemberType_Property)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":readable",md->isReadable());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":writable",md->isWritable());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":gettable",md->isGettable());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":privategettable",md->isPrivateGettable());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":protectedgettable",md->isProtectedGettable());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":settable",md->isSettable());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":privatesettable",md->isPrivateSettable());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":protectedsettable",md->isProtectedSettable());
|
|
Packit |
1c1d7e |
if (md->isAssign() || md->isCopy() || md->isRetain()
|
|
Packit |
1c1d7e |
|| md->isStrong() || md->isWeak())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int accessor=0;
|
|
Packit |
1c1d7e |
if (md->isAssign()) accessor = 1;
|
|
Packit |
1c1d7e |
else if (md->isCopy()) accessor = 2;
|
|
Packit |
1c1d7e |
else if (md->isRetain()) accessor = 3;
|
|
Packit |
1c1d7e |
else if (md->isStrong()) accessor = 4;
|
|
Packit |
1c1d7e |
else if (md->isWeak()) accessor = 5;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":accessor",accessor);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
bindTextParameter(memberdef_insert,":read",md->getReadAccessor());
|
|
Packit |
1c1d7e |
bindTextParameter(memberdef_insert,":write",md->getWriteAccessor());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (md->memberType() == MemberType_Event)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":addable",md->isAddable());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":removable",md->isRemovable());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":raisable",md->isRaisable());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + declaration/definition arg lists
|
|
Packit |
1c1d7e |
if (md->memberType()!=MemberType_Define &&
|
|
Packit |
1c1d7e |
md->memberType()!=MemberType_Enumeration
|
|
Packit |
1c1d7e |
)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (md->memberType()!=MemberType_Typedef)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeMemberTemplateLists(md);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
QCString typeStr = md->typeString();
|
|
Packit |
1c1d7e |
stripQualifiers(typeStr);
|
|
Packit |
1c1d7e |
StringList l;
|
|
Packit |
1c1d7e |
linkifyText(TextGeneratorSqlite3Impl(l), def, md->getBodyDef(),md,typeStr);
|
|
Packit |
1c1d7e |
if (typeStr.data())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(memberdef_insert,":type",typeStr.data(),FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->definition())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(memberdef_insert,":definition",md->definition());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->argsString())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(memberdef_insert,":argsstring",md->argsString());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bindTextParameter(memberdef_insert,":name",md->name());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// Extract references from initializer
|
|
Packit |
1c1d7e |
if (md->hasMultiLineInitializer() || md->hasOneLineInitializer())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(memberdef_insert,":initializer",md->initializer().data());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
StringList l;
|
|
Packit |
1c1d7e |
linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,md->initializer());
|
|
Packit |
1c1d7e |
StringListIterator li(l);
|
|
Packit |
1c1d7e |
QCString *s;
|
|
Packit |
1c1d7e |
while ((s=li.current()))
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (md->getBodyDef())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DBG_CTX(("initializer:%s %s %s %d\n",
|
|
Packit |
1c1d7e |
md->anchor().data(),
|
|
Packit |
1c1d7e |
s->data(),
|
|
Packit |
1c1d7e |
md->getBodyDef()->getDefFileName().data(),
|
|
Packit |
1c1d7e |
md->getStartBodyLine()));
|
|
Packit |
1c1d7e |
QCString qrefid_src = md->getOutputFileBase() + "_1" + md->anchor();
|
|
Packit |
1c1d7e |
int refid_src = insertRefid(qrefid_src.data());
|
|
Packit |
1c1d7e |
int refid_dst = insertRefid(s->data());
|
|
Packit |
1c1d7e |
int id_file = insertFile(stripFromPath(md->getBodyDef()->getDefFileName()));
|
|
Packit |
1c1d7e |
insertMemberReference(refid_src,refid_dst,id_file,md->getStartBodyLine(),-1);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
++li;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if ( md->getScopeString() )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(memberdef_insert,":scope",md->getScopeString().data(),FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// +Brief, detailed and inbody description
|
|
Packit |
1c1d7e |
bindTextParameter(memberdef_insert,":briefdescription",md->briefDescription(),FALSE);
|
|
Packit |
1c1d7e |
bindTextParameter(memberdef_insert,":detaileddescription",md->documentation(),FALSE);
|
|
Packit |
1c1d7e |
bindTextParameter(memberdef_insert,":inbodydescription",md->inbodyDocumentation(),FALSE);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// File location
|
|
Packit |
1c1d7e |
if (md->getDefLine() != -1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int id_file = insertFile(stripFromPath(md->getDefFileName()));
|
|
Packit |
1c1d7e |
if (id_file!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":id_file",id_file);
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":line",md->getDefLine());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":column",md->getDefColumn());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (md->getStartBodyLine()!=-1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int id_bodyfile = insertFile(stripFromPath(md->getBodyDef()->absFilePath()));
|
|
Packit |
1c1d7e |
if (id_bodyfile == -1)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
sqlite3_clear_bindings(memberdef_insert.stmt);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":id_bodyfile",id_bodyfile);
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":bodystart",md->getStartBodyLine());
|
|
Packit |
1c1d7e |
bindIntParameter(memberdef_insert,":bodyend",md->getEndBodyLine());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int id_memberdef=step(memberdef_insert,TRUE);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (isFunc)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
insertMemberFunctionParams(id_memberdef,md,def);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else if (md->memberType()==MemberType_Define &&
|
|
Packit |
1c1d7e |
md->argsString())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
insertMemberDefineParams(id_memberdef,md,def);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + source references
|
|
Packit |
1c1d7e |
// The cross-references in initializers only work when both the src and dst
|
|
Packit |
1c1d7e |
// are defined.
|
|
Packit |
1c1d7e |
MemberSDict *mdict = md->getReferencesMembers();
|
|
Packit |
1c1d7e |
if (mdict!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberSDict::IteratorDict mdi(*mdict);
|
|
Packit |
1c1d7e |
MemberDef *rmd;
|
|
Packit |
1c1d7e |
for (mdi.toFirst();(rmd=mdi.current());++mdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
insertMemberReference(md,rmd);//,mdi.currentKey());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// + source referenced by
|
|
Packit |
1c1d7e |
mdict = md->getReferencedByMembers();
|
|
Packit |
1c1d7e |
if (mdict!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberSDict::IteratorDict mdi(*mdict);
|
|
Packit |
1c1d7e |
MemberDef *rmd;
|
|
Packit |
1c1d7e |
for (mdi.toFirst();(rmd=mdi.current());++mdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
insertMemberReference(rmd,md);//,mdi.currentKey());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateSqlite3Section( const Definition *d,
|
|
Packit |
1c1d7e |
const MemberList *ml,
|
|
Packit |
1c1d7e |
const char * /*kind*/,
|
|
Packit |
1c1d7e |
const char * /*header*/=0,
|
|
Packit |
1c1d7e |
const char * /*documentation*/=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if (ml==0) return;
|
|
Packit |
1c1d7e |
MemberListIterator mli(*ml);
|
|
Packit |
1c1d7e |
MemberDef *md;
|
|
Packit |
1c1d7e |
int count=0;
|
|
Packit |
1c1d7e |
for (mli.toFirst();(md=mli.current());++mli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// namespace members are also inserted in the file scope, but
|
|
Packit |
1c1d7e |
// to prevent this duplication in the XML output, we filter those here.
|
|
Packit |
1c1d7e |
if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
count++;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if (count==0) return; // empty list
|
|
Packit |
1c1d7e |
for (mli.toFirst();(md=mli.current());++mli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// namespace members are also inserted in the file scope, but
|
|
Packit |
1c1d7e |
// to prevent this duplication in the XML output, we filter those here.
|
|
Packit |
1c1d7e |
//if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateSqlite3ForMember(md,d);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateSqlite3ForClass(const ClassDef *cd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// + list of direct super classes
|
|
Packit |
1c1d7e |
// + list of direct sub classes
|
|
Packit |
1c1d7e |
// + include file
|
|
Packit |
1c1d7e |
// + list of inner classes
|
|
Packit |
1c1d7e |
// - template argument list(s)
|
|
Packit |
1c1d7e |
// + member groups
|
|
Packit |
1c1d7e |
// + list of all members
|
|
Packit |
1c1d7e |
// - brief description
|
|
Packit |
1c1d7e |
// - detailed description
|
|
Packit |
1c1d7e |
// - inheritance DOT diagram
|
|
Packit |
1c1d7e |
// - collaboration DOT diagram
|
|
Packit |
1c1d7e |
// - user defined member sections
|
|
Packit |
1c1d7e |
// - standard member sections
|
|
Packit |
1c1d7e |
// - detailed member documentation
|
|
Packit |
1c1d7e |
// - examples using the class
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (cd->isReference()) return; // skip external references.
|
|
Packit |
1c1d7e |
if (cd->isHidden()) return; // skip hidden classes.
|
|
Packit |
1c1d7e |
if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
|
|
Packit |
1c1d7e |
if (cd->templateMaster()!=0) return; // skip generated template instances.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
msg("Generating Sqlite3 output for class %s\n",cd->name().data());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bindTextParameter(compounddef_insert,":name",cd->name());
|
|
Packit |
1c1d7e |
bindTextParameter(compounddef_insert,":kind",cd->compoundTypeString(),FALSE);
|
|
Packit |
1c1d7e |
bindIntParameter(compounddef_insert,":prot",cd->protection());
|
|
Packit |
1c1d7e |
int refid = insertRefid(cd->getOutputFileBase());
|
|
Packit |
1c1d7e |
bindIntParameter(compounddef_insert,":refid", refid);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int id_file = insertFile(stripFromPath(cd->getDefFileName()));
|
|
Packit |
1c1d7e |
bindIntParameter(compounddef_insert,":id_file",id_file);
|
|
Packit |
1c1d7e |
bindIntParameter(compounddef_insert,":line",cd->getDefLine());
|
|
Packit |
1c1d7e |
bindIntParameter(compounddef_insert,":column",cd->getDefColumn());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
step(compounddef_insert);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + list of direct super classes
|
|
Packit |
1c1d7e |
if (cd->baseClasses())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BaseClassListIterator bcli(*cd->baseClasses());
|
|
Packit |
1c1d7e |
BaseClassDef *bcd;
|
|
Packit |
1c1d7e |
for (bcli.toFirst();(bcd=bcli.current());++bcli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int refid = insertRefid(bcd->classDef->getOutputFileBase());
|
|
Packit |
1c1d7e |
bindIntParameter(basecompoundref_insert,":refid", refid);
|
|
Packit |
1c1d7e |
bindIntParameter(basecompoundref_insert,":prot",bcd->prot);
|
|
Packit |
1c1d7e |
bindIntParameter(basecompoundref_insert,":virt",bcd->virt);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (!bcd->templSpecifiers.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(basecompoundref_insert,":base",insertTemplateSpecifierInScope(bcd->classDef->name(),bcd->templSpecifiers),FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(basecompoundref_insert,":base",bcd->classDef->displayName(),FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
bindTextParameter(basecompoundref_insert,":derived",cd->displayName(),FALSE);
|
|
Packit |
1c1d7e |
step(basecompoundref_insert);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + list of direct sub classes
|
|
Packit |
1c1d7e |
if (cd->subClasses())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
BaseClassListIterator bcli(*cd->subClasses());
|
|
Packit |
1c1d7e |
BaseClassDef *bcd;
|
|
Packit |
1c1d7e |
for (bcli.toFirst();(bcd=bcli.current());++bcli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(derivedcompoundref_insert,":base",cd->displayName(),FALSE);
|
|
Packit |
1c1d7e |
if (!bcd->templSpecifiers.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(derivedcompoundref_insert,":derived",insertTemplateSpecifierInScope(bcd->classDef->name(),bcd->templSpecifiers),FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindTextParameter(derivedcompoundref_insert,":derived",bcd->classDef->displayName(),FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
int refid = insertRefid(bcd->classDef->getOutputFileBase());
|
|
Packit |
1c1d7e |
bindIntParameter(derivedcompoundref_insert,":refid", refid);
|
|
Packit |
1c1d7e |
bindIntParameter(derivedcompoundref_insert,":prot",bcd->prot);
|
|
Packit |
1c1d7e |
bindIntParameter(derivedcompoundref_insert,":virt",bcd->virt);
|
|
Packit |
1c1d7e |
step(derivedcompoundref_insert);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + include file
|
|
Packit |
1c1d7e |
IncludeInfo *ii=cd->includeInfo();
|
|
Packit |
1c1d7e |
if (ii)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QCString nm = ii->includeName;
|
|
Packit |
1c1d7e |
if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
|
|
Packit |
1c1d7e |
if (!nm.isEmpty())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int id_dst=insertFile(nm);
|
|
Packit |
1c1d7e |
if (id_dst!=-1) {
|
|
Packit |
1c1d7e |
bindIntParameter(incl_select,":local",ii->local);
|
|
Packit |
1c1d7e |
bindIntParameter(incl_select,":id_src",id_file);
|
|
Packit |
1c1d7e |
bindIntParameter(incl_select,":id_dst",id_dst);
|
|
Packit |
1c1d7e |
int count=step(incl_select,TRUE,TRUE);
|
|
Packit |
1c1d7e |
if (count==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
bindIntParameter(incl_insert,":local",ii->local);
|
|
Packit |
1c1d7e |
bindIntParameter(incl_insert,":id_src",id_file);
|
|
Packit |
1c1d7e |
bindIntParameter(incl_insert,":id_dst",id_dst);
|
|
Packit |
1c1d7e |
step(incl_insert);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
// + list of inner classes
|
|
Packit |
1c1d7e |
writeInnerClasses(cd->getClassSDict());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// - template argument list(s)
|
|
Packit |
1c1d7e |
writeTemplateList(cd);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + member groups
|
|
Packit |
1c1d7e |
if (cd->getMemberGroupSDict())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberGroupSDict::Iterator mgli(*cd->getMemberGroupSDict());
|
|
Packit |
1c1d7e |
MemberGroup *mg;
|
|
Packit |
1c1d7e |
for (;(mg=mgli.current());++mgli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateSqlite3Section(cd,mg->members(),"user-defined",mg->header(),
|
|
Packit |
1c1d7e |
mg->documentation());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + list of all members
|
|
Packit |
1c1d7e |
QListIterator<MemberList> mli(cd->getMemberLists());
|
|
Packit |
1c1d7e |
MemberList *ml;
|
|
Packit |
1c1d7e |
for (mli.toFirst();(ml=mli.current());++mli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ((ml->listType()&MemberListType_detailedLists)==0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateSqlite3Section(cd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateSqlite3ForNamespace(const NamespaceDef *nd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// + contained class definitions
|
|
Packit |
1c1d7e |
// + contained namespace definitions
|
|
Packit |
1c1d7e |
// + member groups
|
|
Packit |
1c1d7e |
// + normal members
|
|
Packit |
1c1d7e |
// - brief desc
|
|
Packit |
1c1d7e |
// - detailed desc
|
|
Packit |
1c1d7e |
// - location
|
|
Packit |
1c1d7e |
// - files containing (parts of) the namespace definition
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (nd->isReference() || nd->isHidden()) return; // skip external references
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + contained class definitions
|
|
Packit |
1c1d7e |
writeInnerClasses(nd->getClassSDict());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + contained namespace definitions
|
|
Packit |
1c1d7e |
writeInnerNamespaces(nd->getNamespaceSDict());
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + member groups
|
|
Packit |
1c1d7e |
if (nd->getMemberGroupSDict())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
|
|
Packit |
1c1d7e |
MemberGroup *mg;
|
|
Packit |
1c1d7e |
for (;(mg=mgli.current());++mgli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateSqlite3Section(nd,mg->members(),"user-defined",mg->header(),
|
|
Packit |
1c1d7e |
mg->documentation());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + normal members
|
|
Packit |
1c1d7e |
QListIterator<MemberList> mli(nd->getMemberLists());
|
|
Packit |
1c1d7e |
MemberList *ml;
|
|
Packit |
1c1d7e |
for (mli.toFirst();(ml=mli.current());++mli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ((ml->listType()&MemberListType_declarationLists)!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateSqlite3Section(nd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateSqlite3ForFile(const FileDef *fd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// + includes files
|
|
Packit |
1c1d7e |
// + includedby files
|
|
Packit |
1c1d7e |
// - include graph
|
|
Packit |
1c1d7e |
// - included by graph
|
|
Packit |
1c1d7e |
// + contained class definitions
|
|
Packit |
1c1d7e |
// + contained namespace definitions
|
|
Packit |
1c1d7e |
// + member groups
|
|
Packit |
1c1d7e |
// + normal members
|
|
Packit |
1c1d7e |
// - brief desc
|
|
Packit |
1c1d7e |
// - detailed desc
|
|
Packit |
1c1d7e |
// - source code
|
|
Packit |
1c1d7e |
// - location
|
|
Packit |
1c1d7e |
// - number of lines
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (fd->isReference()) return; // skip external references
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + includes files
|
|
Packit |
1c1d7e |
IncludeInfo *ii;
|
|
Packit |
1c1d7e |
if (fd->includeFileList())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QListIterator<IncludeInfo> ili(*fd->includeFileList());
|
|
Packit |
1c1d7e |
for (ili.toFirst();(ii=ili.current());++ili)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int id_src=insertFile(fd->absFilePath().data());
|
|
Packit |
1c1d7e |
int id_dst=insertFile(ii->includeName.data());
|
|
Packit |
1c1d7e |
bindIntParameter(incl_select,":local",ii->local);
|
|
Packit |
1c1d7e |
bindIntParameter(incl_select,":id_src",id_src);
|
|
Packit |
1c1d7e |
bindIntParameter(incl_select,":id_dst",id_dst);
|
|
Packit |
1c1d7e |
if (step(incl_select,TRUE,TRUE)==0) {
|
|
Packit |
1c1d7e |
bindIntParameter(incl_insert,":local",ii->local);
|
|
Packit |
1c1d7e |
bindIntParameter(incl_insert,":id_src",id_src);
|
|
Packit |
1c1d7e |
bindIntParameter(incl_insert,":id_dst",id_dst);
|
|
Packit |
1c1d7e |
step(incl_insert);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + includedby files
|
|
Packit |
1c1d7e |
if (fd->includedByFileList())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QListIterator<IncludeInfo> ili(*fd->includedByFileList());
|
|
Packit |
1c1d7e |
for (ili.toFirst();(ii=ili.current());++ili)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
int id_src=insertFile(ii->includeName);
|
|
Packit |
1c1d7e |
int id_dst=insertFile(fd->absFilePath());
|
|
Packit |
1c1d7e |
bindIntParameter(incl_select,":local",ii->local);
|
|
Packit |
1c1d7e |
bindIntParameter(incl_select,":id_src",id_src);
|
|
Packit |
1c1d7e |
bindIntParameter(incl_select,":id_dst",id_dst);
|
|
Packit |
1c1d7e |
if (step(incl_select,TRUE,TRUE)==0) {
|
|
Packit |
1c1d7e |
bindIntParameter(incl_insert,":local",ii->local);
|
|
Packit |
1c1d7e |
bindIntParameter(incl_insert,":id_src",id_src);
|
|
Packit |
1c1d7e |
bindIntParameter(incl_insert,":id_dst",id_dst);
|
|
Packit |
1c1d7e |
step(incl_insert);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + contained class definitions
|
|
Packit |
1c1d7e |
if (fd->getClassSDict())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeInnerClasses(fd->getClassSDict());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + contained namespace definitions
|
|
Packit |
1c1d7e |
if (fd->getNamespaceSDict())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
writeInnerNamespaces(fd->getNamespaceSDict());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + member groups
|
|
Packit |
1c1d7e |
if (fd->getMemberGroupSDict())
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
|
|
Packit |
1c1d7e |
MemberGroup *mg;
|
|
Packit |
1c1d7e |
for (;(mg=mgli.current());++mgli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateSqlite3Section(fd,mg->members(),"user-defined",mg->header(),
|
|
Packit |
1c1d7e |
mg->documentation());
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + normal members
|
|
Packit |
1c1d7e |
QListIterator<MemberList> mli(fd->getMemberLists());
|
|
Packit |
1c1d7e |
MemberList *ml;
|
|
Packit |
1c1d7e |
for (mli.toFirst();(ml=mli.current());++mli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ((ml->listType()&MemberListType_declarationLists)!=0)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
generateSqlite3Section(fd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateSqlite3ForGroup(const GroupDef *gd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#warning WorkInProgress
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateSqlite3ForDir(const DirDef *dd)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#warning WorkInProgress
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static void generateSqlite3ForPage(const PageDef *pd,bool isExample)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#warning WorkInProgress
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static sqlite3* openDbConnection()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString outputDirectory = Config_getString(OUTPUT_DIRECTORY);
|
|
Packit |
1c1d7e |
QDir sqlite3Dir(outputDirectory);
|
|
Packit |
1c1d7e |
sqlite3 *db;
|
|
Packit |
1c1d7e |
int rc;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
rc = sqlite3_initialize();
|
|
Packit |
1c1d7e |
if (rc != SQLITE_OK)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("sqlite3_initialize failed\n");
|
|
Packit |
1c1d7e |
return NULL;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
rc = sqlite3_open_v2(outputDirectory+"/doxygen_sqlite3.db", &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0);
|
|
Packit |
1c1d7e |
if (rc != SQLITE_OK)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
sqlite3_close(db);
|
|
Packit |
1c1d7e |
msg("database open failed: %s\n", "doxygen_sqlite3.db");
|
|
Packit |
1c1d7e |
return NULL;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return db;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
//////////////////////////////////////////////////////////////////////////////
|
|
Packit |
1c1d7e |
void generateSqlite3()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
// + classes
|
|
Packit |
1c1d7e |
// + namespaces
|
|
Packit |
1c1d7e |
// + files
|
|
Packit |
1c1d7e |
// + groups
|
|
Packit |
1c1d7e |
// + related pages
|
|
Packit |
1c1d7e |
// + examples
|
|
Packit |
1c1d7e |
// + main page
|
|
Packit |
1c1d7e |
sqlite3 *db;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
db = openDbConnection();
|
|
Packit |
1c1d7e |
if (db==NULL)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
beginTransaction(db);
|
|
Packit |
1c1d7e |
pragmaTuning(db);
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if (-1==initializeSchema(db))
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if ( -1 == prepareStatements(db) )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("sqlite generator: prepareStatements failed!");
|
|
Packit |
1c1d7e |
return;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + classes
|
|
Packit |
1c1d7e |
ClassSDict::Iterator cli(*Doxygen::classSDict);
|
|
Packit |
1c1d7e |
ClassDef *cd;
|
|
Packit |
1c1d7e |
for (cli.toFirst();(cd=cli.current());++cli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating Sqlite3 output for class %s\n",cd->name().data());
|
|
Packit |
1c1d7e |
generateSqlite3ForClass(cd);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + namespaces
|
|
Packit |
1c1d7e |
NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict);
|
|
Packit |
1c1d7e |
NamespaceDef *nd;
|
|
Packit |
1c1d7e |
for (nli.toFirst();(nd=nli.current());++nli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating Sqlite3 output for namespace %s\n",nd->name().data());
|
|
Packit |
1c1d7e |
generateSqlite3ForNamespace(nd);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + files
|
|
Packit |
1c1d7e |
FileNameListIterator fnli(*Doxygen::inputNameList);
|
|
Packit |
1c1d7e |
FileName *fn;
|
|
Packit |
1c1d7e |
for (;(fn=fnli.current());++fnli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
FileNameIterator fni(*fn);
|
|
Packit |
1c1d7e |
FileDef *fd;
|
|
Packit |
1c1d7e |
for (;(fd=fni.current());++fni)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating Sqlite3 output for file %s\n",fd->name().data());
|
|
Packit |
1c1d7e |
generateSqlite3ForFile(fd);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + groups
|
|
Packit |
1c1d7e |
GroupSDict::Iterator gli(*Doxygen::groupSDict);
|
|
Packit |
1c1d7e |
GroupDef *gd;
|
|
Packit |
1c1d7e |
for (;(gd=gli.current());++gli)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating Sqlite3 output for group %s\n",gd->name().data());
|
|
Packit |
1c1d7e |
generateSqlite3ForGroup(gd);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + page
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
PageSDict::Iterator pdi(*Doxygen::pageSDict);
|
|
Packit |
1c1d7e |
PageDef *pd=0;
|
|
Packit |
1c1d7e |
for (pdi.toFirst();(pd=pdi.current());++pdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating Sqlite3 output for page %s\n",pd->name().data());
|
|
Packit |
1c1d7e |
generateSqlite3ForPage(pd,FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + dirs
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
DirDef *dir;
|
|
Packit |
1c1d7e |
DirSDict::Iterator sdi(*Doxygen::directories);
|
|
Packit |
1c1d7e |
for (sdi.toFirst();(dir=sdi.current());++sdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating Sqlite3 output for dir %s\n",dir->name().data());
|
|
Packit |
1c1d7e |
generateSqlite3ForDir(dir);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + examples
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
PageSDict::Iterator pdi(*Doxygen::exampleSDict);
|
|
Packit |
1c1d7e |
PageDef *pd=0;
|
|
Packit |
1c1d7e |
for (pdi.toFirst();(pd=pdi.current());++pdi)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating Sqlite3 output for example %s\n",pd->name().data());
|
|
Packit |
1c1d7e |
generateSqlite3ForPage(pd,TRUE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// + main page
|
|
Packit |
1c1d7e |
if (Doxygen::mainPage)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
msg("Generating Sqlite3 output for the main page\n");
|
|
Packit |
1c1d7e |
generateSqlite3ForPage(Doxygen::mainPage,FALSE);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
endTransaction(db);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#else // USE_SQLITE3
|
|
Packit |
1c1d7e |
void generateSqlite3()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
err("sqlite3 support has not been compiled in!");
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
// vim: noai:ts=2:sw=2:ss=2:expandtab
|