version 1.134, 2014/04/13 20:55:45 |
version 1.138, 2014/04/18 21:55:38 |
|
|
|
|
struct mpage { |
struct mpage { |
struct inodev inodev; /* used for hashing routine */ |
struct inodev inodev; /* used for hashing routine */ |
int64_t recno; /* id in mpages SQL table */ |
int64_t pageid; /* pageid in mpages SQL table */ |
enum form form; /* format from file content */ |
enum form form; /* format from file content */ |
char *sec; /* section from file content */ |
char *sec; /* section from file content */ |
char *arch; /* architecture from file content */ |
char *arch; /* architecture from file content */ |
Line 442 main(int argc, char *argv[]) |
|
Line 442 main(int argc, char *argv[]) |
|
*/ |
*/ |
if (0 == set_basedir(path_arg)) |
if (0 == set_basedir(path_arg)) |
goto out; |
goto out; |
for (i = 0; i < argc; i++) |
if (dbopen(1)) { |
filescan(argv[i]); |
for (i = 0; i < argc; i++) |
if (0 == dbopen(1)) |
filescan(argv[i]); |
goto out; |
if (OP_TEST != op) |
if (OP_TEST != op) |
dbprune(); |
dbprune(); |
} else { |
|
/* |
|
* Database missing or corrupt. |
|
* Recreate from scratch. |
|
*/ |
|
op = OP_DEFAULT; |
|
if (0 == treescan()) |
|
goto out; |
|
if (0 == dbopen(0)) |
|
goto out; |
|
} |
if (OP_DELETE != op) |
if (OP_DELETE != op) |
mpages_merge(mc, mp); |
mpages_merge(mc, mp); |
dbclose(1); |
dbclose(OP_DEFAULT == op ? 0 : 1); |
} else { |
} else { |
/* |
/* |
* If we have arguments, use them as our manpaths. |
* If we have arguments, use them as our manpaths. |
Line 1099 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
Line 1109 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
* to the target. |
* to the target. |
*/ |
*/ |
|
|
if (mpage_dest->recno) |
if (mpage_dest->pageid) |
dbadd_mlink(mlink); |
dbadd_mlink(mlink); |
|
|
if (NULL == mlink->next) |
if (NULL == mlink->next) |
Line 1154 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
Line 1164 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
putkey(mpage, mlink->name, NAME_FILE); |
putkey(mpage, mlink->name, NAME_FILE); |
} |
} |
|
|
|
assert(NULL == mpage->desc); |
if (NULL != mdoc) { |
if (NULL != mdoc) { |
if (NULL != (cp = mdoc_meta(mdoc)->name)) |
if (NULL != (cp = mdoc_meta(mdoc)->name)) |
putkey(mpage, cp, NAME_HEAD); |
putkey(mpage, cp, NAME_HEAD); |
assert(NULL == mpage->desc); |
|
parse_mdoc(mpage, mdoc_node(mdoc)); |
parse_mdoc(mpage, mdoc_node(mdoc)); |
if (NULL == mpage->desc) |
|
mpage->desc = mandoc_strdup( |
|
mpage->mlinks->name); |
|
} else if (NULL != man) |
} else if (NULL != man) |
parse_man(mpage, man_node(man)); |
parse_man(mpage, man_node(man)); |
else |
else |
parse_cat(mpage, fd[0]); |
parse_cat(mpage, fd[0]); |
|
if (NULL == mpage->desc) |
|
mpage->desc = mandoc_strdup(mpage->mlinks->name); |
|
|
if (warnings && !use_all) |
if (warnings && !use_all) |
for (mlink = mpage->mlinks; mlink; |
for (mlink = mpage->mlinks; mlink; |
Line 1302 parse_cat(struct mpage *mpage, int fd) |
|
Line 1311 parse_cat(struct mpage *mpage, int fd) |
|
if (warnings) |
if (warnings) |
say(mpage->mlinks->file, |
say(mpage->mlinks->file, |
"Cannot find NAME section"); |
"Cannot find NAME section"); |
assert(NULL == mpage->desc); |
|
mpage->desc = mandoc_strdup(mpage->mlinks->name); |
|
fclose(stream); |
fclose(stream); |
free(title); |
free(title); |
return; |
return; |
Line 1342 parse_cat(struct mpage *mpage, int fd) |
|
Line 1349 parse_cat(struct mpage *mpage, int fd) |
|
plen -= 2; |
plen -= 2; |
} |
} |
|
|
assert(NULL == mpage->desc); |
|
mpage->desc = mandoc_strdup(p); |
mpage->desc = mandoc_strdup(p); |
fclose(stream); |
fclose(stream); |
free(title); |
free(title); |
Line 1482 parse_man(struct mpage *mpage, const struct man_node * |
|
Line 1488 parse_man(struct mpage *mpage, const struct man_node * |
|
while (' ' == *start) |
while (' ' == *start) |
start++; |
start++; |
|
|
assert(NULL == mpage->desc); |
|
mpage->desc = mandoc_strdup(start); |
mpage->desc = mandoc_strdup(start); |
free(title); |
free(title); |
return; |
return; |
Line 1897 dbadd_mlink(const struct mlink *mlink) |
|
Line 1902 dbadd_mlink(const struct mlink *mlink) |
|
SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mlink->dsec); |
SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mlink->dsec); |
SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mlink->arch); |
SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mlink->arch); |
SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mlink->name); |
SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mlink->name); |
SQL_BIND_INT64(stmts[STMT_INSERT_LINK], i, mlink->mpage->recno); |
SQL_BIND_INT64(stmts[STMT_INSERT_LINK], i, mlink->mpage->pageid); |
SQL_STEP(stmts[STMT_INSERT_LINK]); |
SQL_STEP(stmts[STMT_INSERT_LINK]); |
sqlite3_reset(stmts[STMT_INSERT_LINK]); |
sqlite3_reset(stmts[STMT_INSERT_LINK]); |
} |
} |
Line 1949 dbadd(struct mpage *mpage, struct mchars *mc) |
|
Line 1954 dbadd(struct mpage *mpage, struct mchars *mc) |
|
SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, mpage->desc); |
SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, mpage->desc); |
SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, FORM_SRC == mpage->form); |
SQL_BIND_INT(stmts[STMT_INSERT_PAGE], i, FORM_SRC == mpage->form); |
SQL_STEP(stmts[STMT_INSERT_PAGE]); |
SQL_STEP(stmts[STMT_INSERT_PAGE]); |
mpage->recno = sqlite3_last_insert_rowid(db); |
mpage->pageid = sqlite3_last_insert_rowid(db); |
sqlite3_reset(stmts[STMT_INSERT_PAGE]); |
sqlite3_reset(stmts[STMT_INSERT_PAGE]); |
|
|
while (NULL != mlink) { |
while (NULL != mlink) { |
Line 1966 dbadd(struct mpage *mpage, struct mchars *mc) |
|
Line 1971 dbadd(struct mpage *mpage, struct mchars *mc) |
|
i = 1; |
i = 1; |
SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, key->mask); |
SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, key->mask); |
SQL_BIND_TEXT(stmts[STMT_INSERT_NAME], i, key->rendered); |
SQL_BIND_TEXT(stmts[STMT_INSERT_NAME], i, key->rendered); |
SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, mpage->recno); |
SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, mpage->pageid); |
SQL_STEP(stmts[STMT_INSERT_NAME]); |
SQL_STEP(stmts[STMT_INSERT_NAME]); |
sqlite3_reset(stmts[STMT_INSERT_NAME]); |
sqlite3_reset(stmts[STMT_INSERT_NAME]); |
if (key->rendered != key->key) |
if (key->rendered != key->key) |
Line 1981 dbadd(struct mpage *mpage, struct mchars *mc) |
|
Line 1986 dbadd(struct mpage *mpage, struct mchars *mc) |
|
i = 1; |
i = 1; |
SQL_BIND_INT64(stmts[STMT_INSERT_KEY], i, key->mask); |
SQL_BIND_INT64(stmts[STMT_INSERT_KEY], i, key->mask); |
SQL_BIND_TEXT(stmts[STMT_INSERT_KEY], i, key->rendered); |
SQL_BIND_TEXT(stmts[STMT_INSERT_KEY], i, key->rendered); |
SQL_BIND_INT64(stmts[STMT_INSERT_KEY], i, mpage->recno); |
SQL_BIND_INT64(stmts[STMT_INSERT_KEY], i, mpage->pageid); |
SQL_STEP(stmts[STMT_INSERT_KEY]); |
SQL_STEP(stmts[STMT_INSERT_KEY]); |
sqlite3_reset(stmts[STMT_INSERT_KEY]); |
sqlite3_reset(stmts[STMT_INSERT_KEY]); |
if (key->rendered != key->key) |
if (key->rendered != key->key) |
|
|
sql = "CREATE TABLE \"mpages\" (\n" |
sql = "CREATE TABLE \"mpages\" (\n" |
" \"desc\" TEXT NOT NULL,\n" |
" \"desc\" TEXT NOT NULL,\n" |
" \"form\" INTEGER NOT NULL,\n" |
" \"form\" INTEGER NOT NULL,\n" |
" \"id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL\n" |
" \"pageid\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL\n" |
");\n" |
");\n" |
"\n" |
"\n" |
"CREATE TABLE \"mlinks\" (\n" |
"CREATE TABLE \"mlinks\" (\n" |
" \"sec\" TEXT NOT NULL,\n" |
" \"sec\" TEXT NOT NULL,\n" |
" \"arch\" TEXT NOT NULL,\n" |
" \"arch\" TEXT NOT NULL,\n" |
" \"name\" TEXT NOT NULL,\n" |
" \"name\" TEXT NOT NULL,\n" |
" \"pageid\" INTEGER NOT NULL REFERENCES mpages(id) " |
" \"pageid\" INTEGER NOT NULL REFERENCES mpages(pageid) " |
"ON DELETE CASCADE\n" |
"ON DELETE CASCADE\n" |
");\n" |
");\n" |
|
"CREATE INDEX mlinks_pageid_idx ON mlinks (pageid);\n" |
"\n" |
"\n" |
"CREATE TABLE \"names\" (\n" |
"CREATE TABLE \"names\" (\n" |
" \"bits\" INTEGER NOT NULL,\n" |
" \"bits\" INTEGER NOT NULL,\n" |
" \"name\" TEXT NOT NULL,\n" |
" \"name\" TEXT NOT NULL,\n" |
" \"pageid\" INTEGER NOT NULL REFERENCES mpages(id) " |
" \"pageid\" INTEGER NOT NULL REFERENCES mpages(pageid) " |
"ON DELETE CASCADE\n" |
"ON DELETE CASCADE\n" |
");\n" |
");\n" |
"\n" |
"\n" |
"CREATE TABLE \"keys\" (\n" |
"CREATE TABLE \"keys\" (\n" |
" \"bits\" INTEGER NOT NULL,\n" |
" \"bits\" INTEGER NOT NULL,\n" |
" \"key\" TEXT NOT NULL,\n" |
" \"key\" TEXT NOT NULL,\n" |
" \"pageid\" INTEGER NOT NULL REFERENCES mpages(id) " |
" \"pageid\" INTEGER NOT NULL REFERENCES mpages(pageid) " |
"ON DELETE CASCADE\n" |
"ON DELETE CASCADE\n" |
");\n"; |
");\n" |
|
"CREATE INDEX keys_pageid_idx ON keys (pageid);\n"; |
|
|
if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, NULL)) { |
if (SQLITE_OK != sqlite3_exec(db, sql, NULL, NULL, NULL)) { |
exitcode = (int)MANDOCLEVEL_SYSERR; |
exitcode = (int)MANDOCLEVEL_SYSERR; |
|
|
|
|
prepare_statements: |
prepare_statements: |
SQL_EXEC("PRAGMA foreign_keys = ON"); |
SQL_EXEC("PRAGMA foreign_keys = ON"); |
sql = "DELETE FROM mpages WHERE id IN " |
sql = "DELETE FROM mpages WHERE pageid IN " |
"(SELECT pageid FROM mlinks WHERE " |
"(SELECT pageid FROM mlinks WHERE " |
"sec=? AND arch=? AND name=?)"; |
"sec=? AND arch=? AND name=?)"; |
sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_DELETE_PAGE], NULL); |
sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_DELETE_PAGE], NULL); |