Blame src/sqlite3gen.cpp

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