version 1.102, 2014/01/05 20:26:36 |
version 1.107, 2014/01/06 20:53:40 |
Line 130 struct mdoc_handler { |
|
Line 130 struct mdoc_handler { |
|
}; |
}; |
|
|
static void dbclose(int); |
static void dbclose(int); |
static void dbindex(const struct mpage *, struct mchars *); |
static void dbadd(const struct mpage *, struct mchars *); |
static int dbopen(int); |
static int dbopen(int); |
static void dbprune(void); |
static void dbprune(void); |
static void filescan(const char *); |
static void filescan(const char *); |
Line 700 filescan(const char *file) |
|
Line 700 filescan(const char *file) |
|
exitcode = (int)MANDOCLEVEL_BADARG; |
exitcode = (int)MANDOCLEVEL_BADARG; |
say(file, NULL); |
say(file, NULL); |
return; |
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; |
exitcode = (int)MANDOCLEVEL_BADARG; |
say("", "%s: outside base directory", buf); |
say("", "%s: outside base directory", buf); |
return; |
return; |
} else if (-1 == stat(buf, &st)) { |
} |
|
|
|
if (-1 == stat(buf, &st)) { |
exitcode = (int)MANDOCLEVEL_BADARG; |
exitcode = (int)MANDOCLEVEL_BADARG; |
say(file, NULL); |
say(file, NULL); |
return; |
return; |
Line 713 filescan(const char *file) |
|
Line 721 filescan(const char *file) |
|
say(file, "Not a regular file"); |
say(file, "Not a regular file"); |
return; |
return; |
} |
} |
start = buf + strlen(basedir); |
|
mlink = mandoc_calloc(1, sizeof(struct mlink)); |
mlink = mandoc_calloc(1, sizeof(struct mlink)); |
strlcpy(mlink->file, start, sizeof(mlink->file)); |
strlcpy(mlink->file, start, sizeof(mlink->file)); |
|
|
Line 961 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
Line 969 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
str_info.hfree = hash_free; |
str_info.hfree = hash_free; |
str_info.key_offset = offsetof(struct str, key); |
str_info.key_offset = offsetof(struct str, key); |
|
|
|
if (0 == nodb) |
|
SQL_EXEC("BEGIN TRANSACTION"); |
|
|
mpage = ohash_first(&mpages, &pslot); |
mpage = ohash_first(&mpages, &pslot); |
while (NULL != mpage) { |
while (NULL != mpage) { |
mlinks_undupe(mpage); |
mlinks_undupe(mpage); |
Line 1047 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
Line 1058 mpages_merge(struct mchars *mc, struct mparse *mp) |
|
else |
else |
parse_cat(mpage); |
parse_cat(mpage); |
|
|
dbindex(mpage, mc); |
dbadd(mpage, mc); |
ohash_delete(&strings); |
ohash_delete(&strings); |
mpage = ohash_next(&mpages, &pslot); |
mpage = ohash_next(&mpages, &pslot); |
} |
} |
|
|
|
if (0 == nodb) |
|
SQL_EXEC("END TRANSACTION"); |
} |
} |
|
|
static void |
static void |
Line 1732 render_key(struct mchars *mc, struct str *key) |
|
Line 1746 render_key(struct mchars *mc, struct str *key) |
|
* Also, handle escape sequences at the last possible moment. |
* Also, handle escape sequences at the last possible moment. |
*/ |
*/ |
static void |
static void |
dbindex(const struct mpage *mpage, struct mchars *mc) |
dbadd(const struct mpage *mpage, struct mchars *mc) |
{ |
{ |
struct mlink *mlink; |
struct mlink *mlink; |
struct str *key; |
struct str *key; |
const char *desc; |
|
int64_t recno; |
int64_t recno; |
size_t i; |
size_t i; |
unsigned int slot; |
unsigned int slot; |
|
|
if (verb) |
if (verb) |
say(mpage->mlinks->file, "Adding to index"); |
say(mpage->mlinks->file, "Adding to database"); |
|
|
if (nodb) |
if (nodb) |
return; |
return; |
|
|
desc = ""; |
|
if (NULL != mpage->desc && '\0' != *mpage->desc) { |
|
key = ohash_find(&strings, |
|
ohash_qlookup(&strings, mpage->desc)); |
|
assert(NULL != key); |
|
if (NULL == key->rendered) |
|
render_key(mc, key); |
|
desc = key->rendered; |
|
} |
|
|
|
SQL_EXEC("BEGIN TRANSACTION"); |
|
|
|
i = 1; |
i = 1; |
SQL_BIND_TEXT(stmts[STMT_INSERT_PAGE], i, 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]); |
recno = sqlite3_last_insert_rowid(db); |
recno = sqlite3_last_insert_rowid(db); |
Line 1768 dbindex(const struct mpage *mpage, struct mchars *mc) |
|
Line 1768 dbindex(const struct mpage *mpage, struct mchars *mc) |
|
|
|
for (mlink = mpage->mlinks; mlink; mlink = mlink->next) { |
for (mlink = mpage->mlinks; mlink; mlink = mlink->next) { |
i = 1; |
i = 1; |
SQL_BIND_TEXT(stmts[STMT_INSERT_LINK], i, mlink->file); |
|
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); |
Line 1792 dbindex(const struct mpage *mpage, struct mchars *mc) |
|
Line 1791 dbindex(const struct mpage *mpage, struct mchars *mc) |
|
free(key->rendered); |
free(key->rendered); |
free(key); |
free(key); |
} |
} |
|
|
SQL_EXEC("END TRANSACTION"); |
|
} |
} |
|
|
static void |
static void |
|
|
size_t i; |
size_t i; |
unsigned int slot; |
unsigned int slot; |
|
|
if (nodb) |
if (0 == nodb) |
return; |
SQL_EXEC("BEGIN TRANSACTION"); |
|
|
mpage = ohash_first(&mpages, &slot); |
for (mpage = ohash_first(&mpages, &slot); NULL != mpage; |
while (NULL != mpage) { |
mpage = ohash_next(&mpages, &slot)) { |
mlink = mpage->mlinks; |
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) |
if (verb) |
say(mlink->file, "Deleted from index"); |
say(mlink->file, "Deleting from database"); |
mpage = ohash_next(&mpages, &slot); |
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"); |
} |
} |
|
|
/* |
/* |
Line 1897 dbopen(int real) |
|
Line 1905 dbopen(int real) |
|
} |
} |
|
|
sql = "CREATE TABLE \"mpages\" (\n" |
sql = "CREATE TABLE \"mpages\" (\n" |
" \"desc\" TEXT NOT NULL,\n" |
|
" \"form\" INTEGER NOT NULL,\n" |
" \"form\" INTEGER NOT NULL,\n" |
" \"id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL\n" |
" \"id\" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL\n" |
");\n" |
");\n" |
"\n" |
"\n" |
"CREATE TABLE \"mlinks\" (\n" |
"CREATE TABLE \"mlinks\" (\n" |
" \"file\" TEXT NOT NULL,\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" |
Line 1930 dbopen(int real) |
|
Line 1936 dbopen(int real) |
|
|
|
prepare_statements: |
prepare_statements: |
SQL_EXEC("PRAGMA foreign_keys = ON"); |
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); |
sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_DELETE_PAGE], NULL); |
sql = "INSERT INTO mpages " |
sql = "INSERT INTO mpages " |
"(desc,form) VALUES (?,?)"; |
"(form) VALUES (?)"; |
sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_PAGE], NULL); |
sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_PAGE], NULL); |
sql = "INSERT INTO mlinks " |
sql = "INSERT INTO mlinks " |
"(file,sec,arch,name,pageid) VALUES (?,?,?,?,?)"; |
"(sec,arch,name,pageid) VALUES (?,?,?,?)"; |
sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_LINK], NULL); |
sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_LINK], NULL); |
sql = "INSERT INTO keys " |
sql = "INSERT INTO keys " |
"(bits,key,pageid) VALUES (?,?,?)"; |
"(bits,key,pageid) VALUES (?,?,?)"; |