diff options
-rw-r--r-- | mandocdb.c | 14 | ||||
-rw-r--r-- | mansearch.c | 52 |
2 files changed, 30 insertions, 36 deletions
@@ -1818,12 +1818,6 @@ dbindex(const struct mpage *mpage, struct mchars *mc) SQL_EXEC("BEGIN TRANSACTION"); i = 1; - /* - * XXX The following line is 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, desc); SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, FORM_SRC == mpage->form); SQL_STEP(stmts[STMT_INSERT_PAGE]); @@ -1960,13 +1954,7 @@ dbopen(int real) return(0); } - /* - * XXX The first column in table mpages is 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" " \"desc\" TEXT NOT NULL,\n" " \"form\" INTEGER NOT NULL,\n" " \"id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL\n" @@ -2003,7 +1991,7 @@ prepare_statements: sql = "DELETE FROM mpages where file=?"; sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_DELETE_PAGE], NULL); sql = "INSERT INTO mpages " - "(file,desc,form) VALUES (?,?,?)"; + "(desc,form) VALUES (?,?)"; sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_PAGE], NULL); sql = "INSERT INTO mlinks " "(file,sec,arch,name,pageid) VALUES (?,?,?,?,?)"; diff --git a/mansearch.c b/mansearch.c index ff88898b..7f6ec165 100644 --- a/mansearch.c +++ b/mansearch.c @@ -70,7 +70,6 @@ struct expr { struct match { uint64_t id; /* identifier in database */ - char *file; /* relative filepath of manpage */ char *desc; /* description of manpage */ int form; /* 0 == catpage */ }; @@ -126,7 +125,8 @@ static const struct type types[] = { { 0ULL, NULL } }; -static char *buildnames(sqlite3 *, sqlite3_stmt *, uint64_t); +static void buildnames(struct manpage *, sqlite3 *, + sqlite3_stmt *, uint64_t, const char *); static char *buildoutput(sqlite3 *, sqlite3_stmt *, uint64_t, uint64_t); static void *hash_alloc(size_t, void *); @@ -279,7 +279,7 @@ mansearch(const struct mansearch *search, * distribution of buckets in the table. */ while (SQLITE_ROW == (c = sqlite3_step(s))) { - id = sqlite3_column_int64(s, 3); + id = sqlite3_column_int64(s, 2); idx = ohash_lookup_memory (&htab, (char *)&id, sizeof(uint64_t), (uint32_t)id); @@ -289,11 +289,9 @@ mansearch(const struct mansearch *search, mp = mandoc_calloc(1, sizeof(struct match)); mp->id = id; - mp->file = mandoc_strdup - ((char *)sqlite3_column_text(s, 0)); mp->desc = mandoc_strdup - ((char *)sqlite3_column_text(s, 1)); - mp->form = sqlite3_column_int(s, 2); + ((char *)sqlite3_column_text(s, 0)); + mp->form = sqlite3_column_int(s, 1); ohash_insert(&htab, idx, mp); } @@ -323,18 +321,12 @@ mansearch(const struct mansearch *search, (*res, maxres * sizeof(struct manpage)); } mpage = *res + cur; - if (-1 == asprintf(&mpage->file, "%s/%s", - paths->paths[i], mp->file)) { - perror(0); - exit((int)MANDOCLEVEL_SYSERR); - } mpage->desc = mp->desc; mpage->form = mp->form; - mpage->names = buildnames(db, s, mp->id); + buildnames(mpage, db, s, mp->id, paths->paths[i]); mpage->output = outbit ? buildoutput(db, s2, mp->id, outbit) : NULL; - free(mp->file); free(mp); cur++; } @@ -354,23 +346,27 @@ out: return(rc); } -static char * -buildnames(sqlite3 *db, sqlite3_stmt *s, uint64_t id) +static void +buildnames(struct manpage *mpage, sqlite3 *db, sqlite3_stmt *s, + uint64_t id, const char *path) { - char *names, *newnames; + char *newnames; const char *oldnames, *sep1, *name, *sec, *sep2, *arch; size_t i; int c; - names = NULL; + mpage->names = NULL; i = 1; SQL_BIND_INT64(db, s, i, id); while (SQLITE_ROW == (c = sqlite3_step(s))) { - if (NULL == names) { + + /* Assemble the list of names. */ + + if (NULL == mpage->names) { oldnames = ""; sep1 = ""; } else { - oldnames = names; + oldnames = mpage->names; sep1 = ", "; } sec = sqlite3_column_text(s, 1); @@ -382,13 +378,23 @@ buildnames(sqlite3 *db, sqlite3_stmt *s, uint64_t id) perror(0); exit((int)MANDOCLEVEL_SYSERR); } - free(names); - names = newnames; + free(mpage->names); + mpage->names = newnames; + + /* Also save the first file name encountered. */ + + if (NULL != mpage->file) + continue; + + name = sqlite3_column_text(s, 0); + if (-1 == asprintf(&mpage->file, "%s/%s", path, name)) { + perror(0); + exit((int)MANDOCLEVEL_SYSERR); + } } if (SQLITE_DONE != c) fprintf(stderr, "%s\n", sqlite3_errmsg(db)); sqlite3_reset(s); - return(names); } static char * |