From 53845645fb6e40fa1cc0cd657f19fee2a664620f Mon Sep 17 00:00:00 2001 From: Jean-Francois Dockes Date: Sat, 9 Nov 2013 11:22:08 +0100 Subject: [PATCH] GUI multiple clicks crash: make sure the GUI cant reenter the db --- src/qtgui/rclmain_w.cpp | 3 +++ src/query/docseq.cpp | 2 ++ src/query/docseq.h | 9 +++++---- src/query/docseqdb.cpp | 16 +++++++++++----- src/query/docseqdb.h | 7 ++++--- src/query/docseqdocs.h | 9 +++++---- src/query/docseqhist.h | 5 +++-- src/rcldb/searchdata.h | 10 +--------- 8 files changed, 34 insertions(+), 27 deletions(-) diff --git a/src/qtgui/rclmain_w.cpp b/src/qtgui/rclmain_w.cpp index 438302a0..2895b27e 100644 --- a/src/qtgui/rclmain_w.cpp +++ b/src/qtgui/rclmain_w.cpp @@ -777,6 +777,7 @@ void RclMain::startSearch(RefCntr sdata, bool issimple) return; } m_queryActive = true; + restable->setEnabled(false); m_source = RefCntr(); m_searchIsSimple = issimple; @@ -787,6 +788,7 @@ void RclMain::startSearch(RefCntr sdata, bool issimple) if (!maybeOpenDb(reason, m_idxproc != 0)) { QMessageBox::critical(0, "Recoll", QString(reason.c_str())); m_queryActive = false; + restable->setEnabled(true); return; } @@ -876,6 +878,7 @@ void RclMain::initiateQuery() statusBar()->showMessage(msg, 0); QApplication::restoreOverrideCursor(); m_queryActive = false; + restable->setEnabled(true); emit(resultsReady()); } diff --git a/src/query/docseq.cpp b/src/query/docseq.cpp index f2fb7468..537d3cbb 100644 --- a/src/query/docseq.cpp +++ b/src/query/docseq.cpp @@ -20,6 +20,7 @@ #include "debuglog.h" #include "internfile.h" +PTMutexInit DocSequence::o_dblock; string DocSequence::o_sort_trans; string DocSequence::o_filt_trans; @@ -43,6 +44,7 @@ bool DocSequence::getEnclosing(Rcl::Doc& doc, Rcl::Doc& pdoc) LOGERR(("DocSequence::getEnclosing: no db\n")); return false; } + PTMutexLocker locker(o_dblock); string udi; if (!FileInterner::getEnclosingUDI(doc, udi)) return false; diff --git a/src/query/docseq.h b/src/query/docseq.h index aee8c247..7257ef08 100644 --- a/src/query/docseq.h +++ b/src/query/docseq.h @@ -24,6 +24,7 @@ #include "rcldoc.h" #include "refcntr.h" #include "hldata.h" +#include "ptmutex.h" // Need this for the "Snippet" class def. #include "rclquery.h" @@ -160,10 +161,11 @@ class DocSequence { o_filt_trans = filt; } - virtual Rcl::Db *getDb() = 0; protected: - + friend class DocSeqModifier; + virtual Rcl::Db *getDb() = 0; + static PTMutexInit o_dblock; static std::string o_sort_trans; static std::string o_filt_trans; std::string m_reason; @@ -242,6 +244,7 @@ public: return m_seq; } +protected: virtual Rcl::Db *getDb() { if (m_seq.isNull()) @@ -249,8 +252,6 @@ public: return m_seq->getDb(); } -protected: - RefCntr m_seq; }; diff --git a/src/query/docseqdb.cpp b/src/query/docseqdb.cpp index aa834f18..4b7a9dec 100644 --- a/src/query/docseqdb.cpp +++ b/src/query/docseqdb.cpp @@ -38,10 +38,6 @@ DocSequenceDb::DocSequenceDb(RefCntr q, const string &t, { } -DocSequenceDb::~DocSequenceDb() -{ -} - void DocSequenceDb::getTerms(HighlightData& hld) { m_fsdata->getTerms(hld); @@ -54,6 +50,7 @@ string DocSequenceDb::getDescription() bool DocSequenceDb::getDoc(int num, Rcl::Doc &doc, string *sh) { + PTMutexLocker locker(o_dblock); if (!setQuery()) return false; if (sh) sh->erase(); @@ -62,6 +59,7 @@ bool DocSequenceDb::getDoc(int num, Rcl::Doc &doc, string *sh) int DocSequenceDb::getResCnt() { + PTMutexLocker locker(o_dblock); if (!setQuery()) return false; if (m_rescnt < 0) { @@ -77,6 +75,7 @@ static const string cstr_mre("[...]"); bool DocSequenceDb::getAbstract(Rcl::Doc &doc, vector& vpabs) { LOGDEB(("DocSequenceDb::getAbstract/pair\n")); + PTMutexLocker locker(o_dblock); if (!setQuery()) return false; @@ -107,6 +106,7 @@ bool DocSequenceDb::getAbstract(Rcl::Doc &doc, vector& vpabs) bool DocSequenceDb::getAbstract(Rcl::Doc &doc, vector& vabs) { + PTMutexLocker locker(o_dblock); if (!setQuery()) return false; if (m_q->whatDb() && @@ -120,6 +120,7 @@ bool DocSequenceDb::getAbstract(Rcl::Doc &doc, vector& vabs) int DocSequenceDb::getFirstMatchPage(Rcl::Doc &doc, string& term) { + PTMutexLocker locker(o_dblock); if (!setQuery()) return false; if (m_q->whatDb()) { @@ -135,6 +136,7 @@ Rcl::Db *DocSequenceDb::getDb() list DocSequenceDb::expand(Rcl::Doc &doc) { + PTMutexLocker locker(o_dblock); if (!setQuery()) return list(); vector v = m_q->expand(doc); @@ -149,13 +151,15 @@ string DocSequenceDb::title() else if (!m_isFiltered && m_isSorted) qual = string(" (") + o_sort_trans + string(")"); else if (m_isFiltered && m_isSorted) - qual = string(" (") + o_sort_trans + string(",") + o_filt_trans + string(")"); + qual = string(" (") + o_sort_trans + string(",") + o_filt_trans + + string(")"); return DocSequence::title() + qual; } bool DocSequenceDb::setFiltSpec(const DocSeqFiltSpec &fs) { LOGDEB(("DocSequenceDb::setFiltSpec\n")); + PTMutexLocker locker(o_dblock); if (fs.isNotNull()) { // We build a search spec by adding a filtering layer to the base one. m_fsdata = RefCntr( @@ -204,6 +208,7 @@ bool DocSequenceDb::setSortSpec(const DocSeqSortSpec &spec) { LOGDEB(("DocSequenceDb::setSortSpec: fld [%s] %s\n", spec.field.c_str(), spec.desc ? "desc" : "asc")); + PTMutexLocker locker(o_dblock); if (spec.isNotNull()) { m_q->setSortBy(spec.field, !spec.desc); m_isSorted = true; @@ -234,6 +239,7 @@ bool DocSequenceDb::setQuery() bool DocSequenceDb::docDups(const Rcl::Doc& doc, std::vector& dups) { if (m_q->whatDb()) { + PTMutexLocker locker(o_dblock); return m_q->whatDb()->docDups(doc, dups); } else { return false; diff --git a/src/query/docseqdb.h b/src/query/docseqdb.h index a6bd5b7d..44bf9c7b 100644 --- a/src/query/docseqdb.h +++ b/src/query/docseqdb.h @@ -27,7 +27,7 @@ class DocSequenceDb : public DocSequence { public: DocSequenceDb(RefCntr q, const string &t, RefCntr sdata); - virtual ~DocSequenceDb(); + virtual ~DocSequenceDb() {} virtual bool getDoc(int num, Rcl::Doc &doc, string * = 0); virtual int getResCnt(); virtual void getTerms(HighlightData& hld); @@ -38,7 +38,6 @@ class DocSequenceDb : public DocSequence { virtual bool getAbstract(Rcl::Doc &doc, vector&); virtual int getFirstMatchPage(Rcl::Doc&, std::string& term); - virtual Rcl::Db *getDb(); virtual bool docDups(const Rcl::Doc& doc, std::vector& dups); virtual string getDescription(); virtual list expand(Rcl::Doc &doc); @@ -58,7 +57,9 @@ class DocSequenceDb : public DocSequence { } virtual string title(); - private: +protected: + virtual Rcl::Db *getDb(); +private: RefCntr m_q; RefCntr m_sdata; RefCntr m_fsdata; // Filtered diff --git a/src/query/docseqdocs.h b/src/query/docseqdocs.h index e957cce8..1a05acc6 100644 --- a/src/query/docseqdocs.h +++ b/src/query/docseqdocs.h @@ -44,10 +44,6 @@ class DocSequenceDocs : public DocSequence { doc = m_docs[num]; return true; } - virtual Rcl::Db *getDb() - { - return m_db; - } virtual int getResCnt() { return m_docs.size(); @@ -60,6 +56,11 @@ class DocSequenceDocs : public DocSequence { { m_description = desc; } +protected: + virtual Rcl::Db *getDb() + { + return m_db; + } private: Rcl::Db *m_db; string m_description; diff --git a/src/query/docseqhist.h b/src/query/docseqhist.h index 8a2f0db2..5292a016 100644 --- a/src/query/docseqhist.h +++ b/src/query/docseqhist.h @@ -48,11 +48,12 @@ class DocSequenceHistory : public DocSequence { virtual ~DocSequenceHistory() {} virtual bool getDoc(int num, Rcl::Doc &doc, string *sh = 0); - virtual Rcl::Db *getDb(); virtual int getResCnt(); virtual string getDescription() {return m_description;} void setDescription(const string& desc) {m_description = desc;} - private: +protected: + virtual Rcl::Db *getDb(); +private: Rcl::Db *m_db; RclDynConf *m_hist; int m_prevnum; diff --git a/src/rcldb/searchdata.h b/src/rcldb/searchdata.h index ad49f4dc..3879e859 100644 --- a/src/rcldb/searchdata.h +++ b/src/rcldb/searchdata.h @@ -224,7 +224,7 @@ public: virtual bool toNativeQuery(Rcl::Db &db, void *) = 0; bool isFileName() const {return m_tp == SCLT_FILENAME ? true: false;} virtual std::string getReason() const {return m_reason;} - virtual void getTerms(HighlightData & hldata) const = 0; + virtual void getTerms(HighlightData&) const {} SClType getTp() const { @@ -382,10 +382,6 @@ public: { } - virtual void getTerms(HighlightData&) const - { - } - virtual bool toNativeQuery(Rcl::Db &, void *); }; @@ -423,10 +419,6 @@ public: { } - virtual void getTerms(HighlightData&) const - { - } - virtual bool toNativeQuery(Rcl::Db &, void *); };