From ce0e808fc2b176314308a6b4fca3435da5e3f9ba Mon Sep 17 00:00:00 2001 From: Jean-Francois Dockes Date: Sat, 18 Feb 2012 17:20:03 +0100 Subject: [PATCH] add menu entry to erase index and restart --- src/qtgui/rclmain.ui | 9 ++++ src/qtgui/rclmain_w.cpp | 91 +++++++++++++++++++++++++++++++++++------ src/qtgui/rclmain_w.h | 7 ++-- 3 files changed, 92 insertions(+), 15 deletions(-) diff --git a/src/qtgui/rclmain.ui b/src/qtgui/rclmain.ui index 27643190..3b66dd1e 100644 --- a/src/qtgui/rclmain.ui +++ b/src/qtgui/rclmain.ui @@ -135,6 +135,7 @@ &File + @@ -201,6 +202,14 @@ fileToggleIndexingAction + + + &Rebuild index + + + fileRebuildIndexAction + + &Erase document history diff --git a/src/qtgui/rclmain_w.cpp b/src/qtgui/rclmain_w.cpp index 8c73789e..6a882584 100644 --- a/src/qtgui/rclmain_w.cpp +++ b/src/qtgui/rclmain_w.cpp @@ -228,6 +228,8 @@ void RclMain::init() this, SLOT(fileExit() ) ); connect(fileToggleIndexingAction, SIGNAL(activated()), this, SLOT(toggleIndexing())); + connect(fileRebuildIndexAction, SIGNAL(activated()), + this, SLOT(rebuildIndex())); connect(fileEraseDocHistoryAction, SIGNAL(activated()), this, SLOT(eraseDocHistory())); connect(fileEraseSearchHistoryAction, SIGNAL(activated()), @@ -333,6 +335,8 @@ void RclMain::init() emit sortDataChanged(m_sortspec); } + fileRebuildIndexAction->setEnabled(FALSE); + fileToggleIndexingAction->setEnabled(FALSE); // Start timer on a slow period (used for checking ^C). Will be // speeded up during indexing periodictimer->start(1000); @@ -556,17 +560,26 @@ void RclMain::periodic100() // Update the "start/stop indexing" menu entry, can't be done from // the "start/stop indexing" slot itself if (m_idxproc) { + m_indexerState = IXST_RUNNINGMINE; fileToggleIndexingAction->setText(tr("Stop &Indexing")); fileToggleIndexingAction->setEnabled(TRUE); + fileRebuildIndexAction->setEnabled(FALSE); + periodictimer->setInterval(200); } else { - fileToggleIndexingAction->setText(tr("Update &Index")); - // No indexer of our own runnin, but the real time one may be up, check - // for some other indexer. Pidfile pidfile(theconfig->getPidfile()); if (pidfile.open() == 0) { + m_indexerState = IXST_NOTRUNNING; + fileToggleIndexingAction->setText(tr("Update &Index")); fileToggleIndexingAction->setEnabled(TRUE); + fileRebuildIndexAction->setEnabled(TRUE); + periodictimer->setInterval(1000); } else { - fileToggleIndexingAction->setEnabled(FALSE); + // Real time or externally started batch indexer running + m_indexerState = IXST_RUNNINGNOTMINE; + fileToggleIndexingAction->setText(tr("Stop &Indexing")); + fileToggleIndexingAction->setEnabled(TRUE); + fileRebuildIndexAction->setEnabled(FALSE); + periodictimer->setInterval(200); } } @@ -590,24 +603,78 @@ void RclMain::periodic100() fileExit(); } -// This gets called when the indexing action is activated. It starts +// This gets called when the "update iindex" action is activated. It executes // the requested action, and disables the menu entry. This will be // re-enabled by the indexing status check void RclMain::toggleIndexing() { - if (m_idxproc) { - // Indexing was in progress, request stop. Let the periodic - // routine check for the results. - kill(m_idxproc->getChildPid(), SIGTERM); - } else { + switch (m_indexerState) { + case IXST_RUNNINGMINE: + if (m_idxproc) { + // Indexing was in progress, request stop. Let the periodic + // routine check for the results. + int pid = m_idxproc->getChildPid(); + if (pid > 0) + kill(pid, SIGTERM); + } + break; + case IXST_RUNNINGNOTMINE: + { + int rep = + QMessageBox::information(0, tr("Warning"), + tr("The current indexing process " + "was not started from this " + "interface. Click Ok to kill it " + "anyway, or Cancel to leave it alone"), + QMessageBox::Ok, + QMessageBox::Cancel, + QMessageBox::NoButton); + if (rep == QMessageBox::Ok) { + Pidfile pidfile(theconfig->getPidfile()); + pid_t pid = pidfile.open(); + if (pid > 0) + kill(pid, SIGTERM); + } + } + break; + case IXST_NOTRUNNING: + { list args; args.push_back("-c"); args.push_back(theconfig->getConfDir()); m_idxproc = new ExecCmd; m_idxproc->startExec("recollindex", args, false, false); - fileToggleIndexingAction->setText(tr("Stop &Indexing")); } - fileToggleIndexingAction->setEnabled(FALSE); + break; + } +} + +void RclMain::rebuildIndex() +{ + switch (m_indexerState) { + case IXST_RUNNINGMINE: + case IXST_RUNNINGNOTMINE: + return; //?? Should not have been called + case IXST_NOTRUNNING: + { + int rep = + QMessageBox::warning(0, tr("Erasing index"), + tr("Reset the index and start " + "from scratch ?"), + QMessageBox::Ok, + QMessageBox::Cancel, + QMessageBox::NoButton); + if (rep == QMessageBox::Ok) { + list args; + args.push_back("-c"); + args.push_back(theconfig->getConfDir()); + args.push_back("-z"); + m_idxproc = new ExecCmd; + m_idxproc->startExec("recollindex", args, false, false); + } + } + break; + } } // Start a db query and set the reslist docsource diff --git a/src/qtgui/rclmain_w.h b/src/qtgui/rclmain_w.h index 20c61832..2e245e76 100644 --- a/src/qtgui/rclmain_w.h +++ b/src/qtgui/rclmain_w.h @@ -52,6 +52,7 @@ class RclMain : public QMainWindow, public Ui::RclMainBase Q_OBJECT public: + enum IndexerState {IXST_NOTRUNNING, IXST_RUNNINGMINE, IXST_RUNNINGNOTMINE}; RclMain(QWidget * parent = 0) : QMainWindow(parent), curPreview(0), @@ -69,7 +70,7 @@ public: m_idAllStem(0), m_idxproc(0), m_sortspecnochange(false), - m_periodicToggle(0) + m_indexerState(IXST_RUNNINGNOTMINE) { setupUi(this); init(); @@ -84,6 +85,7 @@ public slots: virtual void idxStatus(); virtual void periodic100(); virtual void toggleIndexing(); + virtual void rebuildIndex(); virtual void startSearch(RefCntr sdata); virtual void previewClosed(Preview *w); virtual void showAdvSearchDialog(); @@ -156,7 +158,6 @@ private: QAction *m_idNoStem; QAction *m_idAllStem; QFileSystemWatcher m_watcher; - vector m_viewers; ExecCmd *m_idxproc; // Indexing process map m_stemLangToId; @@ -165,7 +166,7 @@ private: bool m_sortspecnochange; DocSeqSortSpec m_sortspec; RefCntr m_source; - int m_periodicToggle; + IndexerState m_indexerState; virtual void init(); virtual void previewPrevOrNextInTab(Preview *, int sid, int docnum,