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

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

version 1.132, 2014/04/09 21:50:08 version 1.133, 2014/04/10 02:46:21
Line 126  enum stmt {
Line 126  enum stmt {
         STMT_DELETE_PAGE = 0,   /* delete mpage */          STMT_DELETE_PAGE = 0,   /* delete mpage */
         STMT_INSERT_PAGE,       /* insert mpage */          STMT_INSERT_PAGE,       /* insert mpage */
         STMT_INSERT_LINK,       /* insert mlink */          STMT_INSERT_LINK,       /* insert mlink */
           STMT_INSERT_NAME,       /* insert name */
         STMT_INSERT_KEY,        /* insert parsed key */          STMT_INSERT_KEY,        /* insert parsed key */
         STMT__MAX          STMT__MAX
 };  };
Line 188  static enum op     op; /* operational mode */
Line 189  static enum op     op; /* operational mode */
 static  char             basedir[PATH_MAX]; /* current base directory */  static  char             basedir[PATH_MAX]; /* current base directory */
 static  struct ohash     mpages; /* table of distinct manual pages */  static  struct ohash     mpages; /* table of distinct manual pages */
 static  struct ohash     mlinks; /* table of directory entries */  static  struct ohash     mlinks; /* table of directory entries */
   static  struct ohash     names; /* table of all names */
 static  struct ohash     strings; /* table of all strings */  static  struct ohash     strings; /* table of all strings */
 static  sqlite3         *db = NULL; /* current database */  static  sqlite3         *db = NULL; /* current database */
 static  sqlite3_stmt    *stmts[STMT__MAX]; /* current statements */  static  sqlite3_stmt    *stmts[STMT__MAX]; /* current statements */
   static  uint64_t         name_mask;
   
 static  const struct mdoc_handler mdocs[MDOC_MAX] = {  static  const struct mdoc_handler mdocs[MDOC_MAX] = {
         { NULL, 0 },  /* Ap */          { NULL, 0 },  /* Ap */
Line 963  mlink_check(struct mpage *mpage, struct mlink *mlink)
Line 966  mlink_check(struct mpage *mpage, struct mlink *mlink)
   
         /*          /*
          * XXX           * XXX
          * parse_cat() doesn't set TYPE_Nm and TYPE_NAME yet.           * parse_cat() doesn't set NAME_TITLE yet.
          */           */
   
         if (FORM_CAT == mpage->form)          if (FORM_CAT == mpage->form)
Line 974  mlink_check(struct mpage *mpage, struct mlink *mlink)
Line 977  mlink_check(struct mpage *mpage, struct mlink *mlink)
          * appears as a name in the NAME section.           * appears as a name in the NAME section.
          */           */
   
         slot = ohash_qlookup(&strings, mlink->name);          slot = ohash_qlookup(&names, mlink->name);
         str = ohash_find(&strings, slot);          str = ohash_find(&names, slot);
         assert(NULL != str);          assert(NULL != str);
         if ( ! (TYPE_NAME & str->mask))          if ( ! (NAME_TITLE & str->mask))
                 say(mlink->file, "Name missing in NAME section");                  say(mlink->file, "Name missing in NAME section");
 }  }
   
Line 1021  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1024  mpages_merge(struct mchars *mc, struct mparse *mp)
                         continue;                          continue;
                 }                  }
   
                   name_mask = NAME_MASK;
                   ohash_init(&names, 4, &str_info);
                 ohash_init(&strings, 6, &str_info);                  ohash_init(&strings, 6, &str_info);
                 mparse_reset(mp);                  mparse_reset(mp);
                 mdoc = NULL;                  mdoc = NULL;
