From d84ca96ad52e36da5e7791c6e1996aefc153197b Mon Sep 17 00:00:00 2001 From: Lus Pedro Coelho Date: Thu, 4 Aug 2005 20:54:07 +0000 Subject: [PATCH] Handle an error in indexlib gracefully (disables functionality, but does not crash) svn path=/branches/KDE/3.5/kdepim/; revision=443076 --- index.cpp | 24 ++++++++++++++++++++---- index.h | 5 +++-- klistviewindexedsearchline.cpp | 5 +++-- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/index.cpp b/index.cpp index 893889633..48f2aa757 100644 --- a/index.cpp +++ b/index.cpp @@ -150,6 +150,7 @@ void KMMsgIndex::cleanUp() { int KMMsgIndex::addMessage( Q_UINT32 serNum ) { kdDebug( 5006 ) << "KMMsgIndex::addMessage( " << serNum << " )" << endl; + if ( mState == s_error ) return 0; assert( mIndex ); if ( !mExisting.empty() && std::binary_search( mExisting.begin(), mExisting.end(), serNum ) ) return 0; @@ -237,7 +238,11 @@ void KMMsgIndex::create() { kdDebug( 5006 ) << "KMMsgIndex::create()" << endl; mState = s_creating; if ( !mIndex ) mIndex = indexlib::create( mIndexPath ).release(); - Q_ASSERT( mIndex ); + if ( !mIndex ) { + kdDebug( 5006 ) << "Error creating index" << endl; + mState = s_error; + return; + } QValueStack folders; folders.push(&(kmkernel->folderMgr()->dir())); folders.push(&(kmkernel->dimapFolderMgr()->dir())); @@ -257,6 +262,7 @@ void KMMsgIndex::create() { bool KMMsgIndex::startQuery( KMSearch* s ) { kdDebug( 5006 ) << "KMMsgIndex::startQuery( . )" << endl; if ( mState == s_creating ) return false; + if ( mState == s_error ) return false; if ( !isIndexed( s->root() ) || !canHandleQuery( s->searchPattern() ) ) return false; kdDebug( 5006 ) << "KMMsgIndex::startQuery( . ) starting query" << endl; @@ -311,8 +317,12 @@ bool KMMsgIndex::stopQuery( KMSearch* s ) { return false; } -std::vector KMMsgIndex::simpleSearch( QString s ) const { +std::vector KMMsgIndex::simpleSearch( QString s, bool* ok ) const { kdDebug( 5006 ) << "KMMsgIndex::simpleSearch( -" << s.latin1() << "- )" << endl; + if ( mState == s_error ) { + if ( ok ) *ok = false; + return std::vector(); + } std::vector res; assert( mIndex ); std::vector residx = mIndex->search( s.latin1() )->list(); @@ -320,6 +330,7 @@ std::vector KMMsgIndex::simpleSearch( QString s ) const { for ( std::vector::const_iterator first = residx.begin(), past = residx.end();first != past; ++first ) { res.push_back( std::atoi( mIndex->lookup_docname( *first ).c_str() ) ); } + if ( ok ) *ok = true; return res; } @@ -339,6 +350,7 @@ bool KMMsgIndex::canHandleQuery( const KMSearchPattern* pat ) const { void KMMsgIndex::slotAddMessage( KMFolder* folder, Q_UINT32 serNum ) { kdDebug( 5006 ) << "KMMsgIndex::slotAddMessage( . , " << serNum << " )" << endl; + if ( mState == s_error ) return; if ( mState == s_creating ) mAddedMsgs.push_back( serNum ); else mPendingMsgs.push_back( serNum ); @@ -349,6 +361,8 @@ void KMMsgIndex::slotAddMessage( KMFolder* folder, Q_UINT32 serNum ) { void KMMsgIndex::slotRemoveMessage( KMFolder* folder, Q_UINT32 serNum ) { kdDebug( 5006 ) << "KMMsgIndex::slotRemoveMessage( . , " << serNum << " )" << endl; + if ( mState == s_error ) return; + if ( mState == s_idle ) mState = s_processing; mRemovedMsgs.push_back( serNum ); scheduleAction(); @@ -360,6 +374,9 @@ void KMMsgIndex::scheduleAction() { } void KMMsgIndex::removeMessage( Q_UINT32 serNum ) { + kdDebug( 5006 ) << "KMMsgIndex::removeMessage( " << serNum << " )" << endl; + if ( mState == s_error ) return; + mIndex->remove_doc( QString::number( serNum ).latin1() ); ++mMaintenanceCount; if ( mMaintenanceCount > MaintenanceLimit && mRemovedMsgs.empty() ) { @@ -398,8 +415,7 @@ void KMMsgIndex::Search::act() { terms += QString::fromLatin1( " %1 " ).arg( rule->contents() ); } - mValues = kmkernel->msgIndex()->simpleSearch( terms ); - mState = s_emitting; + mValues = kmkernel->msgIndex()->simpleSearch( terms, 0 ); break; } case s_emitstopped: diff --git a/index.h b/index.h index e3a287c93..66fb6d253 100644 --- a/index.h +++ b/index.h @@ -66,7 +66,7 @@ class KMMsgIndex : public QObject { /** * Just return all the uids where the pattern exists */ - std::vector simpleSearch( QString ) const; + std::vector simpleSearch( QString, bool* ) const; public slots: void clear(); void create(); @@ -114,7 +114,8 @@ class KMMsgIndex : public QObject { s_idle, // doing nothing s_willcreate, // just constructed, create() scheduled (mIndex == 0) s_creating, // creating the index from the messages - s_processing // has messages to process + s_processing, // has messages to process + s_error // an error occurred } mState; unsigned mMaintenanceCount; diff --git a/klistviewindexedsearchline.cpp b/klistviewindexedsearchline.cpp index 1d6203771..a811b181b 100644 --- a/klistviewindexedsearchline.cpp +++ b/klistviewindexedsearchline.cpp @@ -54,10 +54,11 @@ void KListViewIndexedSearchLine::updateSearch( const QString& s ) { kdDebug( 5006 ) << "updateSearch( -" << s << "- )" << endl; mFiltering = false; if ( !s.isNull() && !s.isEmpty() ) { + bool ok = false; KMMsgIndex* index = kmkernel->msgIndex(); - mResults = index->simpleSearch( s ); + mResults = index->simpleSearch( s, &ok ); std::sort( mResults.begin(), mResults.end() ); - mFiltering = true; + mFiltering = ok; } KListViewSearchLine::updateSearch( s ); }