[BACK]Return to mandocdb.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/mandocdb.c between version 1.133 and 1.138

version 1.133, 2014/04/10 02:46:21 version 1.138, 2014/04/18 21:55:38
Line 55  extern const char *const mansearch_keynames[];
Line 55  extern const char *const mansearch_keynames[];
   
 #define SQL_EXEC(_v) \  #define SQL_EXEC(_v) \
         if (SQLITE_OK != sqlite3_exec(db, (_v), NULL, NULL, NULL)) \          if (SQLITE_OK != sqlite3_exec(db, (_v), NULL, NULL, NULL)) \
                 fprintf(stderr, "%s\n", sqlite3_errmsg(db))                  say("", "%s: %s", (_v), sqlite3_errmsg(db))
 #define SQL_BIND_TEXT(_s, _i, _v) \  #define SQL_BIND_TEXT(_s, _i, _v) \
         if (SQLITE_OK != sqlite3_bind_text \          if (SQLITE_OK != sqlite3_bind_text \
                 ((_s), (_i)++, (_v), -1, SQLITE_STATIC)) \                  ((_s), (_i)++, (_v), -1, SQLITE_STATIC)) \
                 fprintf(stderr, "%s\n", sqlite3_errmsg(db))                  say(mlink->file, "%s", sqlite3_errmsg(db))
 #define SQL_BIND_INT(_s, _i, _v) \  #define SQL_BIND_INT(_s, _i, _v) \
         if (SQLITE_OK != sqlite3_bind_int \          if (SQLITE_OK != sqlite3_bind_int \
                 ((_s), (_i)++, (_v))) \                  ((_s), (_i)++, (_v))) \
                 fprintf(stderr, "%s\n", sqlite3_errmsg(db))                  say(mlink->file, "%s", sqlite3_errmsg(db))
 #define SQL_BIND_INT64(_s, _i, _v) \  #define SQL_BIND_INT64(_s, _i, _v) \
         if (SQLITE_OK != sqlite3_bind_int64 \          if (SQLITE_OK != sqlite3_bind_int64 \
                 ((_s), (_i)++, (_v))) \                  ((_s), (_i)++, (_v))) \
                 fprintf(stderr, "%s\n", sqlite3_errmsg(db))                  say(mlink->file, "%s", sqlite3_errmsg(db))
 #define SQL_STEP(_s) \  #define SQL_STEP(_s) \
         if (SQLITE_DONE != sqlite3_step((_s))) \          if (SQLITE_DONE != sqlite3_step((_s))) \
                 fprintf(stderr, "%s\n", sqlite3_errmsg(db))                  say(mlink->file, "%s", sqlite3_errmsg(db))
   
 enum    op {  enum    op {
         OP_DEFAULT = 0, /* new dbs from dir list or default config */          OP_DEFAULT = 0, /* new dbs from dir list or default config */
Line 100  struct inodev {
Line 100  struct inodev {
   
 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 1205  names_check(void)
Line 1214  names_check(void)
 {  {
         sqlite3_stmt    *stmt;          sqlite3_stmt    *stmt;
         const char      *name, *sec, *arch, *key;          const char      *name, *sec, *arch, *key;
         size_t           i;  
         int              irc;          int              irc;
   
         sqlite3_prepare_v2(db,          sqlite3_prepare_v2(db,
Line 1221  names_check(void)
Line 1229  names_check(void)
           ") USING (pageid);",            ") USING (pageid);",
           -1, &stmt, NULL);            -1, &stmt, NULL);
   
         i = 1;          if (SQLITE_OK != sqlite3_bind_int64(stmt, 1, NAME_TITLE))
         SQL_BIND_INT64(stmt, i, NAME_TITLE);                  say("", "%s", sqlite3_errmsg(db));
   
         while (SQLITE_ROW == (irc = sqlite3_step(stmt))) {          while (SQLITE_ROW == (irc = sqlite3_step(stmt))) {
                 name = sqlite3_column_text(stmt, 0);                  name = sqlite3_column_text(stmt, 0);
Line 1303  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 1343  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 1483  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 1898  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 1950  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) {
                 dbadd_mlink(mlink);                  dbadd_mlink(mlink);
                 mlink = mlink->next;                  mlink = mlink->next;
         }          }
           mlink = mpage->mlinks;
   
         for (key = ohash_first(&names, &slot); NULL != key;          for (key = ohash_first(&names, &slot); NULL != key;
              key = ohash_next(&names, &slot)) {               key = ohash_next(&names, &slot)) {
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)
Line 2177  create_tables:
Line 2182  create_tables:
         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;
Line 2210  create_tables:
Line 2217  create_tables:
   
 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);

Legend:
Removed from v.1.133  
changed lines
  Added in v.1.138

CVSweb