about summary refs log tree commit homepage
path: root/lib/PublicInbox/xh_mset.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/PublicInbox/xh_mset.h')
-rw-r--r--lib/PublicInbox/xh_mset.h57
1 files changed, 7 insertions, 50 deletions
diff --git a/lib/PublicInbox/xh_mset.h b/lib/PublicInbox/xh_mset.h
index 4e97a284..db2692c9 100644
--- a/lib/PublicInbox/xh_mset.h
+++ b/lib/PublicInbox/xh_mset.h
@@ -3,49 +3,6 @@
 // This file is only intended to be included by xap_helper.h
 // it implements pieces used by WWW, IMAP and lei
 
-static void emit_doc_term(FILE *fp, const char *pfx, Xapian::Document *doc)
-{
-        Xapian::TermIterator cur = doc->termlist_begin();
-        Xapian::TermIterator end = doc->termlist_end();
-        size_t pfx_len = strlen(pfx);
-
-        for (cur.skip_to(pfx); cur != end; cur++) {
-                std::string tn = *cur;
-                if (!starts_with(&tn, pfx, pfx_len)) break;
-                fputc(0, fp);
-                fwrite(tn.data(), tn.size(), 1, fp);
-        }
-}
-
-static enum exc_iter mset_iter(const struct req *req, FILE *fp, off_t off,
-                                Xapian::MSetIterator *i)
-{
-        try {
-                fprintf(fp, "%llu", (unsigned long long)(*(*i))); // get_docid
-                if (req->emit_percent)
-                        fprintf(fp, "%c%d", 0, i->get_percent());
-                if (req->pfxc || req->emit_docdata) {
-                        Xapian::Document doc = i->get_document();
-                        for (int p = 0; p < req->pfxc; p++)
-                                emit_doc_term(fp, req->pfxv[p], &doc);
-                        if (req->emit_docdata) {
-                                std::string d = doc.get_data();
-                                fputc(0, fp);
-                                fwrite(d.data(), d.size(), 1, fp);
-                        }
-                }
-                fputc('\n', fp);
-        } catch (const Xapian::DatabaseModifiedError & e) {
-                req->srch->db->reopen();
-                if (fseeko(fp, off, SEEK_SET) < 0) EABORT("fseeko");
-                return ITER_RETRY;
-        } catch (const Xapian::DocNotFoundError & e) { // oh well...
-                warnx("doc not found: %s", e.get_description().c_str());
-                if (fseeko(fp, off, SEEK_SET) < 0) EABORT("fseeko");
-        }
-        return ITER_OK;
-}
-
 #ifndef WBUF_FLUSH_THRESHOLD
 #        define WBUF_FLUSH_THRESHOLD (BUFSIZ - 1000)
 #endif
@@ -63,7 +20,9 @@ static bool cmd_mset(struct req *req)
         Xapian::MSet mset = req->code_search ? commit_mset(req, qry_str) :
                                                 mail_mset(req, qry_str);
         fbuf_init(&wbuf);
-        fprintf(wbuf.fp, "mset.size=%llu\n", (unsigned long long)mset.size());
+        fprintf(wbuf.fp, "mset.size=%llu .get_matches_estimated=%llu\n",
+                (unsigned long long)mset.size(),
+                (unsigned long long)mset.get_matches_estimated());
         int fd = fileno(req->fp[0]);
         for (Xapian::MSetIterator i = mset.begin(); i != mset.end(); i++) {
                 off_t off = ftello(wbuf.fp);
@@ -82,12 +41,10 @@ static bool cmd_mset(struct req *req)
                         if (fseeko(wbuf.fp, 0, SEEK_SET)) EABORT("fseeko");
                         off = 0;
                 }
-                for (int t = 10; t > 0; --t)
-                        switch (mset_iter(req, wbuf.fp, off, &i)) {
-                        case ITER_OK: t = 0; break; // leave inner loop
-                        case ITER_RETRY: break; // continue for-loop
-                        case ITER_ABORT: return false; // error
-                        }
+                fprintf(wbuf.fp, "%llu" "%c" "%d" "%c" "%llu\n",
+                        (unsigned long long)(*i), // get_docid
+                        0, i.get_percent(),
+                        0, (unsigned long long)i.get_rank());
         }
         off_t off = ftello(wbuf.fp);
         if (off < 0) EABORT("ftello");