/// Determines whether a document has a label. bool XapianIndex::hasLabel(unsigned int docId, const string &name) const { bool foundLabel = false; XapianDatabase *pDatabase = XapianDatabaseFactory::getDatabase(m_databaseName, false); if (pDatabase == NULL) { cerr << "Bad index " << m_databaseName << endl; return false; } try { Xapian::WritableDatabase *pIndex = pDatabase->writeLock(); if (pIndex != NULL) { string term("XLABEL:"); // Get documents that have this label // FIXME: would it be faster to get the document's terms ? term += name; Xapian::PostingIterator postingIter = pIndex->postlist_begin(term); if (postingIter != pIndex->postlist_end(term)) { // Is this document in the list ? postingIter.skip_to(docId); if ((postingIter != pIndex->postlist_end(term)) && (docId == (*postingIter))) { foundLabel = true; } } } } catch (const Xapian::Error &error) { cerr << "Couldn't check document labels: " << error.get_msg() << endl; } catch (...) { cerr << "Couldn't check document labels, unknown exception occured" << endl; } pDatabase->unlock(); return foundLabel; }
/// Renames a label. bool XapianIndex::renameLabel(const string &name, const string &newName) { bool renamedLabel = false; XapianDatabase *pDatabase = XapianDatabaseFactory::getDatabase(m_databaseName, false); if (pDatabase == NULL) { cerr << "Bad index " << m_databaseName << endl; return false; } try { Xapian::WritableDatabase *pIndex = pDatabase->writeLock(); if (pIndex != NULL) { string term("XLABEL:"); // Get documents that have this label term += name; for (Xapian::PostingIterator postingIter = pIndex->postlist_begin(term); postingIter != pIndex->postlist_end(term); ++postingIter) { Xapian::docid docId = *postingIter; // Get the document Xapian::Document doc = pIndex->get_document(docId); // Remove the term doc.remove_term(term); // ...add the new one doc.add_term(limitTermLength(string("XLABEL:") + newName)); // ...and update the document pIndex->replace_document(docId, doc); } renamedLabel = true; } } catch (const Xapian::Error &error) { cerr << "Couldn't delete label: " << error.get_type() << ": " << error.get_msg() << endl; } catch (...) { cerr << "Couldn't delete label, unknown exception occured" << endl; } pDatabase->unlock(); return renamedLabel; }