Line 1146  mpages_merge(struct mchars *mc, struct mparse *mp)
Line 1151  mpages_merge(struct mchars *mc, struct mparse *mp)
                                 putkey(mpage, mlink->fsec, TYPE_sec);                                  putkey(mpage, mlink->fsec, TYPE_sec);
                         putkey(mpage, '\0' == *mlink->arch ?                          putkey(mpage, '\0' == *mlink->arch ?
                             any : mlink->arch, TYPE_arch);                              any : mlink->arch, TYPE_arch);
                         putkey(mpage, mlink->name, TYPE_Nm);                          putkey(mpage, mlink->name, NAME_FILE);
                 }                  }
   
                 if (NULL != mdoc) {                  if (NULL != mdoc) {
                         if (NULL != (cp = mdoc_meta(mdoc)->name))                          if (NULL != (cp = mdoc_meta(mdoc)->name))
                                 putkey(mpage, cp, TYPE_Nm);                                  putkey(mpage, cp, NAME_HEAD);
                         assert(NULL == mpage->desc);                          assert(NULL == mpage->desc);
                         parse_mdoc(mpage, mdoc_node(mdoc));                          parse_mdoc(mpage, mdoc_node(mdoc));
                         if (NULL == mpage->desc)                          if (NULL == mpage->desc)
Line 1187  nextpage:
Line 1192  nextpage:
                         }                          }
                 }                  }
                 ohash_delete(&strings);                  ohash_delete(&strings);
                   ohash_delete(&names);
                 mpage = ohash_next(&mpages, &pslot);                  mpage = ohash_next(&mpages, &pslot);
         }          }
   
