From d5e5cd934002e24e96828c31daafe3b077d0e468 Mon Sep 17 00:00:00 2001 From: Kelson Date: Mon, 20 Jun 2016 23:35:13 +0200 Subject: [PATCH] Deal with new glass/single_file Xapian indexes --- src/common/kiwix/indexer.cpp | 2 +- src/common/kiwix/indexer.h | 2 +- src/common/kiwix/xapianIndexer.cpp | 27 +++++++++++++++++++-------- src/common/kiwix/xapianIndexer.h | 2 +- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/common/kiwix/indexer.cpp b/src/common/kiwix/indexer.cpp index 69e244643..61fdadddd 100644 --- a/src/common/kiwix/indexer.cpp +++ b/src/common/kiwix/indexer.cpp @@ -246,7 +246,7 @@ namespace kiwix { /* Test if the thread should be cancelled */ pthread_testcancel(); } - self->indexingPostlude(); + self->indexingPostlude(self->getIndexPath()); /* Write content id file */ string path = appendToDirectory(self->getIndexPath(), "content.id"); diff --git a/src/common/kiwix/indexer.h b/src/common/kiwix/indexer.h index 410509336..0a6100020 100644 --- a/src/common/kiwix/indexer.h +++ b/src/common/kiwix/indexer.h @@ -76,7 +76,7 @@ namespace kiwix { const string &size, const string &wordCount) = 0; virtual void flush() = 0; - virtual void indexingPostlude() = 0; + virtual void indexingPostlude(const string indexPath) = 0; /* Stop words */ std::vector stopWords; diff --git a/src/common/kiwix/xapianIndexer.cpp b/src/common/kiwix/xapianIndexer.cpp index 612b4ff93..07ae5afac 100644 --- a/src/common/kiwix/xapianIndexer.cpp +++ b/src/common/kiwix/xapianIndexer.cpp @@ -30,7 +30,7 @@ namespace kiwix { } void XapianIndexer::indexingPrelude(const string indexPath) { - this->writableDatabase = Xapian::WritableDatabase(indexPath, Xapian::DB_CREATE_OR_OVERWRITE); + this->writableDatabase = Xapian::WritableDatabase(indexPath+".tmp", Xapian::DB_CREATE_OR_OVERWRITE | Xapian::DB_BACKEND_GLASS); this->writableDatabase.begin_transaction(true); /* Insert the stopwords */ @@ -87,14 +87,25 @@ namespace kiwix { this->writableDatabase.begin_transaction(true); } - void XapianIndexer::indexingPostlude() { + void XapianIndexer::indexingPostlude(const string indexPath) { this->flush(); this->writableDatabase.commit_transaction(); - #ifdef _WIN32 - this->writableDatabase.close(); - #endif - - // commit is not available is old version of xapian and seems not mandatory there - // this->writableDatabase.commit(); +#ifdef _WIN32 + this->writableDatabase.close(); +#endif + + /* Compacting the index */ + Xapian::Compactor compactor; + try { + Xapian::Database src; + src.add_database(Xapian::Database(indexPath+".tmp")); + src.compact(indexPath, Xapian::Compactor::FULL | Xapian::DBCOMPACT_SINGLE_FILE, 0, compactor); + } catch (const Xapian::Error &error) { + cerr << indexPath << ": " << error.get_description() << endl; + exit(1); + } catch (const char * msg) { + cerr << indexPath << ": " << msg << endl; + exit(1); + } } } diff --git a/src/common/kiwix/xapianIndexer.h b/src/common/kiwix/xapianIndexer.h index da5f19e12..40c93b88b 100644 --- a/src/common/kiwix/xapianIndexer.h +++ b/src/common/kiwix/xapianIndexer.h @@ -43,7 +43,7 @@ namespace kiwix { const string &size, const string &wordCount); void flush(); - void indexingPostlude(); + void indexingPostlude(const string indexPath); Xapian::WritableDatabase writableDatabase; Xapian::Stem stemmer;