=================================================================== RCS file: /cvs/mandoc/mandocdb.c,v retrieving revision 1.80 retrieving revision 1.83 diff -u -p -r1.80 -r1.83 --- mandoc/mandocdb.c 2013/12/26 23:35:59 1.80 +++ mandoc/mandocdb.c 2013/12/27 14:29:28 1.83 @@ -1,4 +1,4 @@ -/* $Id: mandocdb.c,v 1.80 2013/12/26 23:35:59 schwarze Exp $ */ +/* $Id: mandocdb.c,v 1.83 2013/12/27 14:29:28 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons * Copyright (c) 2011, 2012, 2013 Ingo Schwarze @@ -95,14 +95,22 @@ struct inodev { struct mpage { struct inodev inodev; /* used for hashing routine */ - enum form dform; /* path-cued form */ - enum form sform; /* suffix-cued form */ + enum form form; /* format from file content */ + char *sec; /* section from file content */ + char *arch; /* architecture from file content */ + char *title; /* title from file content */ + char *desc; /* description from file content */ + struct mlink *mlinks; /* singly linked list */ +}; + +struct mlink { char file[PATH_MAX]; /* filename rel. to manpath */ - char *desc; /* parsed description */ - char *name; /* name (from filename) (not empty) */ - char *sec; /* suffix-cued section (or empty) */ - char *dsec; /* path-cued section (or empty) */ - char *arch; /* path-cued arch. (or empty) */ + enum form dform; /* format from directory */ + enum form sform; /* format from file name suffix */ + char *dsec; /* section from directory */ + char *arch; /* architecture from directory */ + char *name; /* name from file name (not empty) */ + char *fsec; /* section from file name suffix */ }; struct title { @@ -111,9 +119,10 @@ struct title { }; enum stmt { - STMT_DELETE = 0, /* delete manpage */ - STMT_INSERT_DOC, /* insert manpage */ - STMT_INSERT_KEY, /* insert parsed key */ + STMT_DELETE_PAGE = 0, /* delete mpage */ + STMT_INSERT_PAGE, /* insert mpage */ + STMT_INSERT_LINK, /* insert mlink */ + STMT_INSERT_KEY, /* insert parsed key */ STMT__MAX }; @@ -125,19 +134,17 @@ struct mdoc_handler { }; static void dbclose(int); -static void dbindex(struct mchars *, int, const struct mpage *); +static void dbindex(const struct mpage *, struct mchars *); static int dbopen(int); static void dbprune(void); -static void fileadd(struct mpage *); -static int filecheck(const char *); static void filescan(const char *); static void *hash_alloc(size_t, void *); static void hash_free(void *, size_t, void *); static void *hash_halloc(size_t, void *); -static void inoadd(const struct stat *, struct mpage *); static int inocheck(const struct stat *); -static void ofadd(int, const char *, const char *, const char *, +static void mlink_add(int, const char *, const char *, const char *, const char *, const char *, const struct stat *); +static void mlink_free(struct mlink *); static void mpages_free(void); static void mpages_merge(struct mchars *, struct mparse *, int); static void parse_cat(struct mpage *); @@ -174,7 +181,7 @@ static int exitcode; /* to be returned by main */ static enum op op; /* operational mode */ static char basedir[PATH_MAX]; /* current base directory */ static struct ohash mpages; /* table of distinct manual pages */ -static struct ohash filenames; /* table of filenames */ +static struct ohash mlinks; /* table of directory entries */ static struct ohash strings; /* table of all strings */ static sqlite3 *db = NULL; /* current database */ static sqlite3_stmt *stmts[STMT__MAX]; /* current statements */ @@ -313,17 +320,17 @@ main(int argc, char *argv[]) struct mchars *mc; struct manpaths dirs; struct mparse *mp; - struct ohash_info mpages_info, filename_info; + struct ohash_info mpages_info, mlinks_info; memset(stmts, 0, STMT__MAX * sizeof(sqlite3_stmt *)); memset(&dirs, 0, sizeof(struct manpaths)); - mpages_info.alloc = filename_info.alloc = hash_alloc; - mpages_info.halloc = filename_info.halloc = hash_halloc; - mpages_info.hfree = filename_info.hfree = hash_free; + mpages_info.alloc = mlinks_info.alloc = hash_alloc; + mpages_info.halloc = mlinks_info.halloc = hash_halloc; + mpages_info.hfree = mlinks_info.hfree = hash_free; mpages_info.key_offset = offsetof(struct mpage, inodev); - filename_info.key_offset = offsetof(struct mpage, file); + mlinks_info.key_offset = offsetof(struct mlink, file); progname = strrchr(argv[0], '/'); if (progname == NULL) @@ -398,7 +405,7 @@ main(int argc, char *argv[]) mc = mchars_alloc(); ohash_init(&mpages, 6, &mpages_info); - ohash_init(&filenames, 6, &filename_info); + ohash_init(&mlinks, 6, &mlinks_info); if (OP_UPDATE == op || OP_DELETE == op || OP_TEST == op) { /* @@ -452,7 +459,7 @@ main(int argc, char *argv[]) if (j) { ohash_init(&mpages, 6, &mpages_info); - ohash_init(&filenames, 6, &filename_info); + ohash_init(&mlinks, 6, &mlinks_info); } if (0 == set_basedir(dirs.paths[j])) @@ -470,7 +477,7 @@ main(int argc, char *argv[]) if (j + 1 < dirs.sz) { mpages_free(); ohash_delete(&mpages); - ohash_delete(&filenames); + ohash_delete(&mlinks); } } } @@ -481,7 +488,7 @@ out: mparse_free(mp); mpages_free(); ohash_delete(&mpages); - ohash_delete(&filenames); + ohash_delete(&mlinks); return(exitcode); usage: fprintf(stderr, "usage: %s [-anvW] [-C file]\n" @@ -539,7 +546,7 @@ treescan(void) while (NULL != (ff = fts_read(f))) { path = ff->fts_path + 2; /* - * If we're a regular file, add an mpage by using the + * If we're a regular file, add an mlink by using the * stored directory data and handling the filename. * Disallow duplicate (hard-linked) files. */ @@ -586,7 +593,7 @@ treescan(void) continue; } else sec[-1] = '\0'; - ofadd(dform, path, ff->fts_name, dsec, sec, + mlink_add(dform, path, ff->fts_name, dsec, sec, arch, ff->fts_statp); continue; } else if (FTS_D != ff->fts_info && @@ -662,7 +669,7 @@ treescan(void) * or * [./]cat
[/]/.0 * - * Stuff this information directly into the mpage vector. + * Stuff this information directly into the mlink vector. * See treescan() for the fts(3) version of this. */ static void @@ -751,38 +758,10 @@ filescan(const char *file) *p = '\0'; } - ofadd(dform, file, name, dsec, sec, arch, &st); + mlink_add(dform, file, name, dsec, sec, arch, &st); } -/* - * See fileadd(). - */ static int -filecheck(const char *name) -{ - - return(NULL != ohash_find(&filenames, - ohash_qlookup(&filenames, name))); -} - -/* - * Use the standard hashing mechanism (K&R) to see if the given filename - * already exists. - */ -static void -fileadd(struct mpage *mpage) -{ - unsigned int slot; - - slot = ohash_qlookup(&filenames, mpage->file); - assert(NULL == ohash_find(&filenames, slot)); - ohash_insert(&filenames, slot, mpage); -} - -/* - * See inoadd(). - */ -static int inocheck(const struct stat *st) { struct inodev inodev; @@ -796,31 +775,15 @@ inocheck(const struct stat *st) &mpages, (char *)&inodev, sizeof(inodev), hash))); } -/* - * The hashing function used here is quite simple: simply take the inode - * and use uint32_t of its bits. - * Then when we do the lookup, use both the inode and device identifier. - */ static void -inoadd(const struct stat *st, struct mpage *mpage) -{ - unsigned int slot; - - mpage->inodev.st_ino = st->st_ino; - mpage->inodev.st_dev = st->st_dev; - slot = ohash_lookup_memory(&mpages, (char *)&mpage->inodev, - sizeof(struct inodev), st->st_ino); - - assert(NULL == ohash_find(&mpages, slot)); - ohash_insert(&mpages, slot, mpage); -} - -static void -ofadd(int dform, const char *file, const char *name, const char *dsec, +mlink_add(int dform, const char *file, const char *name, const char *dsec, const char *sec, const char *arch, const struct stat *st) { + struct inodev inodev; struct mpage *mpage; + struct mlink *mlink; int sform; + unsigned int slot; assert(NULL != file); @@ -841,36 +804,62 @@ ofadd(int dform, const char *file, const char *name, c else sform = FORM_NONE; - mpage = mandoc_calloc(1, sizeof(struct mpage)); - strlcpy(mpage->file, file, PATH_MAX); - mpage->name = mandoc_strdup(name); - mpage->sec = mandoc_strdup(sec); - mpage->dsec = mandoc_strdup(dsec); - mpage->arch = mandoc_strdup(arch); - mpage->sform = sform; - mpage->dform = dform; + mlink = mandoc_calloc(1, sizeof(struct mlink)); + strlcpy(mlink->file, file, PATH_MAX); + mlink->dform = dform; + mlink->sform = sform; + mlink->dsec = mandoc_strdup(dsec); + mlink->arch = mandoc_strdup(arch); + mlink->name = mandoc_strdup(name); + mlink->fsec = mandoc_strdup(sec); - /* - * Add to unique identifier hash. - * Then if it's a source manual and we're going to use source in - * favour of catpages, add it to that hash. - */ - inoadd(st, mpage); - fileadd(mpage); + slot = ohash_qlookup(&mlinks, mlink->file); + assert(NULL == ohash_find(&mlinks, slot)); + ohash_insert(&mlinks, slot, mlink); + + inodev.st_ino = st->st_ino; + inodev.st_dev = st->st_dev; + slot = ohash_lookup_memory(&mpages, (char *)&inodev, + sizeof(struct inodev), inodev.st_ino); + mpage = ohash_find(&mpages, slot); + if (NULL == mpage) { + mpage = mandoc_calloc(1, sizeof(struct mpage)); + mpage->inodev.st_ino = inodev.st_ino; + mpage->inodev.st_dev = inodev.st_dev; + ohash_insert(&mpages, slot, mpage); + } else + abort(); + mpage->mlinks = mlink; } static void +mlink_free(struct mlink *mlink) +{ + + free(mlink->dsec); + free(mlink->arch); + free(mlink->name); + free(mlink->fsec); + free(mlink); +} + +static void mpages_free(void) { struct mpage *mpage; + struct mlink *mlink; unsigned int slot; mpage = ohash_first(&mpages, &slot); while (NULL != mpage) { - free(mpage->name); + while (NULL != (mlink = mpage->mlinks)) { + mpage->mlinks = NULL; + mlink_free(mlink); + } free(mpage->sec); - free(mpage->dsec); free(mpage->arch); + free(mpage->title); + free(mpage->desc); free(mpage); mpage = ohash_next(&mpages, &slot); } @@ -894,9 +883,8 @@ mpages_merge(struct mchars *mc, struct mparse *mp, int struct man *man; struct title *title_entry; char *bufp, *title_str; - const char *msec, *march, *mtitle, *cp; + const char *cp; size_t sz; - int form; int match; unsigned int pslot, tslot; enum mandoclevel lvl; @@ -923,11 +911,11 @@ mpages_merge(struct mchars *mc, struct mparse *mp, int * If it does, then we want to use it instead of our * own. */ - if ( ! use_all && FORM_CAT == mpage->dform) { - sz = strlcpy(buf, mpage->file, PATH_MAX); + if ( ! use_all && FORM_CAT == mpage->mlinks->dform) { + sz = strlcpy(buf, mpage->mlinks->file, PATH_MAX); if (sz >= PATH_MAX) { if (warnings) - say(mpage->file, + say(mpage->mlinks->file, "Filename too long"); mpage = ohash_next(&mpages, &pslot); continue; @@ -937,10 +925,11 @@ mpages_merge(struct mchars *mc, struct mparse *mp, int memcpy(bufp, "man", 3); if (NULL != (bufp = strrchr(buf, '.'))) *++bufp = '\0'; - strlcat(buf, mpage->dsec, PATH_MAX); - if (filecheck(buf)) { + strlcat(buf, mpage->mlinks->dsec, PATH_MAX); + if (NULL != ohash_find(&mlinks, + ohash_qlookup(&mlinks, buf))) { if (warnings) - say(mpage->file, "Man " + say(mpage->mlinks->file, "Man " "source exists: %s", buf); mpage = ohash_next(&mpages, &pslot); continue; @@ -958,36 +947,41 @@ mpages_merge(struct mchars *mc, struct mparse *mp, int * source code, unless it is already known to be * formatted. Fall back to formatted mode. */ - if (FORM_CAT != mpage->dform || FORM_CAT != mpage->sform) { - lvl = mparse_readfd(mp, -1, mpage->file); + if (FORM_CAT != mpage->mlinks->dform || + FORM_CAT != mpage->mlinks->sform) { + lvl = mparse_readfd(mp, -1, mpage->mlinks->file); if (lvl < MANDOCLEVEL_FATAL) mparse_result(mp, &mdoc, &man); } if (NULL != mdoc) { - form = 1; - msec = mdoc_meta(mdoc)->msec; - march = mdoc_meta(mdoc)->arch; - mtitle = mdoc_meta(mdoc)->title; + mpage->form = FORM_SRC; + mpage->sec = + mandoc_strdup(mdoc_meta(mdoc)->msec); + mpage->arch = mdoc_meta(mdoc)->arch; + if (NULL == mpage->arch) + mpage->arch = ""; + mpage->arch = mandoc_strdup(mpage->arch); + mpage->title = + mandoc_strdup(mdoc_meta(mdoc)->title); } else if (NULL != man) { - form = 1; - msec = man_meta(man)->msec; - march = mpage->arch; - mtitle = man_meta(man)->title; + mpage->form = FORM_SRC; + mpage->sec = + mandoc_strdup(man_meta(man)->msec); + mpage->arch = + mandoc_strdup(mpage->mlinks->arch); + mpage->title = + mandoc_strdup(man_meta(man)->title); } else { - form = 0; - msec = mpage->dsec; - march = mpage->arch; - mtitle = mpage->name; + mpage->form = FORM_CAT; + mpage->sec = + mandoc_strdup(mpage->mlinks->dsec); + mpage->arch = + mandoc_strdup(mpage->mlinks->arch); + mpage->title = + mandoc_strdup(mpage->mlinks->name); } - if (NULL == msec) - msec = ""; - if (NULL == march) - march = ""; - if (NULL == mtitle) - mtitle = ""; - /* * Check whether the manual section given in a file * agrees with the directory where the file is located. @@ -997,12 +991,12 @@ mpages_merge(struct mchars *mc, struct mparse *mp, int * section, like encrypt(1) = makekey(8). Do not skip * manuals for such reasons. */ - if (warnings && !use_all && form && - strcasecmp(msec, mpage->dsec)) { + if (warnings && !use_all && FORM_SRC == mpage->form && + strcasecmp(mpage->sec, mpage->mlinks->dsec)) { match = 0; - say(mpage->file, "Section \"%s\" " + say(mpage->mlinks->file, "Section \"%s\" " "manual in %s directory", - msec, mpage->dsec); + mpage->sec, mpage->mlinks->dsec); } /* @@ -1019,16 +1013,18 @@ mpages_merge(struct mchars *mc, struct mparse *mp, int * Thus, warn about architecture mismatches, * but don't skip manuals for this reason. */ - if (warnings && !use_all && strcasecmp(march, mpage->arch)) { + if (warnings && !use_all && + strcasecmp(mpage->arch, mpage->mlinks->arch)) { match = 0; - say(mpage->file, "Architecture \"%s\" " + say(mpage->mlinks->file, "Architecture \"%s\" " "manual in \"%s\" directory", - march, mpage->arch); + mpage->arch, mpage->mlinks->arch); } - if (warnings && !use_all && strcasecmp(mtitle, mpage->name)) + if (warnings && !use_all && + strcasecmp(mpage->title, mpage->mlinks->name)) match = 0; - putkey(mpage, mpage->name, TYPE_Nm); + putkey(mpage, mpage->mlinks->name, TYPE_Nm); if (NULL != mdoc) { if (NULL != (cp = mdoc_meta(mdoc)->name)) @@ -1036,7 +1032,7 @@ mpages_merge(struct mchars *mc, struct mparse *mp, int assert(NULL == mpage->desc); parse_mdoc(mpage, mdoc_node(mdoc)); putkey(mpage, NULL != mpage->desc ? - mpage->desc : mpage->name, TYPE_Nd); + mpage->desc : mpage->mlinks->name, TYPE_Nd); } else if (NULL != man) parse_man(mpage, man_node(man)); else @@ -1049,8 +1045,10 @@ mpages_merge(struct mchars *mc, struct mparse *mp, int */ if (check_reachable) { - if (-1 == asprintf(&title_str, "%s(%s%s%s)", mtitle, - msec, '\0' == *march ? "" : "/", march)) { + if (-1 == asprintf(&title_str, "%s(%s%s%s)", + mpage->title, mpage->sec, + '\0' == *mpage->arch ? "" : "/", + mpage->arch)) { perror(NULL); exit((int)MANDOCLEVEL_SYSERR); } @@ -1061,7 +1059,7 @@ mpages_merge(struct mchars *mc, struct mparse *mp, int sizeof(struct title)); title_entry->title = title_str; title_entry->file = mandoc_strdup( - match ? "" : mpage->file); + match ? "" : mpage->mlinks->file); ohash_insert(&title_table, tslot, title_entry); } else { @@ -1071,7 +1069,7 @@ mpages_merge(struct mchars *mc, struct mparse *mp, int } } - dbindex(mc, form, mpage); + dbindex(mpage, mc); ohash_delete(&strings); mpage = ohash_next(&mpages, &pslot); } @@ -1099,9 +1097,9 @@ parse_cat(struct mpage *mpage) char *line, *p, *title; size_t len, plen, titlesz; - if (NULL == (stream = fopen(mpage->file, "r"))) { + if (NULL == (stream = fopen(mpage->mlinks->file, "r"))) { if (warnings) - say(mpage->file, NULL); + say(mpage->mlinks->file, NULL); return; } @@ -1154,10 +1152,11 @@ parse_cat(struct mpage *mpage) if (NULL == title || '\0' == *title) { if (warnings) - say(mpage->file, "Cannot find NAME section"); + say(mpage->mlinks->file, + "Cannot find NAME section"); assert(NULL == mpage->desc); - mpage->desc = mandoc_strdup(mpage->name); - putkey(mpage, mpage->name, TYPE_Nd); + mpage->desc = mandoc_strdup(mpage->mlinks->name); + putkey(mpage, mpage->mlinks->name, TYPE_Nd); fclose(stream); free(title); return; @@ -1177,7 +1176,8 @@ parse_cat(struct mpage *mpage) /* Skip to next word. */ ; } else { if (warnings) - say(mpage->file, "No dash in title line"); + say(mpage->mlinks->file, + "No dash in title line"); p = title; } @@ -1787,7 +1787,7 @@ utf8key(struct mchars *mc, struct str *key) * Also, UTF-8-encode the description at the last possible moment. */ static void -dbindex(struct mchars *mc, int form, const struct mpage *mpage) +dbindex(const struct mpage *mpage, struct mchars *mc) { struct str *key; const char *desc; @@ -1796,7 +1796,7 @@ dbindex(struct mchars *mc, int form, const struct mpag unsigned int slot; if (verb) - say(mpage->file, "Adding to index"); + say(mpage->mlinks->file, "Adding to index"); if (nodb) return; @@ -1814,15 +1814,28 @@ dbindex(struct mchars *mc, int form, const struct mpag SQL_EXEC("BEGIN TRANSACTION"); i = 1; - SQL_BIND_TEXT(stmts[STMT_INSERT_DOC], i, mpage->file); - SQL_BIND_TEXT(stmts[STMT_INSERT_DOC], i, mpage->sec); - SQL_BIND_TEXT(stmts[STMT_INSERT_DOC], i, mpage->arch); - SQL_BIND_TEXT(stmts[STMT_INSERT_DOC], i, desc); - SQL_BIND_INT(stmts[STMT_INSERT_DOC], i, form); - SQL_STEP(stmts[STMT_INSERT_DOC]); + /* + * XXX The following three lines are obsolete + * and only kept for backward compatibility + * until apropos(1) and friends have caught up. + */ + SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, mpage->mlinks->file); + SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, mpage->mlinks->dsec); + SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, mpage->mlinks->arch); + SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, desc); + SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, FORM_SRC == mpage->form); + SQL_STEP(stmts[STMT_INSERT_PAGE]); recno = sqlite3_last_insert_rowid(db); - sqlite3_reset(stmts[STMT_INSERT_DOC]); + sqlite3_reset(stmts[STMT_INSERT_PAGE]); + i = 1; + SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mpage->mlinks->dsec); + SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mpage->mlinks->arch); + SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mpage->mlinks->file); + SQL_BIND_INT64(stmts[STMT_INSERT_LINK], i, recno); + SQL_STEP(stmts[STMT_INSERT_LINK]); + sqlite3_reset(stmts[STMT_INSERT_LINK]); + for (key = ohash_first(&strings, &slot); NULL != key; key = ohash_next(&strings, &slot)) { assert(key->mpage == mpage); @@ -1846,6 +1859,7 @@ static void dbprune(void) { struct mpage *mpage; + struct mlink *mlink; size_t i; unsigned int slot; @@ -1854,12 +1868,13 @@ dbprune(void) mpage = ohash_first(&mpages, &slot); while (NULL != mpage) { + mlink = mpage->mlinks; i = 1; - SQL_BIND_TEXT(stmts[STMT_DELETE], i, mpage->file); - SQL_STEP(stmts[STMT_DELETE]); - sqlite3_reset(stmts[STMT_DELETE]); + SQL_BIND_TEXT(stmts[STMT_DELETE_PAGE], i, mlink->file); + SQL_STEP(stmts[STMT_DELETE_PAGE]); + sqlite3_reset(stmts[STMT_DELETE_PAGE]); if (verb) - say(mpage->file, "Deleted from index"); + say(mlink->file, "Deleted from index"); mpage = ohash_next(&mpages, &slot); } } @@ -1940,7 +1955,12 @@ dbopen(int real) return(0); } - sql = "CREATE TABLE \"docs\" (\n" + /* + * XXX The first three columns in table mpages are obsolete + * and only kept for backward compatibility + * until apropos(1) and friends have caught up. + */ + sql = "CREATE TABLE \"mpages\" (\n" " \"file\" TEXT NOT NULL,\n" " \"sec\" TEXT NOT NULL,\n" " \"arch\" TEXT NOT NULL,\n" @@ -1949,11 +1969,20 @@ dbopen(int real) " \"id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL\n" ");\n" "\n" + "CREATE TABLE \"mlinks\" (\n" + " \"sec\" TEXT NOT NULL,\n" + " \"arch\" TEXT NOT NULL,\n" + " \"name\" TEXT NOT NULL,\n" + " \"pageid\" INTEGER NOT NULL REFERENCES mpages(id) " + "ON DELETE CASCADE,\n" + " \"id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL\n" + ");\n" + "\n" "CREATE TABLE \"keys\" (\n" " \"bits\" INTEGER NOT NULL,\n" " \"key\" TEXT NOT NULL,\n" - " \"docid\" INTEGER NOT NULL REFERENCES docs(id) " - "ON DELETE CASCADE,\n" + " \"pageid\" INTEGER NOT NULL REFERENCES mpages(id) " + "ON DELETE CASCADE,\n" " \"id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL\n" ");\n" "\n" @@ -1967,13 +1996,16 @@ dbopen(int real) prepare_statements: SQL_EXEC("PRAGMA foreign_keys = ON"); - sql = "DELETE FROM docs where file=?"; - sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_DELETE], NULL); - sql = "INSERT INTO docs " + sql = "DELETE FROM mpages where file=?"; + sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_DELETE_PAGE], NULL); + sql = "INSERT INTO mpages " "(file,sec,arch,desc,form) VALUES (?,?,?,?,?)"; - sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_DOC], NULL); + sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_PAGE], NULL); + sql = "INSERT INTO mlinks " + "(sec,arch,name,pageid) VALUES (?,?,?,?)"; + sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_LINK], NULL); sql = "INSERT INTO keys " - "(bits,key,docid) VALUES (?,?,?)"; + "(bits,key,pageid) VALUES (?,?,?)"; sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_KEY], NULL); #ifndef __APPLE__