Line 1204  names_check(void)
Line 1210  names_check(void)
   
         sqlite3_prepare_v2(db,          sqlite3_prepare_v2(db,
           "SELECT name, sec, arch, key FROM ("            "SELECT name, sec, arch, key FROM ("
             "SELECT key, pageid FROM keys "              "SELECT name AS key, pageid FROM names "
             "WHERE bits & ? AND NOT EXISTS ("              "WHERE bits & ? AND NOT EXISTS ("
               "SELECT pageid FROM mlinks "                "SELECT pageid FROM mlinks "
               "WHERE mlinks.pageid == keys.pageid "                "WHERE mlinks.pageid == names.pageid "
               "AND mlinks.name == keys.key"                "AND mlinks.name == names.name"
             ")"              ")"
           ") JOIN ("            ") JOIN ("
             "SELECT * FROM mlinks GROUP BY pageid"              "SELECT * FROM mlinks GROUP BY pageid"
Line 1216  names_check(void)
Line 1222  names_check(void)
           -1, &stmt, NULL);            -1, &stmt, NULL);
   
         i = 1;          i = 1;
         SQL_BIND_INT64(stmt, i, TYPE_NAME);          SQL_BIND_INT64(stmt, i, NAME_TITLE);
   
         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 1441  parse_man(struct mpage *mpage, const struct man_node *
Line 1447  parse_man(struct mpage *mpage, const struct man_node *
                                     ('\\' == start[0] && '-' == start[1]))                                      ('\\' == start[0] && '-' == start[1]))
                                         break;                                          break;
   
                                 putkey(mpage, start, TYPE_NAME | TYPE_Nm);                                  putkey(mpage, start, NAME_TITLE);
   
                                 if (' ' == byte) {                                  if (' ' == byte) {
                                         start += sz + 1;                                          start += sz + 1;
Line 1455  parse_man(struct mpage *mpage, const struct man_node *
Line 1461  parse_man(struct mpage *mpage, const struct man_node *
                         }                          }
   
                         if (start == title) {                          if (start == title) {
                                 putkey(mpage, start, TYPE_NAME | TYPE_Nm);                                  putkey(mpage, start, NAME_TITLE);
                                 free(title);                                  free(title);
                                 return;                                  return;
                         }                          }
Line 1632  parse_mdoc_Nm(struct mpage *mpage, const struct mdoc_n
Line 1638  parse_mdoc_Nm(struct mpage *mpage, const struct mdoc_n
 {  {
   
         if (SEC_NAME == n->sec)          if (SEC_NAME == n->sec)
                 putmdockey(mpage, n->child, TYPE_NAME | TYPE_Nm);                  putmdockey(mpage, n->child, NAME_TITLE);
         else if (SEC_SYNOPSIS == n->sec && MDOC_HEAD == n->type)          else if (SEC_SYNOPSIS == n->sec && MDOC_HEAD == n->type)
                 putmdockey(mpage, n->child, TYPE_Nm);                  putmdockey(mpage, n->child, NAME_SYN);
         return(0);          return(0);
 }  }
   
Line 1668  static void
Line 1674  static void
 putkeys(const struct mpage *mpage,  putkeys(const struct mpage *mpage,
         const char *cp, size_t sz, uint64_t v)          const char *cp, size_t sz, uint64_t v)
 {  {
           struct ohash    *htab;
         struct str      *s;          struct str      *s;
         const char      *end;          const char      *end;
         uint64_t         mask;  
         unsigned int     slot;          unsigned int     slot;
         int              i;          int              i;
   
         if (0 == sz)          if (0 == sz)
                 return;                  return;
   
         if (debug > 1) {          if (TYPE_Nm & v) {
                 for (i = 0, mask = 1;                  htab = &names;
                      i < mansearch_keymax;                  v &= name_mask;
                      i++, mask <<= 1)                  name_mask &= ~NAME_FIRST;
                         if (mask & v)                  if (debug > 1)
                                 break;                          say(mpage->mlinks->file,
                 say(mpage->mlinks->file, "Adding key %s=%*s",                              "Adding name %*s", sz, cp);
                     mansearch_keynames[i], sz, cp);          } else {
                   htab = &strings;
                   if (debug > 1)
                       for (i = 0; i < mansearch_keymax; i++)
                           if (1 << i & v)
                               say(mpage->mlinks->file,
                                   "Adding key %s=%*s",
                                   mansearch_keynames[i], sz, cp);
         }          }
   
         end = cp + sz;          end = cp + sz;
         slot = ohash_qlookupi(&strings, cp, &end);          slot = ohash_qlookupi(htab, cp, &end);
         s = ohash_find(&strings, slot);          s = ohash_find(htab, slot);
   
         if (NULL != s && mpage == s->mpage) {          if (NULL != s && mpage == s->mpage) {
                 s->mask |= v;                  s->mask |= v;
Line 1697  putkeys(const struct mpage *mpage,
Line 1710  putkeys(const struct mpage *mpage,
         } else if (NULL == s) {          } else if (NULL == s) {
                 s = mandoc_calloc(sizeof(struct str) + sz + 1, 1);                  s = mandoc_calloc(sizeof(struct str) + sz + 1, 1);
                 memcpy(s->key, cp, sz);                  memcpy(s->key, cp, sz);
                 ohash_insert(&strings, slot, s);                  ohash_insert(htab, slot, s);
         }          }
         s->mpage = mpage;          s->mpage = mpage;
         s->mask = v;          s->mask = v;
Line 1945  dbadd(struct mpage *mpage, struct mchars *mc)
Line 1958  dbadd(struct mpage *mpage, struct mchars *mc)
                 mlink = mlink->next;                  mlink = mlink->next;
         }          }
   
           for (key = ohash_first(&names, &slot); NULL != key;
                key = ohash_next(&names, &slot)) {
                   assert(key->mpage == mpage);
                   if (NULL == key->rendered)
                           render_key(mc, key);
                   i = 1;
                   SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, key->mask);
                   SQL_BIND_TEXT(stmts[STMT_INSERT_NAME], i, key->rendered);
                   SQL_BIND_INT64(stmts[STMT_INSERT_NAME], i, mpage->recno);
                   SQL_STEP(stmts[STMT_INSERT_NAME]);
                   sqlite3_reset(stmts[STMT_INSERT_NAME]);
                   if (key->rendered != key->key)
                           free(key->rendered);
                   free(key);
           }
         for (key = ohash_first(&strings, &slot); NULL != key;          for (key = ohash_first(&strings, &slot); NULL != key;
              key = ohash_next(&strings, &slot)) {               key = ohash_next(&strings, &slot)) {
                 assert(key->mpage == mpage);                  assert(key->mpage == mpage);
Line 2160  create_tables:
Line 2188  create_tables:
                 "ON DELETE CASCADE\n"                  "ON DELETE CASCADE\n"
               ");\n"                ");\n"
               "\n"                "\n"
                 "CREATE TABLE \"names\" (\n"
                 " \"bits\" INTEGER NOT NULL,\n"
                 " \"name\" TEXT NOT NULL,\n"
                 " \"pageid\" INTEGER NOT NULL REFERENCES mpages(id) "
                   "ON DELETE CASCADE\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"
Line 2185  prepare_statements:
Line 2220  prepare_statements:
         sql = "INSERT INTO mlinks "          sql = "INSERT INTO mlinks "
                 "(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 names "
                   "(bits,name,pageid) VALUES (?,?,?)";
           sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_NAME], NULL);
         sql = "INSERT INTO keys "          sql = "INSERT INTO keys "
                 "(bits,key,pageid) VALUES (?,?,?)";                  "(bits,key,pageid) VALUES (?,?,?)";
         sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_KEY], NULL);          sqlite3_prepare_v2(db, sql, -1, &stmts[STMT_INSERT_KEY], NULL);

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

CVSweb