diff --git a/src/common/textsplit.cpp b/src/common/textsplit.cpp index 28f91c13..ae85127a 100644 --- a/src/common/textsplit.cpp +++ b/src/common/textsplit.cpp @@ -492,7 +492,7 @@ static inline bool isdigit(int what, unsigned int flgs) #define STATS_INC_WORDCHARS #endif -vector splitFlags = { +vector splitFlags{ {TextSplit::TXTS_NOSPANS, "nospans"}, {TextSplit::TXTS_ONLYSPANS, "onlyspans"}, {TextSplit::TXTS_KEEPWILD, "keepwild"} diff --git a/src/index/exefetcher.cpp b/src/index/exefetcher.cpp index ab6feb4c..8dda0208 100644 --- a/src/index/exefetcher.cpp +++ b/src/index/exefetcher.cpp @@ -79,8 +79,6 @@ bool EXEDocFetcher::makesig(RclConfig* cnf, const Rcl::Doc& idoc, string& sig) // Lookup bckid in the config and create an appropriate fetcher. EXEDocFetcher *exeDocFetcherMake(RclConfig *config, const string& bckid) { - EXEDocFetcher *fetcher = 0; - // The config we only read once, not gonna change. static ConfSimple *bconf; if (!bconf) { diff --git a/src/qtgui/rclm_idx.cpp b/src/qtgui/rclm_idx.cpp index c5fe9186..be186dda 100644 --- a/src/qtgui/rclm_idx.cpp +++ b/src/qtgui/rclm_idx.cpp @@ -29,6 +29,7 @@ #include "rclmain_w.h" #include "specialindex.h" #include "readfile.h" +#include "snippets_w.h" using namespace std; @@ -291,8 +292,20 @@ void RclMain::toggleIndexing() } } +static void delay(int millisecondsWait) +{ + QEventLoop loop; + QTimer t; + t.connect(&t, &QTimer::timeout, &loop, &QEventLoop::quit); + t.start(millisecondsWait); + loop.exec(); +} + void RclMain::rebuildIndex() { + if (m_indexerState == IXST_UNKNOWN) { + delay(1500); + } switch (m_indexerState) { case IXST_UNKNOWN: case IXST_RUNNINGMINE: @@ -313,12 +326,24 @@ void RclMain::rebuildIndex() QMessageBox::NoButton); if (rep == QMessageBox::Ok) { #ifdef _WIN32 - // Under windows, it's necessary to close the db here, + // Under windows, it is necessary to close the db here, // else Xapian won't be able to do what it wants with the // (open) files. Of course if there are several GUI - // instances, this won't work... - if (rcldb) + // instances, this won't work... Also it's quite difficult + // to make sure that there are no more references to the + // db because, for example of the Enquire objects inside + // Query inside Docsource etc. + // + // !! At this moment, this does not work if a preview has + // !! been opened. Could not find the reason (mysterious + // !! Xapian::Database reference somewhere?). The indexing + // !! fails, leaving a partial index directory. Then need + // !! to restart the GUI to succeed in reindexing. + if (rcldb) { + resetSearch(); + deleteZ(m_snippets); rcldb->close(); + } #endif // _WIN32 // Could also mean that no helpers are missing, but then we // won't try to show a message anyway (which is what diff --git a/src/qtgui/rclm_wins.cpp b/src/qtgui/rclm_wins.cpp index 9594a72c..d506d6f5 100644 --- a/src/qtgui/rclm_wins.cpp +++ b/src/qtgui/rclm_wins.cpp @@ -451,13 +451,16 @@ void RclMain::newDupsW(const Rcl::Doc, const vector dups) void RclMain::showSnippets(Rcl::Doc doc) { - SnippetsW *sp = new SnippetsW(doc, m_source); - connect(sp, SIGNAL(startNativeViewer(Rcl::Doc, int, QString)), + if (m_snippets) { + deleteZ(m_snippets); + } + m_snippets = new SnippetsW(doc, m_source); + connect(m_snippets, SIGNAL(startNativeViewer(Rcl::Doc, int, QString)), this, SLOT(startNativeViewer(Rcl::Doc, int, QString))); - connect(new QShortcut(quitKeySeq, sp), SIGNAL (activated()), + connect(new QShortcut(quitKeySeq, m_snippets), SIGNAL (activated()), this, SLOT (fileExit())); - connect(new QShortcut(closeKeySeq, sp), SIGNAL (activated()), - sp, SLOT (close())); - sp->show(); + connect(new QShortcut(closeKeySeq, m_snippets), SIGNAL (activated()), + m_snippets, SLOT (close())); + m_snippets->show(); } diff --git a/src/qtgui/rclmain_w.cpp b/src/qtgui/rclmain_w.cpp index 41438f65..f61369ec 100644 --- a/src/qtgui/rclmain_w.cpp +++ b/src/qtgui/rclmain_w.cpp @@ -531,7 +531,7 @@ void RclMain::initDbOpen() connect(fidia.idxschedCLB, SIGNAL(clicked()), this, SLOT(execIndexSched())); connect(fidia.runidxPB, SIGNAL(clicked()), - this, SLOT(toggleIndexing())); + this, SLOT(rebuildIndex())); fidia.exec(); // Don't open adv search or run cmd line search in this case. return; @@ -788,6 +788,7 @@ void RclMain::initiateQuery() void RclMain::resetSearch() { + m_source = std::shared_ptr(); emit searchReset(); } @@ -974,8 +975,7 @@ void RclMain::docExpand(Rcl::Doc doc) void RclMain::showDocHistory() { LOGDEB("RclMain::showDocHistory\n"); - emit searchReset(); - m_source = std::shared_ptr(); + resetSearch(); curPreview = 0; string reason; diff --git a/src/qtgui/rclmain_w.h b/src/qtgui/rclmain_w.h index d7add82e..1eedfc0f 100644 --- a/src/qtgui/rclmain_w.h +++ b/src/qtgui/rclmain_w.h @@ -35,6 +35,7 @@ #include "guiutils.h" #include "rclutil.h" +class SnippetsW; class IdxSchedW; class ExecCmd; class Preview; @@ -202,6 +203,7 @@ protected: private: + SnippetsW *m_snippets{0}; Preview *curPreview; AdvSearch *asearchform; UIPrefsDialog *uiprefs; diff --git a/src/qtgui/reslist.cpp b/src/qtgui/reslist.cpp index cf662e9e..4b059cc4 100644 --- a/src/qtgui/reslist.cpp +++ b/src/qtgui/reslist.cpp @@ -407,6 +407,8 @@ void ResList::setDocSource(std::shared_ptr nsource) { LOGDEB("ResList::setDocSource()\n"); m_source = std::shared_ptr(new DocSource(theconfig, nsource)); + if (m_pager) + m_pager->setDocSource(m_source); } // A query was executed, or the filtering/sorting parameters changed, diff --git a/src/rcldb/rcldb.cpp b/src/rcldb/rcldb.cpp index c7cb5093..76a86c19 100644 --- a/src/rcldb/rcldb.cpp +++ b/src/rcldb/rcldb.cpp @@ -59,6 +59,7 @@ using namespace std; #include "rclinit.h" #include "internfile.h" #include "utf8fn.h" +#include "wipedir.h" #ifdef RCL_USE_ASPELL #include "rclaspell.h" #endif @@ -255,6 +256,18 @@ void Db::Native::openWrite(const string& dir, Db::OpenMode mode) int action = (mode == Db::DbUpd) ? Xapian::DB_CREATE_OR_OPEN : Xapian::DB_CREATE_OR_OVERWRITE; +#ifdef _WIN32 + // Xapian is quite bad at erasing partial db which can + // occur because of open file deletion errors on + // Windows. + if (mode == DbTrunc) { + if (path_exists(path_cat(dir, "iamchert"))) { + wipedir(dir); + unlink(dir.c_str()); + } + } +#endif + if (::access(dir.c_str(), 0) == 0) { // Existing index xwdb = Xapian::WritableDatabase(dir, action); @@ -874,7 +887,9 @@ Db::~Db() LOGDEB("Db::~Db: isopen " << m_ndb->m_isopen << " m_iswritable " << m_ndb->m_iswritable << "\n"); i_close(true); +#ifdef RCL_USE_ASPELL delete m_aspell; +#endif delete m_config; } diff --git a/src/utils/smallut.h b/src/utils/smallut.h index d159f1f7..1ab958c0 100644 --- a/src/utils/smallut.h +++ b/src/utils/smallut.h @@ -227,6 +227,8 @@ private: /// Entries for the descriptive table struct CharFlags { + CharFlags(int v, const char *y, const char *n=0) + : value(v), yesname(y), noname(n) {} unsigned int value; // Flag or value const char *yesname;// String to print if flag set or equal const char *noname; // String to print if flag not set (unused for values)