author | eilers <eilers> | 2004-09-05 15:46:47 (UTC) |
---|---|---|
committer | eilers <eilers> | 2004-09-05 15:46:47 (UTC) |
commit | 97a40bb7f35a8323dd99712bf014387add283177 (patch) (side-by-side diff) | |
tree | ec50fbb430f00c86af6ca5bd7c6b94fa29cfe3b1 | |
parent | f8b02e2ae752ce98b8840735260c4e9b0ff25cb8 (diff) | |
download | opie-97a40bb7f35a8323dd99712bf014387add283177.zip opie-97a40bb7f35a8323dd99712bf014387add283177.tar.gz opie-97a40bb7f35a8323dd99712bf014387add283177.tar.bz2 |
Fixing really stupid caching bug.. Thanks to zecke who found it..
Removed cachefind in backend which isn't needed anymore and not a goot idea...
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp | 5 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.h | 4 | ||||
-rw-r--r-- | libopie2/opiepim/backend/opimaccessbackend.h | 22 | ||||
-rw-r--r-- | libopie2/opiepim/backend/otodoaccesssql.cpp | 20 | ||||
-rw-r--r-- | libopie2/opiepim/backend/otodoaccesssql.h | 2 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimaccesstemplate.h | 4 |
6 files changed, 25 insertions, 32 deletions
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp index abfd944..221e977 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp @@ -841,8 +841,9 @@ OPimContact OPimContactAccessBackend_SQL::requestContactsAndCache( int uid, cons // We don't have to add the given uid to the uidlist, it is expected to be there already (see opimrecordlist.h). // All contacts will be stored in the cache, afterwards the contact with the user id "uid" will be returned // by using the cache.. QArray<int> cachelist = uidlist; + OPimContact retContact; odebug << "Reqest and cache" << cachelist.size() << "elements !" << oendl; QTime t; @@ -864,8 +865,10 @@ OPimContact OPimContactAccessBackend_SQL::requestContactsAndCache( int uid, cons OPimContact contact( fillNonCustomMap( resItem ) ); contact.setExtraMap( requestCustom( contact.uid() ) ); odebug << "Caching uid: " << contact.uid() << oendl; cache( contact ); + if ( contact.uid() == uid ) + retContact = contact; resItem = res_noncustom.next(); } while ( ! res_noncustom.atEnd() ); //atEnd() is true if we are past(!) the list !! t3needed = t3.elapsed(); @@ -873,9 +876,9 @@ OPimContact OPimContactAccessBackend_SQL::requestContactsAndCache( int uid, cons // odebug << "Adding UID: " << resItem.data( "uid" ) << "" << oendl; odebug << "RequestContactsAndCache needed: insg.:" << t.elapsed() << " ms, query: " << t2needed << " ms, mapping: " << t3needed << " ms" << oendl; - return cacheFind( uid ); + return retContact; } QMap<int, QString> OPimContactAccessBackend_SQL::fillNonCustomMap( const OSQLResultItem& resultItem ) const { diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.h b/libopie2/opiepim/backend/ocontactaccessbackend_sql.h index 4f81735..28d9746 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.h +++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.h @@ -71,10 +71,10 @@ class OPimContactAccessBackend_SQL : public OPimContactAccessBackend { bool wasChangedExternally(); QArray<int> allRecords() const; - OPimContact find ( int uid ) const; - OPimContact find( int uid, const QArray<int>&, uint cur, Frontend::CacheDirection ) const; + OPimContact find( int uid ) const; + OPimContact find( int uid, const QArray<int>& items, uint cur, Frontend::CacheDirection ) const; QArray<int> queryByExample ( const OPimContact &query, int settings, const QDateTime& d ); diff --git a/libopie2/opiepim/backend/opimaccessbackend.h b/libopie2/opiepim/backend/opimaccessbackend.h index 15a7b7f..26af762 100644 --- a/libopie2/opiepim/backend/opimaccessbackend.h +++ b/libopie2/opiepim/backend/opimaccessbackend.h @@ -92,11 +92,11 @@ public: /** * find the OPimRecord with uid @param uid * returns T and T.isEmpty() if nothing was found */ - virtual T find(int uid )const = 0; + virtual T find( int uid )const = 0; - virtual T find(int uid, const QArray<int>& items, + virtual T find( int uid, const QArray<int>& items, uint current, typename Frontend::CacheDirection ) const; /** * clear the back end */ @@ -130,15 +130,8 @@ protected: int access()const; void cache( const T& t )const; - /** - * Returns the element with given uid out of the cache. - * Returns empty element if nothing was found. - * <b>Attention:</b> This just works if we have a frontend which contains the cache ! - */ - T cacheFind( int uid ) const; - /** * use a prime number here! */ void setSaneCacheSize( int ); @@ -172,17 +165,8 @@ void OPimAccessBackend<T>::cache( const T& t )const { if ( m_front ) m_front->cache( t ); } -template <class T> -T OPimAccessBackend<T>::cacheFind( int uid )const { - if ( ! m_front ){ - qWarning ( "No frontend assigned ! Therefore we cannot access the cache to return the right element!" ); - return T(); - } - - return m_front->cacheFind( uid ); -} template <class T> void OPimAccessBackend<T>::setSaneCacheSize( int size) { if ( m_front ) @@ -190,9 +174,9 @@ void OPimAccessBackend<T>::setSaneCacheSize( int size) { } template <class T> T OPimAccessBackend<T>::find( int uid, const QArray<int>&, uint, typename Frontend::CacheDirection ) const{ - qDebug( "*** Lookahead feature not supported. Fallback to default find!" ); + qDebug( "*** Lookahead feature not supported. Fallback to default find!!" ); return find( uid ); } template <class T> void OPimAccessBackend<T>::setReadAhead( uint count ) { diff --git a/libopie2/opiepim/backend/otodoaccesssql.cpp b/libopie2/opiepim/backend/otodoaccesssql.cpp index 12a8bea..4e3e47b 100644 --- a/libopie2/opiepim/backend/otodoaccesssql.cpp +++ b/libopie2/opiepim/backend/otodoaccesssql.cpp @@ -453,9 +453,9 @@ QArray<int> OPimTodoAccessBackendSQL::queryByExample( const OPimTodo& , int, con return ints; } OPimTodo OPimTodoAccessBackendSQL::find(int uid ) const{ FindQuery query( uid ); - return todo( m_driver->query(&query) ); + return parseResultAndCache( uid, m_driver->query(&query) ); } // Remember: uid is already in the list of uids, called ints ! @@ -491,10 +491,9 @@ OPimTodo OPimTodoAccessBackendSQL::find( int uid, const QArray<int>& ints, OSQLResult res = m_driver->query( &query ); if ( res.state() != OSQLResult::Success ) return to; - todo( res ); //FIXME: Don't like polymorphism here. It makes the code hard to read here..(eilers) - return cacheFind( uid ); + return parseResultAndCache( uid, res ); } void OPimTodoAccessBackendSQL::clear() { ClearQuery cle; @@ -629,14 +628,16 @@ bool OPimTodoAccessBackendSQL::date( QDate& da, const QString& str ) const{ da.setYMD( year, month, day ); return true; } } -OPimTodo OPimTodoAccessBackendSQL::todo( const OSQLResult& res ) const{ +OPimTodo OPimTodoAccessBackendSQL::parseResultAndCache( int uid, const OSQLResult& res ) const{ if ( res.state() == OSQLResult::Failure ) { OPimTodo to; return to; } + OPimTodo retTodo; + OSQLResultItem::ValueList list = res.results(); OSQLResultItem::ValueList::Iterator it = list.begin(); odebug << "todo1" << oendl; OPimTodo to = todo( (*it) ); @@ -644,11 +645,14 @@ OPimTodo OPimTodoAccessBackendSQL::todo( const OSQLResult& res ) const{ ++it; for ( ; it != list.end(); ++it ) { odebug << "caching" << oendl; - cache( todo( (*it) ) ); + OPimTodo newTodo = todo( (*it) ); + cache( newTodo ); + if ( newTodo.uid() == uid ) + retTodo = newTodo; } - return to; + return retTodo; } OPimTodo OPimTodoAccessBackendSQL::todo( OSQLResultItem& item )const { odebug << "todo(ResultItem)" << oendl; @@ -706,11 +710,13 @@ OPimTodo OPimTodoAccessBackendSQL::todo( OSQLResultItem& item )const { to.setExtraMap( requestCustom( to.uid() ) ); return to; } + +// FIXME: Where is the difference to "find" ? (eilers) OPimTodo OPimTodoAccessBackendSQL::todo( int uid )const { FindQuery find( uid ); - return todo( m_driver->query(&find) ); + return parseResultAndCache( uid, m_driver->query(&find) ); } /* * update the dict */ diff --git a/libopie2/opiepim/backend/otodoaccesssql.h b/libopie2/opiepim/backend/otodoaccesssql.h index 0cc7722..415f791 100644 --- a/libopie2/opiepim/backend/otodoaccesssql.h +++ b/libopie2/opiepim/backend/otodoaccesssql.h @@ -74,9 +74,9 @@ public: private: void update()const; void fillDict(); inline bool date( QDate& date, const QString& )const; - inline OPimTodo todo( const Opie::DB::OSQLResult& )const; + inline OPimTodo parseResultAndCache( int uid, const Opie::DB::OSQLResult& )const; inline OPimTodo todo( Opie::DB::OSQLResultItem& )const; inline QArray<int> uids( const Opie::DB::OSQLResult& )const; OPimTodo todo( int uid )const; QBitArray sup() const; diff --git a/libopie2/opiepim/core/opimaccesstemplate.h b/libopie2/opiepim/core/opimaccesstemplate.h index 6f01b46..7ab1ea5 100644 --- a/libopie2/opiepim/core/opimaccesstemplate.h +++ b/libopie2/opiepim/core/opimaccesstemplate.h @@ -118,14 +118,14 @@ public: /** * find the OPimRecord uid */ - virtual T find( int uid )const; + T find( int uid )const; /** * read ahead cache find method ;) */ - virtual T find( int uid, const QArray<int>&, + T find( int uid, const QArray<int>&, uint current, typename OTemplateBase<T>::CacheDirection dir = OTemplateBase<T>::Forward )const; /* invalidate cache here */ |