=================================================================== RCS file: /cvs/mandoc/mandocdb.c,v retrieving revision 1.105 retrieving revision 1.106 diff -u -p -r1.105 -r1.106 --- mandoc/mandocdb.c 2014/01/06 13:54:17 1.105 +++ mandoc/mandocdb.c 2014/01/06 15:32:47 1.106 @@ -1,4 +1,4 @@ -/* $Id: mandocdb.c,v 1.105 2014/01/06 13:54:17 schwarze Exp $ */ +/* $Id: mandocdb.c,v 1.106 2014/01/06 15:32:47 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)); @@ -1791,20 +1799,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"); } /* @@ -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 (?)";