Commit 32b19bb4 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Merge pull request #17 from groleo/sqlite3

Sqlite3 fixes
parents 9408941c 287dc3d1
...@@ -3,7 +3,7 @@ JQUERY_UI_VERSION = 1.8.18 ...@@ -3,7 +3,7 @@ JQUERY_UI_VERSION = 1.8.18
HASHCHANGE_VERSION = 1.3 HASHCHANGE_VERSION = 1.3
SCROLL_VERSION = 1.4.2 SCROLL_VERSION = 1.4.2
POWERTIP_VERSION = 1.2.0 POWERTIP_VERSION = 1.2.0
MINIFIER = /usr/local/bin/yuicompressor-2.4.7 MINIFIER ?= /usr/local/bin/yuicompressor-2.4.7
SCRIPTS = jquery-$(JQUERY_VERSION).js \ SCRIPTS = jquery-$(JQUERY_VERSION).js \
jquery.ui-$(JQUERY_UI_VERSION).core.js \ jquery.ui-$(JQUERY_UI_VERSION).core.js \
jquery.ui-$(JQUERY_UI_VERSION).widget.js \ jquery.ui-$(JQUERY_UI_VERSION).widget.js \
......
...@@ -45,6 +45,8 @@ ...@@ -45,6 +45,8 @@
//#define DBG_CTX(x) printf x //#define DBG_CTX(x) printf x
#define DBG_CTX(x) do { } while(0) #define DBG_CTX(x) do { } while(0)
static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def);
////////////////////////////////////////////////////// //////////////////////////////////////////////////////
const char *i_q_includes="INSERT OR REPLACE INTO includes " const char *i_q_includes="INSERT OR REPLACE INTO includes "
"( local, id_src, dst ) " "( local, id_src, dst ) "
...@@ -75,9 +77,9 @@ const char *i_q_xrefs="INSERT OR REPLACE INTO xrefs " ...@@ -75,9 +77,9 @@ const char *i_q_xrefs="INSERT OR REPLACE INTO xrefs "
static sqlite3_stmt *i_s_xrefs=0; static sqlite3_stmt *i_s_xrefs=0;
////////////////////////////////////////////////////// //////////////////////////////////////////////////////
const char *i_q_memberdef="INSERT OR REPLACE INTO memberdef " 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, 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_bfile, bline, bcolumn, id_file, line, column)"
"VALUES " "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,: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_bfile,:bline,:bcolumn,:id_file,:line,:column)";
const char *id_q_memberdef="SELECT id FROM memberdef WHERE refid=:refid and id is not null"; 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 *id_s_memberdef=0;
static sqlite3_stmt *i_s_memberdef=0; static sqlite3_stmt *i_s_memberdef=0;
...@@ -176,6 +178,7 @@ const char * schema_queries[][2] = ...@@ -176,6 +178,7 @@ const char * schema_queries[][2] =
"type TEXT," "type TEXT,"
"argsstring TEXT," "argsstring TEXT,"
"scope TEXT," "scope TEXT,"
"initializer TEXT,"
"prot INTEGER NOT NULL," "prot INTEGER NOT NULL,"
"static INTEGER NOT NULL," "static INTEGER NOT NULL,"
"const INTEGER," "const INTEGER,"
...@@ -238,8 +241,6 @@ class TextGeneratorSqlite3Impl : public TextGeneratorIntf ...@@ -238,8 +241,6 @@ class TextGeneratorSqlite3Impl : public TextGeneratorIntf
// the list is filled by linkifyText and consumed by the caller // the list is filled by linkifyText and consumed by the caller
}; };
static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def);
static void bindTextParameter(sqlite3_stmt *stmt,const char *name,const char *value, bool _static=TRUE) static void bindTextParameter(sqlite3_stmt *stmt,const char *name,const char *value, bool _static=TRUE)
{ {
...@@ -326,88 +327,6 @@ static void stripQualifiers(QCString &typeStr) ...@@ -326,88 +327,6 @@ static void stripQualifiers(QCString &typeStr)
} }
} }
////////////////////////////////////////////
static void writeInnerClasses(sqlite3*db,const ClassSDict *cl)
{
if (!cl) return;
ClassSDict::Iterator cli(*cl);
ClassDef *cd;
for (cli.toFirst();(cd=cli.current());++cli)
{
if (!cd->isHidden() && cd->name().find('@')==-1) // skip anonymous scopes
{
bindTextParameter(i_s_innerclass,":refid",cd->getOutputFileBase());
bindIntParameter(i_s_innerclass,":prot",cd->protection());
bindTextParameter(i_s_innerclass,":name",cd->name());
if (-1==step(db,i_s_innerclass))
return;
}
}
}
static void writeInnerNamespaces(sqlite3 * /*db*/,const NamespaceSDict *nl)
{
#warning WorkInProgress
if (nl)
{
NamespaceSDict::Iterator nli(*nl);
NamespaceDef *nd;
for (nli.toFirst();(nd=nli.current());++nli)
{
if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
{
// t << " <innernamespace refid=\"" << nd->getOutputFileBase()
// << "\">" << convertToXML(nd->name()) << "</innernamespace>" << endl;
}
}
}
}
static void writeTemplateArgumentList(sqlite3* /*db*/,
ArgumentList * /*al*/,
Definition * /*scope*/,
FileDef * /*fileScope*/,
int /*indent*/)
{
#warning WorkInProgress
}
static void writeTemplateList(sqlite3*db,ClassDef *cd)
{
writeTemplateArgumentList(db,cd->templateArguments(),cd,0,4);
}
static void generateSqlite3Section(sqlite3*db,
Definition *d,
MemberList *ml,const char * /*kind*/,const char * /*header*/=0,
const char * /*documentation*/=0)
{
if (ml==0) return;
MemberListIterator mli(*ml);
MemberDef *md;
int count=0;
for (mli.toFirst();(md=mli.current());++mli)
{
// namespace members are also inserted in the file scope, but
// to prevent this duplication in the XML output, we filter those here.
if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
{
count++;
}
}
if (count==0) return; // empty list
for (mli.toFirst();(md=mli.current());++mli)
{
// namespace members are also inserted in the file scope, but
// to prevent this duplication in the XML output, we filter those here.
//if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
{
generateSqlite3ForMember(db,md,d);
}
}
}
static int prepareStatement(sqlite3 *db, const char* query, sqlite3_stmt **statement) static int prepareStatement(sqlite3 *db, const char* query, sqlite3_stmt **statement)
{ {
int rc; int rc;
...@@ -488,148 +407,60 @@ static int initializeSchema(sqlite3* db) ...@@ -488,148 +407,60 @@ static int initializeSchema(sqlite3* db)
return 0; return 0;
} }
////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////// static void writeInnerClasses(sqlite3*db,const ClassSDict *cl)
static void generateSqlite3ForNamespace(sqlite3 *db, NamespaceDef *nd)
{ {
// + contained class definitions if (!cl) return;
// + contained namespace definitions
// + member groups
// + normal members
// - brief desc
// - detailed desc
// - location
// - files containing (parts of) the namespace definition
if (nd->isReference() || nd->isHidden()) return; // skip external references
// + contained class definitions
writeInnerClasses(db,nd->getClassSDict());
// + contained namespace definitions
writeInnerNamespaces(db,nd->getNamespaceSDict());
// + member groups
if (nd->getMemberGroupSDict())
{
MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
generateSqlite3Section(db,nd,mg->members(),"user-defined",mg->header(),
mg->documentation());
}
}
// + normal members ClassSDict::Iterator cli(*cl);
QListIterator<MemberList> mli(nd->getMemberLists()); ClassDef *cd;
MemberList *ml; for (cli.toFirst();(cd=cli.current());++cli)
for (mli.toFirst();(ml=mli.current());++mli)
{ {
if ((ml->listType()&MemberListType_declarationLists)!=0) if (!cd->isHidden() && cd->name().find('@')==-1) // skip anonymous scopes
{ {
generateSqlite3Section(db,nd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType())); bindTextParameter(i_s_innerclass,":refid",cd->getOutputFileBase(),FALSE);
bindIntParameter(i_s_innerclass,":prot",cd->protection());
bindTextParameter(i_s_innerclass,":name",cd->name());
if (-1==step(db,i_s_innerclass))
return;
} }
} }
} }
static void writeInnerNamespaces(sqlite3 * /*db*/,const NamespaceSDict *nl)
static void generateSqlite3ForFile(sqlite3 *db, FileDef *fd)
{ {
// + includes files #warning WorkInProgress
// + includedby files if (nl)
// - include graph
// - included by graph
// + contained class definitions
// + contained namespace definitions
// + member groups
// + normal members
// - brief desc
// - detailed desc
// - source code
// - location
// - number of lines
if (fd->isReference()) return; // skip external references
// + includes files
IncludeInfo *ii;
if (fd->includeFileList())
{
QListIterator<IncludeInfo> ili(*fd->includeFileList());
for (ili.toFirst();(ii=ili.current());++ili)
{
int id_file=insertFile(db,fd->absFilePath().data());
bindIntParameter(i_s_includes,":local",ii->local);
bindIntParameter(i_s_includes,":id_src",id_file);
bindTextParameter(i_s_includes,":dst",ii->includeName.data(),FALSE);
if (-1==step(db,i_s_includes))
return;
}
}
// + includedby files
if (fd->includedByFileList())
{
QListIterator<IncludeInfo> ili(*fd->includedByFileList());
for (ili.toFirst();(ii=ili.current());++ili)
{
int id_file=insertFile(db,ii->includeName);
bindIntParameter(i_s_includes,":local",ii->local);
bindIntParameter(i_s_includes,":id_src",id_file);
bindTextParameter(i_s_includes,":dst",fd->absFilePath().data(),FALSE);
if (-1==step(db,i_s_includes))
return;
}
}
// + contained class definitions
if (fd->getClassSDict())
{
writeInnerClasses(db,fd->getClassSDict());
}
// + contained namespace definitions
if (fd->getNamespaceSDict())
{ {
writeInnerNamespaces(db,fd->getNamespaceSDict()); NamespaceSDict::Iterator nli(*nl);
} NamespaceDef *nd;
for (nli.toFirst();(nd=nli.current());++nli)
// + member groups
if (fd->getMemberGroupSDict())
{ {
MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict()); if (!nd->isHidden() && nd->name().find('@')==-1) // skip anonymouse scopes
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{ {
generateSqlite3Section(db,fd,mg->members(),"user-defined",mg->header(), // t << " <innernamespace refid=\"" << nd->getOutputFileBase()
mg->documentation()); // << "\">" << convertToXML(nd->name()) << "</innernamespace>" << endl;
}
} }
// + normal members
QListIterator<MemberList> mli(fd->getMemberLists());
MemberList *ml;
for (mli.toFirst();(ml=mli.current());++mli)
{
if ((ml->listType()&MemberListType_declarationLists)!=0)
{
generateSqlite3Section(db,fd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
} }
} }
} }
static void generateSqlite3ForGroup(sqlite3*db,GroupDef *gd)
{ static void writeTemplateArgumentList(sqlite3* /*db*/,
db=db; ArgumentList * /*al*/,
gd=gd; Definition * /*scope*/,
} FileDef * /*fileScope*/,
static void generateSqlite3ForDir(sqlite3 *db,DirDef *dd) int /*indent*/)
{ {
#warning WorkInProgress
} }
static void generateSqlite3ForPage(sqlite3 *db,PageDef *pd,bool isExample)
static void writeTemplateList(sqlite3*db,ClassDef *cd)
{ {
writeTemplateArgumentList(db,cd->templateArguments(),cd,0,4);
} }
////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def) static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
{ {
// + declaration/definition arg lists // + declaration/definition arg lists
...@@ -645,6 +476,7 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def) ...@@ -645,6 +476,7 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
// + template arguments // + template arguments
// (templateArguments(), definitionTemplateParameterLists()) // (templateArguments(), definitionTemplateParameterLists())
// - call graph // - call graph
msg("=====%s\n",md->name().data());
// enum values are written as part of the enum // enum values are written as part of the enum
if (md->memberType()==MemberType_EnumValue) return; if (md->memberType()==MemberType_EnumValue) return;
...@@ -833,6 +665,8 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def) ...@@ -833,6 +665,8 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
// drm_mod_register_buffer, // drm_mod_register_buffer,
if (!md->initializer().isEmpty() && md->initializer().length()<2000) if (!md->initializer().isEmpty() && md->initializer().length()<2000)
{ {
bindTextParameter(i_s_memberdef,":initializer",md->initializer().data());
StringList l; StringList l;
linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,md->initializer()); linkifyText(TextGeneratorSqlite3Impl(l),def,md->getBodyDef(),md,md->initializer());
QCString *s=l.first(); QCString *s=l.first();
...@@ -869,7 +703,11 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def) ...@@ -869,7 +703,11 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
if (md->getStartBodyLine()!=-1) if (md->getStartBodyLine()!=-1)
{ {
int id_bfile = insertFile(db,md->getBodyDef()->absFilePath()); int id_bfile = insertFile(db,md->getBodyDef()->absFilePath());
if (id_bfile == -1) return; if (id_bfile == -1)
{
sqlite3_clear_bindings(i_s_memberdef);
return;
}
bindIntParameter(i_s_memberdef,":id_ibfile",id_bfile); bindIntParameter(i_s_memberdef,":id_ibfile",id_bfile);
bindIntParameter(i_s_memberdef,":bline",md->getStartBodyLine()); bindIntParameter(i_s_memberdef,":bline",md->getStartBodyLine());
...@@ -881,7 +719,9 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def) ...@@ -881,7 +719,9 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
} }
if (-1==step(db,i_s_memberdef)) if (-1==step(db,i_s_memberdef))
return; {
sqlite3_clear_bindings(i_s_memberdef);
}
/*int id_src =*/ sqlite3_last_insert_rowid(db); /*int id_src =*/ sqlite3_last_insert_rowid(db);
// + source references // + source references
...@@ -911,6 +751,38 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def) ...@@ -911,6 +751,38 @@ static void generateSqlite3ForMember(sqlite3*db,MemberDef *md,Definition *def)
} }
} }
static void generateSqlite3Section(sqlite3*db,
Definition *d,
MemberList *ml,const char * /*kind*/,const char * /*header*/=0,
const char * /*documentation*/=0)
{
if (ml==0) return;
MemberListIterator mli(*ml);
MemberDef *md;
int count=0;
for (mli.toFirst();(md=mli.current());++mli)
{
msg("I:%s\n",md->name().data());
// namespace members are also inserted in the file scope, but
// to prevent this duplication in the XML output, we filter those here.
if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
{
count++;
}
}
if (count==0) return; // empty list
for (mli.toFirst();(md=mli.current());++mli)
{
// namespace members are also inserted in the file scope, but
// to prevent this duplication in the XML output, we filter those here.
//if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
{
generateSqlite3ForMember(db,md,d);
}
}
}
static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd) static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
{ {
// + list of direct super classes // + list of direct super classes
...@@ -943,9 +815,9 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd) ...@@ -943,9 +815,9 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
//stmt = i_s_compounddef; //stmt = i_s_compounddef;
bindTextParameter(i_s_compounddef,":name",cd->name()); bindTextParameter(i_s_compounddef,":name",cd->name());
bindTextParameter(i_s_compounddef,":kind",cd->compoundTypeString()); bindTextParameter(i_s_compounddef,":kind",cd->compoundTypeString(),FALSE);
bindIntParameter(i_s_compounddef,":prot",cd->protection()); bindIntParameter(i_s_compounddef,":prot",cd->protection());
bindTextParameter(i_s_compounddef,":refid",cd->getOutputFileBase()); bindTextParameter(i_s_compounddef,":refid",cd->getOutputFileBase(),FALSE);
int id_file = insertFile(db,cd->getDefFileName().data()); int id_file = insertFile(db,cd->getDefFileName().data());
bindIntParameter(i_s_compounddef,":id_file",id_file); bindIntParameter(i_s_compounddef,":id_file",id_file);
...@@ -976,7 +848,7 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd) ...@@ -976,7 +848,7 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
} }
bindTextParameter(i_s_basecompoundref,":derived",cd->displayName()); bindTextParameter(i_s_basecompoundref,":derived",cd->displayName());
if (-1==step(db,i_s_basecompoundref)) if (-1==step(db,i_s_basecompoundref))
return; continue;
} }
} }
...@@ -993,7 +865,7 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd) ...@@ -993,7 +865,7 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
bindIntParameter(i_s_derivedcompoundref,":prot",bcd->prot); bindIntParameter(i_s_derivedcompoundref,":prot",bcd->prot);
bindIntParameter(i_s_derivedcompoundref,":virt",bcd->virt); bindIntParameter(i_s_derivedcompoundref,":virt",bcd->virt);
if (-1==step(db,i_s_derivedcompoundref)) if (-1==step(db,i_s_derivedcompoundref))
return; continue;
} }
} }
...@@ -1050,6 +922,148 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd) ...@@ -1050,6 +922,148 @@ static void generateSqlite3ForClass(sqlite3 *db, ClassDef *cd)
} }
} }
static void generateSqlite3ForNamespace(sqlite3 *db, NamespaceDef *nd)
{
// + contained class definitions
// + contained namespace definitions
// + member groups
// + normal members
// - brief desc
// - detailed desc
// - location
// - files containing (parts of) the namespace definition
if (nd->isReference() || nd->isHidden()) return; // skip external references
// + contained class definitions
writeInnerClasses(db,nd->getClassSDict());
// + contained namespace definitions
writeInnerNamespaces(db,nd->getNamespaceSDict());
// + member groups
if (nd->getMemberGroupSDict())
{
MemberGroupSDict::Iterator mgli(*nd->getMemberGroupSDict());
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
generateSqlite3Section(db,nd,mg->members(),"user-defined",mg->header(),
mg->documentation());
}
}
// + normal members
QListIterator<MemberList> mli(nd->getMemberLists());
MemberList *ml;
for (mli.toFirst();(ml=mli.current());++mli)
{
if ((ml->listType()&MemberListType_declarationLists)!=0)
{
generateSqlite3Section(db,nd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
}
}
}
static void generateSqlite3ForFile(sqlite3 *db, FileDef *fd)
{
// + includes files
// + includedby files
// - include graph
// - included by graph
// + contained class definitions
// + contained namespace definitions
// + member groups
// + normal members
// - brief desc
// - detailed desc
// - source code
// - location
// - number of lines
if (fd->isReference()) return; // skip external references
// + includes files
IncludeInfo *ii;
if (fd->includeFileList())
{
QListIterator<IncludeInfo> ili(*fd->includeFileList());
for (ili.toFirst();(ii=ili.current());++ili)
{
int id_file=insertFile(db,fd->absFilePath().data());
bindIntParameter(i_s_includes,":local",ii->local);
bindIntParameter(i_s_includes,":id_src",id_file);
bindTextParameter(i_s_includes,":dst",ii->includeName.data(),FALSE);
if (-1==step(db,i_s_includes))
continue;
}
}
// + includedby files
if (fd->includedByFileList())
{
QListIterator<IncludeInfo> ili(*fd->includedByFileList());
for (ili.toFirst();(ii=ili.current());++ili)
{
int id_file=insertFile(db,ii->includeName);
bindIntParameter(i_s_includes,":local",ii->local);
bindIntParameter(i_s_includes,":id_src",id_file);
bindTextParameter(i_s_includes,":dst",fd->absFilePath().data(),FALSE);
if (-1==step(db,i_s_includes))
continue;
}
}
// + contained class definitions
if (fd->getClassSDict())
{
writeInnerClasses(db,fd->getClassSDict());
}
// + contained namespace definitions
if (fd->getNamespaceSDict())
{
writeInnerNamespaces(db,fd->getNamespaceSDict());
}
// + member groups
if (fd->getMemberGroupSDict())
{
MemberGroupSDict::Iterator mgli(*fd->getMemberGroupSDict());
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
generateSqlite3Section(db,fd,mg->members(),"user-defined",mg->header(),
mg->documentation());
}
}
// + normal members
QListIterator<MemberList> mli(fd->getMemberLists());
MemberList *ml;
for (mli.toFirst();(ml=mli.current());++mli)
{
if ((ml->listType()&MemberListType_declarationLists)!=0)
{
generateSqlite3Section(db,fd,ml,"user-defined");//g_xmlSectionMapper.find(ml->listType()));
}
}
}
static void generateSqlite3ForGroup(sqlite3*db,GroupDef *gd)
{
db=db;
gd=gd;
}
static void generateSqlite3ForDir(sqlite3 *db,DirDef *dd)
{
}
static void generateSqlite3ForPage(sqlite3 *db,PageDef *pd,bool isExample)
{
}
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
void generateSqlite3() void generateSqlite3()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment