use uniform code for Xapian exception catching + catch a few more, esp. databaseModified cases
This commit is contained in:
parent
32c0086419
commit
eb252d93e9
@ -1,5 +1,5 @@
|
|||||||
#ifndef lint
|
#ifndef lint
|
||||||
static char rcsid[] = "@(#$Id: rcldb.cpp,v 1.120 2007-07-10 09:23:28 dockes Exp $ (C) 2004 J.F.Dockes";
|
static char rcsid[] = "@(#$Id: rcldb.cpp,v 1.121 2007-07-12 08:34:51 dockes Exp $ (C) 2004 J.F.Dockes";
|
||||||
#endif
|
#endif
|
||||||
/*
|
/*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -525,6 +525,22 @@ Db::~Db()
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Generic Xapian exception catching code. We do this quite often,
|
||||||
|
// and I have no idea how to do this except for a macro
|
||||||
|
#define XCATCHERROR(MSG) \
|
||||||
|
catch (const Xapian::Error &e) { \
|
||||||
|
MSG = e.get_msg(); \
|
||||||
|
if (MSG.empty()) MSG = "Empty error message"; \
|
||||||
|
} catch (const string &s) { \
|
||||||
|
MSG = s; \
|
||||||
|
if (MSG.empty()) MSG = "Empty error message"; \
|
||||||
|
} catch (const char *s) { \
|
||||||
|
MSG = s; \
|
||||||
|
if (MSG.empty()) MSG = "Empty error message"; \
|
||||||
|
} catch (...) { \
|
||||||
|
MSG = "Caught unknown xapian exception"; \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Db::open(const string& dir, const string &stops, OpenMode mode, int qops)
|
bool Db::open(const string& dir, const string &stops, OpenMode mode, int qops)
|
||||||
{
|
{
|
||||||
@ -544,7 +560,7 @@ bool Db::open(const string& dir, const string &stops, OpenMode mode, int qops)
|
|||||||
if (!stops.empty())
|
if (!stops.empty())
|
||||||
m_stops.setFile(stops);
|
m_stops.setFile(stops);
|
||||||
|
|
||||||
const char *ermsg = "Unknown";
|
string ermsg;
|
||||||
try {
|
try {
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case DbUpd:
|
case DbUpd:
|
||||||
@ -581,15 +597,7 @@ bool Db::open(const string& dir, const string &stops, OpenMode mode, int qops)
|
|||||||
try {
|
try {
|
||||||
// Make this non-fatal
|
// Make this non-fatal
|
||||||
m_ndb->db.add_database(Xapian::Database(*it));
|
m_ndb->db.add_database(Xapian::Database(*it));
|
||||||
} catch (const Xapian::Error &e) {
|
} XCATCHERROR(aerr);
|
||||||
aerr = e.get_msg().c_str();
|
|
||||||
} catch (const string &s) {
|
|
||||||
aerr = s.c_str();
|
|
||||||
} catch (const char *s) {
|
|
||||||
aerr = s;
|
|
||||||
} catch (...) {
|
|
||||||
aerr = "Caught unknown exception";
|
|
||||||
}
|
|
||||||
if (!aerr.empty())
|
if (!aerr.empty())
|
||||||
LOGERR(("Db::Open: error while trying to add database "
|
LOGERR(("Db::Open: error while trying to add database "
|
||||||
"from [%s]: %s\n", it->c_str(), aerr.c_str()));
|
"from [%s]: %s\n", it->c_str(), aerr.c_str()));
|
||||||
@ -600,17 +608,9 @@ bool Db::open(const string& dir, const string &stops, OpenMode mode, int qops)
|
|||||||
m_ndb->m_isopen = true;
|
m_ndb->m_isopen = true;
|
||||||
m_basedir = dir;
|
m_basedir = dir;
|
||||||
return true;
|
return true;
|
||||||
} catch (const Xapian::Error &e) {
|
} XCATCHERROR(ermsg);
|
||||||
ermsg = e.get_msg().c_str();
|
|
||||||
} catch (const string &s) {
|
|
||||||
ermsg = s.c_str();
|
|
||||||
} catch (const char *s) {
|
|
||||||
ermsg = s;
|
|
||||||
} catch (...) {
|
|
||||||
ermsg = "Caught unknown exception";
|
|
||||||
}
|
|
||||||
LOGERR(("Db::open: exception while opening [%s]: %s\n",
|
LOGERR(("Db::open: exception while opening [%s]: %s\n",
|
||||||
dir.c_str(), ermsg));
|
dir.c_str(), ermsg.c_str()));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -634,7 +634,7 @@ bool Db::i_close(bool final)
|
|||||||
if (m_ndb->m_isopen == false && !final)
|
if (m_ndb->m_isopen == false && !final)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
const char *ermsg = "Unknown";
|
string ermsg;
|
||||||
try {
|
try {
|
||||||
bool w = m_ndb->m_iswritable;
|
bool w = m_ndb->m_iswritable;
|
||||||
if (w)
|
if (w)
|
||||||
@ -653,16 +653,8 @@ bool Db::i_close(bool final)
|
|||||||
}
|
}
|
||||||
LOGERR(("Rcl::Db::close(): cant recreate db object\n"));
|
LOGERR(("Rcl::Db::close(): cant recreate db object\n"));
|
||||||
return false;
|
return false;
|
||||||
} catch (const Xapian::Error &e) {
|
} XCATCHERROR(ermsg);
|
||||||
ermsg = e.get_msg().c_str();
|
LOGERR(("Db:close: exception while deleting db: %s\n", ermsg.c_str()));
|
||||||
} catch (const string &s) {
|
|
||||||
ermsg = s.c_str();
|
|
||||||
} catch (const char *s) {
|
|
||||||
ermsg = s;
|
|
||||||
} catch (...) {
|
|
||||||
ermsg = "Caught unknown exception";
|
|
||||||
}
|
|
||||||
LOGERR(("Db:close: exception while deleting db: %s\n", ermsg));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -680,11 +672,22 @@ bool Db::reOpen()
|
|||||||
|
|
||||||
int Db::docCnt()
|
int Db::docCnt()
|
||||||
{
|
{
|
||||||
|
int res = -1;
|
||||||
|
string ermsg;
|
||||||
if (m_ndb && m_ndb->m_isopen) {
|
if (m_ndb && m_ndb->m_isopen) {
|
||||||
return m_ndb->m_iswritable ? m_ndb->wdb.get_doccount() :
|
try {
|
||||||
m_ndb->db.get_doccount();
|
res = m_ndb->m_iswritable ? m_ndb->wdb.get_doccount() :
|
||||||
|
m_ndb->db.get_doccount();
|
||||||
|
} catch (const Xapian::DatabaseModifiedError &e) {
|
||||||
|
LOGDEB(("Db::docCnt: got modified error. reopen/retry\n"));
|
||||||
|
reOpen();
|
||||||
|
res = m_ndb->m_iswritable ? m_ndb->wdb.get_doccount() :
|
||||||
|
m_ndb->db.get_doccount();
|
||||||
|
} XCATCHERROR(ermsg);
|
||||||
|
if (!ermsg.empty())
|
||||||
|
LOGERR(("Db::docCnt: got error: %s\n", ermsg.c_str()));
|
||||||
}
|
}
|
||||||
return -1;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Db::addQueryDb(const string &dir)
|
bool Db::addQueryDb(const string &dir)
|
||||||
@ -718,21 +721,14 @@ bool Db::rmQueryDb(const string &dir)
|
|||||||
}
|
}
|
||||||
return reOpen();
|
return reOpen();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Db::testDbDir(const string &dir)
|
bool Db::testDbDir(const string &dir)
|
||||||
{
|
{
|
||||||
string aerr;
|
string aerr;
|
||||||
LOGDEB(("Db::testDbDir: [%s]\n", dir.c_str()));
|
LOGDEB(("Db::testDbDir: [%s]\n", dir.c_str()));
|
||||||
try {
|
try {
|
||||||
Xapian::Database db(dir);
|
Xapian::Database db(dir);
|
||||||
} catch (const Xapian::Error &e) {
|
} XCATCHERROR(aerr);
|
||||||
aerr = e.get_msg().c_str();
|
|
||||||
} catch (const string &s) {
|
|
||||||
aerr = s.c_str();
|
|
||||||
} catch (const char *s) {
|
|
||||||
aerr = s;
|
|
||||||
} catch (...) {
|
|
||||||
aerr = "Caught unknown exception";
|
|
||||||
}
|
|
||||||
if (!aerr.empty()) {
|
if (!aerr.empty()) {
|
||||||
LOGERR(("Db::Open: error while trying to open database "
|
LOGERR(("Db::Open: error while trying to open database "
|
||||||
"from [%s]: %s\n", dir.c_str(), aerr.c_str()));
|
"from [%s]: %s\n", dir.c_str(), aerr.c_str()));
|
||||||
@ -823,7 +819,7 @@ bool mySplitterCB::takeword(const std::string &term, int pos, int, int)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char *ermsg;
|
string ermsg;
|
||||||
try {
|
try {
|
||||||
if (stops.hasStops() && stops.isStop(term)) {
|
if (stops.hasStops() && stops.isStop(term)) {
|
||||||
LOGDEB1(("Db: takeword [%s] in stop list\n", term.c_str()));
|
LOGDEB1(("Db: takeword [%s] in stop list\n", term.c_str()));
|
||||||
@ -839,12 +835,8 @@ bool mySplitterCB::takeword(const std::string &term, int pos, int, int)
|
|||||||
doc.add_posting(prefix + term, pos, 1);
|
doc.add_posting(prefix + term, pos, 1);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} catch (const Xapian::Error &e) {
|
} XCATCHERROR(ermsg);
|
||||||
ermsg = e.get_msg().c_str();
|
LOGERR(("Db: xapian add_posting error %s\n", ermsg.c_str()));
|
||||||
} catch (...) {
|
|
||||||
ermsg= "Unknown error";
|
|
||||||
}
|
|
||||||
LOGERR(("Db: xapian add_posting error %s\n", ermsg));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1102,13 +1094,7 @@ bool Db::add(const string &fn, const Doc &idoc, const struct stat *stp)
|
|||||||
LOGDEB(("Db::add: docid %d added [%s , %s]\n", did, fnc,
|
LOGDEB(("Db::add: docid %d added [%s , %s]\n", did, fnc,
|
||||||
doc.ipath.c_str()));
|
doc.ipath.c_str()));
|
||||||
}
|
}
|
||||||
} catch (const Xapian::Error &e) {
|
} XCATCHERROR(ermsg);
|
||||||
ermsg = e.get_msg();
|
|
||||||
if (ermsg.empty())
|
|
||||||
ermsg = "Empty error message";
|
|
||||||
} catch (...) {
|
|
||||||
ermsg= "Unknown error";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ermsg.empty()) {
|
if (!ermsg.empty()) {
|
||||||
LOGERR(("Db::add: replace_document failed: %s\n", ermsg.c_str()));
|
LOGERR(("Db::add: replace_document failed: %s\n", ermsg.c_str()));
|
||||||
@ -1118,13 +1104,7 @@ bool Db::add(const string &fn, const Doc &idoc, const struct stat *stp)
|
|||||||
m_ndb->wdb.add_document(newdocument);
|
m_ndb->wdb.add_document(newdocument);
|
||||||
LOGDEB(("Db::add: %s added (failed re-seek for duplicate)\n",
|
LOGDEB(("Db::add: %s added (failed re-seek for duplicate)\n",
|
||||||
fnc));
|
fnc));
|
||||||
} catch (const Xapian::Error &e) {
|
} XCATCHERROR(ermsg);
|
||||||
ermsg = e.get_msg();
|
|
||||||
if (ermsg.empty())
|
|
||||||
ermsg = "Empty error message";
|
|
||||||
} catch (...) {
|
|
||||||
ermsg= "Unknown error";
|
|
||||||
}
|
|
||||||
if (!ermsg.empty()) {
|
if (!ermsg.empty()) {
|
||||||
LOGERR(("Db::add: add_document failed: %s\n", ermsg.c_str()));
|
LOGERR(("Db::add: add_document failed: %s\n", ermsg.c_str()));
|
||||||
return false;
|
return false;
|
||||||
@ -1139,13 +1119,7 @@ bool Db::add(const string &fn, const Doc &idoc, const struct stat *stp)
|
|||||||
LOGDEB(("Db::add: text size >= %d Mb, flushing\n", m_flushMb));
|
LOGDEB(("Db::add: text size >= %d Mb, flushing\n", m_flushMb));
|
||||||
try {
|
try {
|
||||||
m_ndb->wdb.flush();
|
m_ndb->wdb.flush();
|
||||||
} catch (const Xapian::Error &e) {
|
} XCATCHERROR(ermsg);
|
||||||
ermsg = e.get_msg();
|
|
||||||
if (ermsg.empty())
|
|
||||||
ermsg = "Empty error message";
|
|
||||||
} catch (...) {
|
|
||||||
ermsg= "Unknown error";
|
|
||||||
}
|
|
||||||
if (!ermsg.empty()) {
|
if (!ermsg.empty()) {
|
||||||
LOGERR(("Db::add: flush() failed: %s\n", ermsg.c_str()));
|
LOGERR(("Db::add: flush() failed: %s\n", ermsg.c_str()));
|
||||||
return false;
|
return false;
|
||||||
@ -1245,13 +1219,7 @@ bool Db::needUpdate(const string &filename, const struct stat *stp)
|
|||||||
} catch (const Xapian::DatabaseModifiedError &e) {
|
} catch (const Xapian::DatabaseModifiedError &e) {
|
||||||
LOGDEB(("Db::needUpdate: got modified error. reopen/retry\n"));
|
LOGDEB(("Db::needUpdate: got modified error. reopen/retry\n"));
|
||||||
reOpen();
|
reOpen();
|
||||||
} catch (const Xapian::Error &e) {
|
} XCATCHERROR(ermsg);
|
||||||
ermsg = e.get_msg();
|
|
||||||
break;
|
|
||||||
} catch (...) {
|
|
||||||
ermsg= "Unknown error";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
LOGERR(("Db::needUpdate: error while checking existence: %s\n",
|
LOGERR(("Db::needUpdate: error while checking existence: %s\n",
|
||||||
ermsg.c_str()));
|
ermsg.c_str()));
|
||||||
@ -1293,7 +1261,7 @@ bool Db::createStemDb(const string& lang)
|
|||||||
if (m_ndb == 0 || m_ndb->m_isopen == false)
|
if (m_ndb == 0 || m_ndb->m_isopen == false)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return StemDb:: createDb(m_ndb->m_iswritable ? m_ndb->wdb : m_ndb->db,
|
return StemDb::createDb(m_ndb->m_iswritable ? m_ndb->wdb : m_ndb->db,
|
||||||
m_basedir, lang);
|
m_basedir, lang);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1361,7 +1329,7 @@ bool Db::purgeFile(const string &fn)
|
|||||||
string hash;
|
string hash;
|
||||||
pathHash(fn, hash, PATHHASHLEN);
|
pathHash(fn, hash, PATHHASHLEN);
|
||||||
string pterm = "P" + hash;
|
string pterm = "P" + hash;
|
||||||
const char *ermsg = "";
|
string ermsg;
|
||||||
try {
|
try {
|
||||||
Xapian::PostingIterator docid = db.postlist_begin(pterm);
|
Xapian::PostingIterator docid = db.postlist_begin(pterm);
|
||||||
if (docid == db.postlist_end(pterm))
|
if (docid == db.postlist_end(pterm))
|
||||||
@ -1377,17 +1345,9 @@ bool Db::purgeFile(const string &fn)
|
|||||||
db.delete_document(*it);
|
db.delete_document(*it);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
} catch (const Xapian::Error &e) {
|
} XCATCHERROR(ermsg);
|
||||||
ermsg = e.get_msg().c_str();
|
if (!ermsg.empty()) {
|
||||||
} catch (const string &s) {
|
LOGERR(("Db::purgeFile: %s\n", ermsg.c_str()));
|
||||||
ermsg = s.c_str();
|
|
||||||
} catch (const char *s) {
|
|
||||||
ermsg = s;
|
|
||||||
} catch (...) {
|
|
||||||
ermsg = "Caught unknown exception";
|
|
||||||
}
|
|
||||||
if (*ermsg) {
|
|
||||||
LOGERR(("Db::purgeFile: %s\n", ermsg));
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1412,22 +1372,30 @@ bool Db::filenameWildExp(const string& fnexp, list<string>& names)
|
|||||||
LOGDEB((" pattern: [%s]\n", pattern.c_str()));
|
LOGDEB((" pattern: [%s]\n", pattern.c_str()));
|
||||||
|
|
||||||
// Match pattern against all file names in the db
|
// Match pattern against all file names in the db
|
||||||
Xapian::TermIterator it = m_ndb->db.allterms_begin();
|
string ermsg;
|
||||||
it.skip_to("XSFN");
|
try {
|
||||||
for (;it != m_ndb->db.allterms_end(); it++) {
|
Xapian::TermIterator it = m_ndb->db.allterms_begin();
|
||||||
if ((*it).find("XSFN") != 0)
|
it.skip_to("XSFN");
|
||||||
break;
|
for (;it != m_ndb->db.allterms_end(); it++) {
|
||||||
string fn = (*it).substr(4);
|
if ((*it).find("XSFN") != 0)
|
||||||
LOGDEB2(("Matching [%s] and [%s]\n", pattern.c_str(), fn.c_str()));
|
break;
|
||||||
if (fnmatch(pattern.c_str(), fn.c_str(), 0) != FNM_NOMATCH) {
|
string fn = (*it).substr(4);
|
||||||
names.push_back((*it).c_str());
|
LOGDEB2(("Matching [%s] and [%s]\n", pattern.c_str(), fn.c_str()));
|
||||||
}
|
if (fnmatch(pattern.c_str(), fn.c_str(), 0) != FNM_NOMATCH) {
|
||||||
// Limit the match count
|
names.push_back((*it).c_str());
|
||||||
if (names.size() > 1000) {
|
}
|
||||||
LOGERR(("Db::filenameWildExp: too many matched file names\n"));
|
// Limit the match count
|
||||||
break;
|
if (names.size() > 1000) {
|
||||||
|
LOGERR(("Db::filenameWildExp: too many matched file names\n"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} XCATCHERROR(ermsg);
|
||||||
|
if (!ermsg.empty()) {
|
||||||
|
LOGERR(("filenameWildExp: xapian error: %s\n", ermsg.c_str()));
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (names.empty()) {
|
if (names.empty()) {
|
||||||
// Build an impossible query: we know its impossible because we
|
// Build an impossible query: we know its impossible because we
|
||||||
// control the prefixes!
|
// control the prefixes!
|
||||||
@ -1459,12 +1427,21 @@ bool Db::setQuery(RefCntr<SearchData> sdata, int opts,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
m_ndb->query = xq;
|
m_ndb->query = xq;
|
||||||
delete m_ndb->enquire;
|
string ermsg;
|
||||||
m_ndb->enquire = new Xapian::Enquire(m_ndb->db);
|
string d;
|
||||||
m_ndb->enquire->set_query(m_ndb->query);
|
try {
|
||||||
m_ndb->mset = Xapian::MSet();
|
delete m_ndb->enquire;
|
||||||
// Get the query description and trim the "Xapian::Query"
|
m_ndb->enquire = new Xapian::Enquire(m_ndb->db);
|
||||||
string d = m_ndb->query.get_description();
|
m_ndb->enquire->set_query(m_ndb->query);
|
||||||
|
m_ndb->mset = Xapian::MSet();
|
||||||
|
// Get the query description and trim the "Xapian::Query"
|
||||||
|
d = m_ndb->query.get_description();
|
||||||
|
} XCATCHERROR(ermsg);
|
||||||
|
if (!ermsg.empty()) {
|
||||||
|
LOGDEB(("Db::SetQuery: xapian error %s\n", ermsg.c_str()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (d.find("Xapian::Query") == 0)
|
if (d.find("Xapian::Query") == 0)
|
||||||
d.erase(0, strlen("Xapian::Query"));
|
d.erase(0, strlen("Xapian::Query"));
|
||||||
sdata->setDescription(d);
|
sdata->setDescription(d);
|
||||||
@ -1620,32 +1597,52 @@ TermIter *Db::termWalkOpen()
|
|||||||
TermIter *tit = new TermIter;
|
TermIter *tit = new TermIter;
|
||||||
if (tit) {
|
if (tit) {
|
||||||
tit->db = m_ndb->m_iswritable ? m_ndb->wdb: m_ndb->db;
|
tit->db = m_ndb->m_iswritable ? m_ndb->wdb: m_ndb->db;
|
||||||
tit->it = tit->db.allterms_begin();
|
string ermsg;
|
||||||
|
try {
|
||||||
|
tit->it = tit->db.allterms_begin();
|
||||||
|
} XCATCHERROR(ermsg);
|
||||||
|
if (!ermsg.empty()) {
|
||||||
|
LOGERR(("Db::termWalkOpen: xapian error: %s\n", ermsg.c_str()));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return tit;
|
return tit;
|
||||||
}
|
}
|
||||||
bool Db::termWalkNext(TermIter *tit, string &term)
|
bool Db::termWalkNext(TermIter *tit, string &term)
|
||||||
{
|
{
|
||||||
|
string ermsg;
|
||||||
if (tit && tit->it != tit->db.allterms_end()) {
|
try {
|
||||||
term = *(tit->it)++;
|
if (tit && tit->it != tit->db.allterms_end()) {
|
||||||
return true;
|
term = *(tit->it)++;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} XCATCHERROR(ermsg);
|
||||||
|
if (!ermsg.empty()) {
|
||||||
|
LOGERR(("Db::termWalkOpen: xapian error: %s\n", ermsg.c_str()));
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
void Db::termWalkClose(TermIter *tit)
|
void Db::termWalkClose(TermIter *tit)
|
||||||
{
|
{
|
||||||
delete tit;
|
try {
|
||||||
|
delete tit;
|
||||||
|
} catch (...) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Db::termExists(const string& word)
|
bool Db::termExists(const string& word)
|
||||||
{
|
{
|
||||||
if (!m_ndb || !m_ndb->m_isopen)
|
if (!m_ndb || !m_ndb->m_isopen)
|
||||||
return 0;
|
return 0;
|
||||||
Xapian::Database db = m_ndb->m_iswritable ? m_ndb->wdb: m_ndb->db;
|
Xapian::Database db = m_ndb->m_iswritable ? m_ndb->wdb: m_ndb->db;
|
||||||
if (!db.term_exists(word))
|
string ermsg;
|
||||||
|
try {
|
||||||
|
if (!db.term_exists(word))
|
||||||
|
return false;
|
||||||
|
} XCATCHERROR(ermsg);
|
||||||
|
if (!ermsg.empty()) {
|
||||||
|
LOGERR(("Db::termWalkOpen: xapian error: %s\n", ermsg.c_str()));
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1669,12 +1666,15 @@ bool Db::getQueryTerms(list<string>& terms)
|
|||||||
|
|
||||||
terms.clear();
|
terms.clear();
|
||||||
Xapian::TermIterator it;
|
Xapian::TermIterator it;
|
||||||
|
string ermsg;
|
||||||
try {
|
try {
|
||||||
for (it = m_ndb->query.get_terms_begin();
|
for (it = m_ndb->query.get_terms_begin();
|
||||||
it != m_ndb->query.get_terms_end(); it++) {
|
it != m_ndb->query.get_terms_end(); it++) {
|
||||||
terms.push_back(*it);
|
terms.push_back(*it);
|
||||||
}
|
}
|
||||||
} catch (...) {
|
} XCATCHERROR(ermsg);
|
||||||
|
if (!ermsg.empty()) {
|
||||||
|
LOGERR(("getQueryTerms: xapian error: %s\n", ermsg.c_str()));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -1690,14 +1690,18 @@ bool Db::getMatchTerms(const Doc& doc, list<string>& terms)
|
|||||||
terms.clear();
|
terms.clear();
|
||||||
Xapian::TermIterator it;
|
Xapian::TermIterator it;
|
||||||
Xapian::docid id = Xapian::docid(doc.xdocid);
|
Xapian::docid id = Xapian::docid(doc.xdocid);
|
||||||
|
string ermsg;
|
||||||
try {
|
try {
|
||||||
for (it=m_ndb->enquire->get_matching_terms_begin(id);
|
for (it=m_ndb->enquire->get_matching_terms_begin(id);
|
||||||
it != m_ndb->enquire->get_matching_terms_end(id); it++) {
|
it != m_ndb->enquire->get_matching_terms_end(id); it++) {
|
||||||
terms.push_back(*it);
|
terms.push_back(*it);
|
||||||
}
|
}
|
||||||
} catch (...) {
|
} XCATCHERROR(ermsg);
|
||||||
|
if (!ermsg.empty()) {
|
||||||
|
LOGERR(("getQueryTerms: xapian error: %s\n", ermsg.c_str()));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1710,20 +1714,24 @@ int Db::getResCnt()
|
|||||||
LOGERR(("Db::getResCnt: no query opened\n"));
|
LOGERR(("Db::getResCnt: no query opened\n"));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
string ermsg;
|
||||||
if (m_ndb->mset.size() <= 0) {
|
if (m_ndb->mset.size() <= 0) {
|
||||||
try {
|
try {
|
||||||
m_ndb->mset = m_ndb->enquire->get_mset(0, qquantum);
|
m_ndb->mset = m_ndb->enquire->get_mset(0, qquantum);
|
||||||
} catch (const Xapian::DatabaseModifiedError &error) {
|
} catch (const Xapian::DatabaseModifiedError &error) {
|
||||||
m_ndb->db.reopen();
|
m_ndb->db.reopen();
|
||||||
m_ndb->mset = m_ndb->enquire->get_mset(0, qquantum);
|
m_ndb->mset = m_ndb->enquire->get_mset(0, qquantum);
|
||||||
} catch (const Xapian::Error & error) {
|
} XCATCHERROR(ermsg);
|
||||||
LOGERR(("enquire->get_mset: exception: %s\n",
|
if (!ermsg.empty()) {
|
||||||
error.get_msg().c_str()));
|
LOGERR(("enquire->get_mset: exception: %s\n", ermsg.c_str()));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
int ret = -1;
|
||||||
return m_ndb->mset.get_matches_lower_bound();
|
try {
|
||||||
|
ret = m_ndb->mset.get_matches_lower_bound();
|
||||||
|
} catch (...) {}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1861,7 +1869,7 @@ bool Db::getDoc(const string &fn, const string &ipath, Doc &doc, int *pc)
|
|||||||
string hash;
|
string hash;
|
||||||
pathHash(fn, hash, PATHHASHLEN);
|
pathHash(fn, hash, PATHHASHLEN);
|
||||||
string pqterm = ipath.empty() ? "P" + hash : "Q" + hash + "|" + ipath;
|
string pqterm = ipath.empty() ? "P" + hash : "Q" + hash + "|" + ipath;
|
||||||
const char *ermsg = "";
|
string ermsg;
|
||||||
try {
|
try {
|
||||||
if (!m_ndb->db.term_exists(pqterm)) {
|
if (!m_ndb->db.term_exists(pqterm)) {
|
||||||
// Document found in history no longer in the database.
|
// Document found in history no longer in the database.
|
||||||
@ -1878,17 +1886,9 @@ bool Db::getDoc(const string &fn, const string &ipath, Doc &doc, int *pc)
|
|||||||
string data = xdoc.get_data();
|
string data = xdoc.get_data();
|
||||||
list<string> terms;
|
list<string> terms;
|
||||||
return m_ndb->dbDataToRclDoc(*docid, data, doc);
|
return m_ndb->dbDataToRclDoc(*docid, data, doc);
|
||||||
} catch (const Xapian::Error &e) {
|
} XCATCHERROR(ermsg);
|
||||||
ermsg = e.get_msg().c_str();
|
if (!ermsg.empty()) {
|
||||||
} catch (const string &s) {
|
LOGERR(("Db::getDoc: %s\n", ermsg.c_str()));
|
||||||
ermsg = s.c_str();
|
|
||||||
} catch (const char *s) {
|
|
||||||
ermsg = s;
|
|
||||||
} catch (...) {
|
|
||||||
ermsg = "Caught unknown exception";
|
|
||||||
}
|
|
||||||
if (*ermsg) {
|
|
||||||
LOGERR(("Db::getDoc: %s\n", ermsg));
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1900,20 +1900,34 @@ list<string> Db::expand(const Doc &doc)
|
|||||||
LOGERR(("Db::expand: no query opened\n"));
|
LOGERR(("Db::expand: no query opened\n"));
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
Xapian::RSet rset;
|
string ermsg;
|
||||||
rset.add_document(Xapian::docid(doc.xdocid));
|
for (int tries = 0; tries < 2; tries++) {
|
||||||
// We don't exclude the original query terms.
|
try {
|
||||||
Xapian::ESet eset = m_ndb->enquire->get_eset(20, rset, false);
|
Xapian::RSet rset;
|
||||||
LOGDEB(("ESet terms:\n"));
|
rset.add_document(Xapian::docid(doc.xdocid));
|
||||||
// We filter out the special terms
|
// We don't exclude the original query terms.
|
||||||
for (Xapian::ESetIterator it = eset.begin(); it != eset.end(); it++) {
|
Xapian::ESet eset = m_ndb->enquire->get_eset(20, rset, false);
|
||||||
LOGDEB((" [%s]\n", (*it).c_str()));
|
LOGDEB(("ESet terms:\n"));
|
||||||
if ((*it).empty() || ((*it).at(0)>='A' && (*it).at(0)<='Z'))
|
// We filter out the special terms
|
||||||
|
for (Xapian::ESetIterator it = eset.begin();
|
||||||
|
it != eset.end(); it++) {
|
||||||
|
LOGDEB((" [%s]\n", (*it).c_str()));
|
||||||
|
if ((*it).empty() || ((*it).at(0)>='A' && (*it).at(0)<='Z'))
|
||||||
|
continue;
|
||||||
|
res.push_back(*it);
|
||||||
|
if (res.size() >= 10)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} catch (const Xapian::DatabaseModifiedError &error) {
|
||||||
continue;
|
continue;
|
||||||
res.push_back(*it);
|
} XCATCHERROR(ermsg);
|
||||||
if (res.size() >= 10)
|
if (!ermsg.empty()) {
|
||||||
break;
|
LOGERR(("Db::expand: xapian error %s\n", ermsg.c_str()));
|
||||||
|
res.clear();
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user