=================================================================== RCS file: /cvs/mandoc/mandocdb.c,v retrieving revision 1.105 retrieving revision 1.108 diff -u -p -r1.105 -r1.108 --- mandoc/mandocdb.c 2014/01/06 13:54:17 1.105 +++ mandoc/mandocdb.c 2014/01/18 08:19:18 1.108 @@ -1,4 +1,4 @@ -/* $Id: mandocdb.c,v 1.105 2014/01/06 13:54:17 schwarze Exp $ */ +/* $Id: mandocdb.c,v 1.108 2014/01/18 08:19:18 schwarze Exp $ */ /* * Copyright (c) 2011, 2012 Kristaps Dzonsons * Copyright (c) 2011, 2012, 2013, 2014 Ingo Schwarze @@ -700,11 +700,19 @@ filescan(const char *file) exitcode = (int)MANDOCLEVEL_BADARG; say(file, NULL); return; - } else if (OP_TEST != op && strstr(buf, basedir) != buf) { + } + + if (strstr(buf, basedir) == buf) + start = buf + strlen(basedir) + 1; + else if (OP_TEST == op) + start = buf; + else { exitcode = (int)MANDOCLEVEL_BADARG; say("", "%s: outside base directory", buf); return; - } else if (-1 == stat(buf, &st)) { + } + + if (-1 == stat(buf, &st)) { exitcode = (int)MANDOCLEVEL_BADARG; say(file, NULL); return; @@ -713,7 +721,7 @@ filescan(const char *file) say(file, "Not a regular file"); return; } - start = buf + strlen(basedir); + mlink = mandoc_calloc(1, sizeof(struct mlink)); strlcpy(mlink->file, start, sizeof(mlink->file)); @@ -961,6 +969,9 @@ mpages_merge(struct mchars *mc, struct mparse *mp) str_info.hfree = hash_free; str_info.key_offset = offsetof(struct str, key); + if (0 == nodb) + SQL_EXEC("BEGIN TRANSACTION"); + mpage = ohash_first(&mpages, &pslot); while (NULL != mpage) { mlinks_undupe(mpage); @@ -1051,6 +1062,9 @@ mpages_merge(struct mchars *mc, struct mparse *mp) ohash_delete(&strings); mpage = ohash_next(&mpages, &pslot); } + + if (0 == nodb) + SQL_EXEC("END TRANSACTION"); } static void @@ -1746,8 +1760,6 @@ dbadd(const struct mpage *mpage, struct mchars *mc) if (nodb) return; - SQL_EXEC("BEGIN TRANSACTION"); - i = 1; SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, FORM_SRC == mpage->form); SQL_STEP(stmts[STMT_INSERT_PAGE]); @@ -1779,8 +1791,6 @@ dbadd(const struct mpage *mpage, struct mchars *mc) free(key->rendered); free(key); } - - SQL_EXEC("END TRANSACTION"); } static void @@ -1791,20 +1801,31 @@ dbprune(void) size_t i; unsigned int slot; - if (nodb) - return; + if (0 == nodb) + SQL_EXEC("BEGIN TRANSACTION"); - mpage = ohash_first(&mpages, &slot); - while (NULL != mpage) { + for (mpage = ohash_first(&mpages, &slot); NULL != mpage; + mpage = ohash_next(&mpages, &slot)) { mlink = mpage->mlinks; - i = 1; - 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(mlink->file, "Deleted from database"); - mpage = ohash_next(&mpages, &slot); + say(mlink->file, "Deleting from database"); + if (nodb) + continue; + for ( ; NULL != mlink; mlink = mlink->next) { + i = 1; + SQL_BIND_TEXT(stmts[STMT_DELETE_PAGE], + i, mlink->dsec); + SQL_BIND_TEXT(stmts[STMT_DELETE_PAGE], + i, mlink->arch); + SQL_BIND_TEXT(stmts[STMT_DELETE_PAGE], + i, mlink->name); + SQL_STEP(stmts[STMT_DELETE_PAGE]); + sqlite3_reset(stmts[STMT_DELETE_PAGE]); + } } + + if (0 == nodb) + SQL_EXEC("END TRANSACTION"); } /* @@ -1903,9 +1924,7 @@ dbopen(int real) " \"pageid\" INTEGER NOT NULL REFERENCES mpages(id) " "ON DELETE CASCADE,\n" " \"id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL\n" - ");\n" - "\n" - "CREATE INDEX \"key_index\" ON keys (key);\n"; + ");\n"; if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, NULL)) { exitcode = (int)MANDOCLEVEL_SYSERR; @@ -1915,7 +1934,9 @@ dbopen(int real) prepare_statements: SQL_EXEC("PRAGMA foreign_keys = ON"); - sql = "DELETE FROM mpages where file=?"; + sql = "DELETE FROM mpages WHERE id IN " + "(SELECT pageid FROM mlinks WHERE " + "sec=? AND arch=? AND name=?)"; sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_DELETE_PAGE], NULL); sql = "INSERT INTO mpages " "(form) VALUES (?)";