本文整理汇总了C++中xapian::WritableDatabase类的典型用法代码示例。如果您正苦于以下问题:C++ WritableDatabase类的具体用法?C++ WritableDatabase怎么用?C++ WritableDatabase使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了WritableDatabase类的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: flush
/// Flushes recent changes to the disk.
bool XapianIndex::flush(void)
{
bool flushed = false;
XapianDatabase *pDatabase = XapianDatabaseFactory::getDatabase(m_databaseName, false);
if (pDatabase == NULL)
{
cerr << "Bad index " << m_databaseName << endl;
return false;
}
try
{
#ifdef DEBUG
cout << "XapianIndex::flush: called" << endl;
#endif
Xapian::WritableDatabase *pIndex = pDatabase->writeLock();
if (pIndex != NULL)
{
pIndex->flush();
flushed = true;
}
}
catch (const Xapian::Error &error)
{
cerr << "Couldn't flush database: " << error.get_type() << ": " << error.get_msg() << endl;
}
catch (...)
{
cerr << "Couldn't flush database, unknown exception occured" << endl;
}
pDatabase->unlock();
return flushed;
}
示例2: renameLabel
/// 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;
}
示例3: updateDocumentInfo
/// Updates a document's properties.
bool XapianIndex::updateDocumentInfo(unsigned int docId, const DocumentInfo &docInfo)
{
bool updated = false;
if (docId == 0)
{
return 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)
{
Xapian::Document doc = pIndex->get_document(docId);
Xapian::termcount termPos = 0;
// Update the document data with the current language
removeCommonTerms(doc);
m_stemLanguage = Languages::toEnglish(docInfo.getLanguage());
addCommonTerms(docInfo, doc, termPos);
setDocumentData(docInfo, doc, m_stemLanguage);
pIndex->replace_document(docId, doc);
updated = true;
}
}
catch (const Xapian::Error &error)
{
cerr << "Couldn't update document properties: " << error.get_type() << ": " << error.get_msg() << endl;
}
catch (...)
{
cerr << "Couldn't update document properties, unknown exception occured" << endl;
}
pDatabase->unlock();
return updated;
}
示例4: hasLabel
/// 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;
}
示例5: updateDocumentInfo
/// Updates a document's properties.
bool XapianIndex::updateDocumentInfo(unsigned int docId, const DocumentInfo &docInfo)
{
bool updated = false;
if (docId == 0)
{
return 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)
{
Xapian::Document doc = pIndex->get_document(docId);
#ifdef DEBUG
cout << "XapianIndex::updateDocumentInfo: language is " << docInfo.getLanguage() << endl;
#endif
// Update the document data with the current language
setDocumentData(doc, docInfo, docInfo.getLanguage());
pIndex->replace_document(docId, doc);
updated = true;
}
}
catch (const Xapian::Error &error)
{
cerr << "Couldn't update document properties: " << error.get_msg() << endl;
}
catch (...)
{
cerr << "Couldn't update document properties, unknown exception occured" << endl;
}
pDatabase->unlock();
return updated;
}
示例6: deleteDocuments
bool XapianIndex::deleteDocuments(const string &term)
{
bool unindexed = false;
if (term.empty() == true)
{
return 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)
{
#ifdef DEBUG
cout << "XapianIndex::deleteDocuments: term is " << term << endl;
#endif
// Delete documents from the index
pIndex->delete_document(term);
unindexed = true;
}
}
catch (const Xapian::Error &error)
{
cerr << "Couldn't unindex documents: " << error.get_type() << ": " << error.get_msg() << endl;
}
catch (...)
{
cerr << "Couldn't unindex documents, unknown exception occured" << endl;
}
pDatabase->unlock();
return unindexed;
}
示例7: unindexDocuments
/// Unindexes documents with the given label.
bool XapianIndex::unindexDocuments(const string &labelName)
{
bool unindexed = false;
if (labelName.empty() == true)
{
return 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:");
// Delete documents from the index
term += labelName;
pIndex->delete_document(term);
unindexed = true;
}
}
catch (const Xapian::Error &error)
{
cerr << "Couldn't unindex documents: " << error.get_type() << ": " << error.get_msg() << endl;
}
catch (...)
{
cerr << "Couldn't unindex documents, unknown exception occured" << endl;
}
pDatabase->unlock();
return unindexed;
}
示例8: unindexDocument
/// Unindexes the given document; true if success.
bool XapianIndex::unindexDocument(unsigned int docId)
{
bool unindexed = false;
if (docId == 0)
{
return 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)
{
// Delete the document from the index
pIndex->delete_document(docId);
unindexed = true;
}
}
catch (const Xapian::Error &error)
{
cerr << "Couldn't unindex document: " << error.get_type() << ": " << error.get_msg() << endl;
}
catch (...)
{
cerr << "Couldn't unindex document, unknown exception occured" << endl;
}
pDatabase->unlock();
return unindexed;
}
示例9: indexDocument
/// Indexes the given data.
bool XapianIndex::indexDocument(Tokenizer &tokens, const std::set<std::string> &labels,
unsigned int &docId)
{
unsigned int dataLength = 0;
bool indexed = false;
XapianDatabase *pDatabase = XapianDatabaseFactory::getDatabase(m_databaseName, false);
if (pDatabase == NULL)
{
cerr << "Bad index " << m_databaseName << endl;
return false;
}
try
{
// Get the document
const Document *pDocument = tokens.getDocument();
if (pDocument == NULL)
{
#ifdef DEBUG
cout << "XapianIndex::indexDocument: no document" << endl;
#endif
return false;
}
// Cache the document's properties
DocumentInfo docInfo(pDocument->getTitle(), pDocument->getLocation(),
pDocument->getType(), pDocument->getLanguage());
docInfo.setTimestamp(pDocument->getTimestamp());
docInfo.setLocation(Url::canonicalizeUrl(docInfo.getLocation()));
const char *pData = pDocument->getData(dataLength);
if (pData != NULL)
{
m_stemLanguage = scanDocument(pData, dataLength, docInfo);
}
Xapian::Document doc;
Xapian::termcount termPos = 0;
#ifdef DEBUG
cout << "XapianIndex::indexDocument: adding terms" << endl;
#endif
// Add the tokenizer's terms to the Xapian document
addPostingsToDocument(tokens, doc, "", termPos, m_stemMode);
// Add labels
for (set<string>::const_iterator labelIter = labels.begin(); labelIter != labels.end();
++labelIter)
{
doc.add_term(limitTermLength(string("XLABEL:") + *labelIter));
}
if (addCommonTerms(docInfo, doc, termPos) == true)
{
setDocumentData(docInfo, doc, m_stemLanguage);
Xapian::WritableDatabase *pIndex = pDatabase->writeLock();
if (pIndex != NULL)
{
// Add this document to the Xapian index
docId = pIndex->add_document(doc);
indexed = true;
}
}
}
catch (const Xapian::Error &error)
{
cerr << "Couldn't index document: " << error.get_type() << ": " << error.get_msg() << endl;
}
catch (...)
{
cerr << "Couldn't index document, unknown exception occured" << endl;
}
pDatabase->unlock();
return indexed;
}
示例10: setDocumentLabels
/// Sets a document's labels.
bool XapianIndex::setDocumentLabels(unsigned int docId, const set<string> &labels,
bool resetLabels)
{
bool updatedLabels = 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)
{
Xapian::Document doc = pIndex->get_document(docId);
// Reset existing labels ?
if (resetLabels == true)
{
Xapian::TermIterator termIter = pIndex->termlist_begin(docId);
if (termIter != pIndex->termlist_end(docId))
{
for (termIter.skip_to("XLABEL:");
termIter != pIndex->termlist_end(docId); ++termIter)
{
// Is this a label ?
if (strncasecmp((*termIter).c_str(), "XLABEL:", min(7, (int)(*termIter).length())) == 0)
{
doc.remove_term(*termIter);
}
}
}
}
// Set new labels
for (set<string>::const_iterator labelIter = labels.begin(); labelIter != labels.end();
++labelIter)
{
if (labelIter->empty() == false)
{
doc.add_term(limitTermLength(string("XLABEL:") + *labelIter));
}
}
pIndex->replace_document(docId, doc);
updatedLabels = true;
}
}
catch (const Xapian::Error &error)
{
cerr << "Couldn't update document's labels: " << error.get_type() << ": " << error.get_msg() << endl;
}
catch (...)
{
cerr << "Couldn't update document's labels, unknown exception occured" << endl;
}
pDatabase->unlock();
return updatedLabels;
}
示例11: updateDocument
/// Updates the given document; true if success.
bool XapianIndex::updateDocument(unsigned int docId, Tokenizer &tokens)
{
unsigned int dataLength = 0;
bool updated = false;
const Document *pDocument = tokens.getDocument();
if (pDocument == NULL)
{
return false;
}
XapianDatabase *pDatabase = XapianDatabaseFactory::getDatabase(m_databaseName, false);
if (pDatabase == NULL)
{
cerr << "Bad index " << m_databaseName << endl;
return false;
}
const char *pData = pDocument->getData(dataLength);
if (pData == NULL)
{
return false;
}
// Cache the document's properties
DocumentInfo docInfo(pDocument->getTitle(), pDocument->getLocation(),
pDocument->getType(), pDocument->getLanguage());
docInfo.setTimestamp(pDocument->getTimestamp());
docInfo.setLocation(Url::canonicalizeUrl(docInfo.getLocation()));
// Don't scan the document if a language is specified
m_stemLanguage = Languages::toEnglish(pDocument->getLanguage());
if (m_stemLanguage.empty() == true)
{
m_stemLanguage = scanDocument(pData, dataLength, docInfo);
}
try
{
set<string> labels;
Xapian::Document doc;
Xapian::termcount termPos = 0;
// Add the tokenizer's terms to the document
addPostingsToDocument(tokens, doc, "", termPos, m_stemMode);
// Get the document's labels
if (getDocumentLabels(docId, labels) == true)
{
// Add labels
for (set<string>::const_iterator labelIter = labels.begin(); labelIter != labels.end();
++labelIter)
{
doc.add_term(limitTermLength(string("XLABEL:") + *labelIter));
}
}
if (addCommonTerms(docInfo, doc, termPos) == true)
{
setDocumentData(docInfo, doc, m_stemLanguage);
Xapian::WritableDatabase *pIndex = pDatabase->writeLock();
if (pIndex != NULL)
{
// Update the document in the database
pIndex->replace_document(docId, doc);
updated = true;
}
}
}
catch (const Xapian::Error &error)
{
cerr << "Couldn't update document: " << error.get_type() << ": " << error.get_msg() << endl;
}
catch (...)
{
cerr << "Couldn't update document, unknown exception occured" << endl;
}
pDatabase->unlock();
return updated;
}
示例12: db
bool
DatabaseWrite::rebuild (GList *cpt_list)
{
string old_path = m_dbPath + "_old";
string rebuild_path = m_dbPath + "_rb";
string db_locale;
// Create the rebuild directory
if (g_mkdir_with_parents (rebuild_path.c_str (), 0755) != 0) {
g_warning ("Unable to create database rebuild directory.");
return false;
}
// check if old unrequired version of db still exists on filesystem
if (g_file_test (old_path.c_str (), G_FILE_TEST_EXISTS)) {
g_warning ("Existing xapian old db was not cleaned previously: '%s'.", old_path.c_str ());
as_utils_delete_dir_recursive (old_path.c_str ());
}
// check if old unrequired version of db still exists on filesystem
if (g_file_test (rebuild_path.c_str (), G_FILE_TEST_EXISTS)) {
g_debug ("Removing old rebuild-dir from previous database rebuild.");
as_utils_delete_dir_recursive (rebuild_path.c_str ());
}
Xapian::WritableDatabase db (rebuild_path, Xapian::DB_CREATE_OR_OVERWRITE);
Xapian::TermGenerator term_generator;
term_generator.set_database(db);
try {
/* this tests if we have spelling suggestions (there must be
* a better way?!?) - this is needed as inmemory does not have
* spelling corrections, but it allows setting the flag and will
* raise a exception much later
*/
db.add_spelling("test");
db.remove_spelling("test");
/* this enables the flag for it (we only reach this line if
* the db supports spelling suggestions)
*/
term_generator.set_flags(Xapian::TermGenerator::FLAG_SPELLING);
} catch (const Xapian::UnimplementedError &error) {
// Ignore
}
for (GList *list = cpt_list; list != NULL; list = list->next) {
AsComponent *cpt = (AsComponent*) list->data;
Xapian::Document doc;
term_generator.set_document (doc);
doc.set_data (as_component_get_name (cpt));
// Sanity check
if (!as_component_has_install_candidate (cpt)) {
g_warning ("Skipped component '%s' from inclusion into database: Does not have an installation candidate.",
as_component_get_id (cpt));
continue;
}
// Package name
gchar **pkgs = as_component_get_pkgnames (cpt);
if (pkgs != NULL) {
gchar *pkgs_cstr = g_strjoinv (";", pkgs);
string pkgs_str = pkgs_cstr;
doc.add_value (XapianValues::PKGNAMES, pkgs_str);
g_free (pkgs_cstr);
for (uint i = 0; pkgs[i] != NULL; i++) {
string pkgname = pkgs[i];
doc.add_term("AP" + pkgname);
if (pkgname.find ("-") != string::npos) {
// we need this to work around xapian oddness
string tmp = pkgname;
replace (tmp.begin (), tmp.end (), '-', '_');
doc.add_term (tmp);
}
// add packagename as meta-data too
term_generator.index_text_without_positions (pkgname, WEIGHT_PKGNAME);
}
}
// Source package name
const gchar *spkgname_cstr = as_component_get_source_pkgname (cpt);
if (spkgname_cstr != NULL) {
string spkgname = spkgname_cstr;
doc.add_value (XapianValues::SOURCE_PKGNAME, spkgname);
if (!spkgname.empty()) {
doc.add_term("AP" + spkgname);
if (spkgname.find ("-") != string::npos) {
// we need this to work around xapian oddness
string tmp = spkgname;
replace (tmp.begin (), tmp.end (), '-', '_');
doc.add_term (tmp);
}
// add packagename as meta-data too
term_generator.index_text_without_positions (spkgname, WEIGHT_PKGNAME);
}
}
//.........这里部分代码省略.........