summaryrefslogtreecommitdiffstats
path: root/mansearch.c
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@openbsd.org>2014-01-05 04:13:52 +0000
committerIngo Schwarze <schwarze@openbsd.org>2014-01-05 04:13:52 +0000
commit63d5c3e9200eefafcbced98f070c84e0ae4a4c0e (patch)
tree804c421031c50f3cdecb83d15f11e5c32cc2d997 /mansearch.c
parent608a6c89c9426ab56ed7aed08e536320749c0734 (diff)
downloadmandoc-63d5c3e9200eefafcbced98f070c84e0ae4a4c0e.tar.gz
Remove the obsolete file name column from the mpages table.
This column wasn't helpful because one manpage can have multiple MLINKS. Use the file name column in the mlinks table, instead.
Diffstat (limited to 'mansearch.c')
-rw-r--r--mansearch.c52
1 files changed, 29 insertions, 23 deletions
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 *