restructured needUpdate()
This commit is contained in:
parent
185c994fa5
commit
e1b746bcfd
@ -1698,11 +1698,9 @@ bool Db::doFlush()
|
|||||||
bool Db::needUpdate(const string &udi, const string& sig, bool *existed)
|
bool Db::needUpdate(const string &udi, const string& sig, bool *existed)
|
||||||
{
|
{
|
||||||
if (m_ndb == 0)
|
if (m_ndb == 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// If we are doing an in place or full reset, no need to
|
// If we are doing an in place or full reset, no need to test.
|
||||||
// test. Note that there is no need to update the existence map
|
|
||||||
// either, it will be done when updating the index
|
|
||||||
if (o_inPlaceReset || m_mode == DbTrunc) {
|
if (o_inPlaceReset || m_mode == DbTrunc) {
|
||||||
// For in place reset, pretend the doc existed, to enable subdoc purge
|
// For in place reset, pretend the doc existed, to enable subdoc purge
|
||||||
if (existed)
|
if (existed)
|
||||||
@ -1710,6 +1708,9 @@ bool Db::needUpdate(const string &udi, const string& sig, bool *existed)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (existed)
|
||||||
|
*existed = false;
|
||||||
|
|
||||||
string uniterm = make_uniterm(udi);
|
string uniterm = make_uniterm(udi);
|
||||||
string ermsg;
|
string ermsg;
|
||||||
|
|
||||||
@ -1720,72 +1721,76 @@ bool Db::needUpdate(const string &udi, const string& sig, bool *existed)
|
|||||||
// anyway
|
// anyway
|
||||||
PTMutexLocker lock(m_ndb->m_mutex);
|
PTMutexLocker lock(m_ndb->m_mutex);
|
||||||
#endif
|
#endif
|
||||||
// We look up the document indexed by the uniterm. This is either
|
|
||||||
// the actual document file, or, for a multi-document file, the
|
|
||||||
// pseudo-doc we create to stand for the file itself.
|
|
||||||
|
|
||||||
// We try twice in case database needs to be reopened.
|
// Try to find the document indexed by the uniterm.
|
||||||
for (int tries = 0; tries < 2; tries++) {
|
Xapian::PostingIterator docid;
|
||||||
try {
|
XAPTRY(docid = m_ndb->xrdb.postlist_begin(uniterm), m_ndb->xrdb, m_reason);
|
||||||
// Get the doc or pseudo-doc
|
if (!m_reason.empty()) {
|
||||||
Xapian::PostingIterator docid = m_ndb->xrdb.postlist_begin(uniterm);
|
LOGERR(("Db::needUpdate: xapian::postlist_begin failed: %s\n",
|
||||||
if (docid == m_ndb->xrdb.postlist_end(uniterm)) {
|
m_reason.c_str()));
|
||||||
// If no document exist with this path, we do need update
|
return false;
|
||||||
LOGDEB(("Db::needUpdate:yes (new): [%s]\n", uniterm.c_str()));
|
|
||||||
if (existed)
|
|
||||||
*existed = false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
Xapian::Document doc = m_ndb->xrdb.get_document(*docid);
|
|
||||||
if (existed)
|
|
||||||
*existed = true;
|
|
||||||
|
|
||||||
// Retrieve old file/doc signature from value
|
|
||||||
string osig = doc.get_value(VALUE_SIG);
|
|
||||||
LOGDEB2(("Db::needUpdate: oldsig [%s] new [%s]\n",
|
|
||||||
osig.c_str(), sig.c_str()));
|
|
||||||
// Compare new/old sig
|
|
||||||
if (sig != osig) {
|
|
||||||
LOGDEB(("Db::needUpdate:yes: olsig [%s] new [%s] [%s]\n",
|
|
||||||
osig.c_str(), sig.c_str(), uniterm.c_str()));
|
|
||||||
// Db is not up to date. Let's index the file
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
LOGDEB(("Db::needUpdate:no: [%s]\n", uniterm.c_str()));
|
|
||||||
|
|
||||||
// Up to date.
|
|
||||||
|
|
||||||
// Set the uptodate flag for doc / pseudo doc
|
|
||||||
if (m_mode != DbRO) {
|
|
||||||
updated[*docid] = true;
|
|
||||||
|
|
||||||
// Set the existence flag for all the subdocs (if any)
|
|
||||||
vector<Xapian::docid> docids;
|
|
||||||
if (!m_ndb->subDocs(udi, 0, docids)) {
|
|
||||||
LOGERR(("Rcl::Db::needUpdate: can't get subdocs\n"));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
for (vector<Xapian::docid>::iterator it = docids.begin();
|
|
||||||
it != docids.end(); it++) {
|
|
||||||
if (*it < updated.size()) {
|
|
||||||
LOGDEB2(("Db::needUpdate: docid %d set\n", *it));
|
|
||||||
updated[*it] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
} catch (const Xapian::DatabaseModifiedError &e) {
|
|
||||||
LOGDEB(("Db::needUpdate: got modified error. reopen/retry\n"));
|
|
||||||
m_reason = e.get_msg();
|
|
||||||
m_ndb->xrdb.reopen();
|
|
||||||
continue;
|
|
||||||
} XCATCHERROR(m_reason);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
LOGERR(("Db::needUpdate: error while checking existence: %s\n",
|
if (docid == m_ndb->xrdb.postlist_end(uniterm)) {
|
||||||
m_reason.c_str()));
|
// No document exists with this path: we do need update
|
||||||
return true;
|
LOGDEB(("Db::needUpdate:yes (new): [%s]\n", uniterm.c_str()));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
Xapian::Document xdoc;
|
||||||
|
XAPTRY(xdoc = m_ndb->xrdb.get_document(*docid), m_ndb->xrdb, m_reason);
|
||||||
|
if (!m_reason.empty()) {
|
||||||
|
LOGERR(("Db::needUpdate: get_document error: %s\n", m_reason.c_str()));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (existed)
|
||||||
|
*existed = true;
|
||||||
|
|
||||||
|
// Retrieve old file/doc signature from value
|
||||||
|
string osig;
|
||||||
|
XAPTRY(osig = xdoc.get_value(VALUE_SIG), m_ndb->xrdb, m_reason);
|
||||||
|
if (!m_reason.empty()) {
|
||||||
|
LOGERR(("Db::needUpdate: get_value error: %s\n", m_reason.c_str()));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
LOGDEB2(("Db::needUpdate: oldsig [%s] new [%s]\n",
|
||||||
|
osig.c_str(), sig.c_str()));
|
||||||
|
// Compare new/old sig
|
||||||
|
if (sig != osig) {
|
||||||
|
LOGDEB(("Db::needUpdate:yes: olsig [%s] new [%s] [%s]\n",
|
||||||
|
osig.c_str(), sig.c_str(), uniterm.c_str()));
|
||||||
|
// Db is not up to date. Let's index the file
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Up to date.
|
||||||
|
LOGDEB(("Db::needUpdate:no: [%s]\n", uniterm.c_str()));
|
||||||
|
|
||||||
|
if (m_mode != DbRO) {
|
||||||
|
// Set the up to date flag for the document and its subdocs
|
||||||
|
if (*docid >= updated.size()) {
|
||||||
|
LOGERR(("needUpdate: existing docid beyond "
|
||||||
|
"updated.size(). Udi [%s], docid %u, "
|
||||||
|
"updated.size() %u\n", udi.c_str(),
|
||||||
|
unsigned(*docid), (unsigned)updated.size()));
|
||||||
|
} else {
|
||||||
|
updated[*docid] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the existence flag for all the subdocs (if any)
|
||||||
|
vector<Xapian::docid> docids;
|
||||||
|
if (!m_ndb->subDocs(udi, 0, docids)) {
|
||||||
|
LOGERR(("Rcl::Db::needUpdate: can't get subdocs\n"));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (vector<Xapian::docid>::iterator it = docids.begin();
|
||||||
|
it != docids.end(); it++) {
|
||||||
|
if (*it < updated.size()) {
|
||||||
|
LOGDEB2(("Db::needUpdate: docid %d set\n", *it));
|
||||||
|
updated[*it] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return existing stem db languages
|
// Return existing stem db languages
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user