Diffstat (limited to 'libopie/pim/opimaccesstemplate.h') (more/less context) (ignore whitespace changes)
-rw-r--r-- | libopie/pim/opimaccesstemplate.h | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/libopie/pim/opimaccesstemplate.h b/libopie/pim/opimaccesstemplate.h index 31ab516..92d7192 100644 --- a/libopie/pim/opimaccesstemplate.h +++ b/libopie/pim/opimaccesstemplate.h @@ -6,8 +6,9 @@ #include <opie/opimrecord.h> #include <opie/opimaccessbackend.h> #include <opie/orecordlist.h> +#include "opimcache.h" #include "otemplatebase.h" /** * Thats the frontend to our OPIE PIM @@ -22,8 +23,9 @@ template <class T = OPimRecord > class OPimAccessTemplate : public OTemplateBase<T> { public: typedef ORecordList<T> List; typedef OPimAccessBackend<T> BackEnd; + typedef OPimCache<T> Cache; /** * our sort order * should be safe explaining @@ -72,8 +74,14 @@ public: * find the OPimRecord uid */ virtual T find( int uid )const; + /** + * read ahead cache find method ;) + */ + virtual T find( int uid, const QArray<int>&, + uint current, CacheDirection dir = Forward )const; + /* invalidate cache here */ /** * clears the backend and invalidates the backend */ @@ -98,8 +106,14 @@ public: /** * replace T from backend */ virtual bool replace( const T& t) ; + + /** + * @internal + */ + void cache( const T& )const; + void setSaneCacheSize( int ); protected: /** * invalidate the cache */ @@ -110,24 +124,27 @@ protected: * returns the backend */ BackEnd* backEnd(); BackEnd* m_backEnd; + Cache m_cache; }; template <class T> OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end ) : OTemplateBase<T>(), m_backEnd( end ) { - + if (end ) + end->setFrontend( this ); } template <class T> OPimAccessTemplate<T>::~OPimAccessTemplate() { qWarning("~OPimAccessTemplate<T>"); delete m_backEnd; } template <class T> bool OPimAccessTemplate<T>::load() { + invalidateCache(); return m_backEnd->load(); } template <class T> bool OPimAccessTemplate<T>::reload() { @@ -153,8 +170,28 @@ OPimAccessTemplate<T>::queryByExample( const T& t, int sortOrder ) { } template <class T> T OPimAccessTemplate<T>::find( int uid ) const{ T t = m_backEnd->find( uid ); + cache( t ); + return t; +} +template <class T> +T OPimAccessTemplate<T>::find( int uid, const QArray<int>& ar, + uint current, CacheDirection dir )const { + /* + * better do T.isEmpty() + * after a find this way we would + * avoid two finds in QCache... + */ + // qWarning("find it now %d", uid ); + if (m_cache.contains( uid ) ) { + qWarning("m cache contains %d", uid); + return m_cache.find( uid ); + } + + T t = m_backEnd->find( uid, ar, current, dir ); + qWarning("found it and cache it now %d", uid); + cache( t ); return t; } template <class T> void OPimAccessTemplate<T>::clear() { @@ -162,25 +199,28 @@ void OPimAccessTemplate<T>::clear() { m_backEnd->clear(); } template <class T> bool OPimAccessTemplate<T>::add( const T& t ) { + cache( t ); return m_backEnd->add( t ); } template <class T> bool OPimAccessTemplate<T>::remove( const T& t ) { - return m_backEnd->remove( t.uid() ); + return remove( t.uid() ); } template <class T> bool OPimAccessTemplate<T>::remove( int uid ) { + m_cache.remove( uid ); return m_backEnd->remove( uid ); } template <class T> bool OPimAccessTemplate<T>::replace( const T& t ) { + m_cache.replace( t ); return m_backEnd->replace( t ); } template <class T> void OPimAccessTemplate<T>::invalidateCache() { - + m_cache.invalidate(); } template <class T> OPimAccessTemplate<T>::BackEnd* OPimAccessTemplate<T>::backEnd() { return m_backEnd; @@ -191,6 +231,17 @@ bool OPimAccessTemplate<T>::wasChangedExternally()const { } template <class T> void OPimAccessTemplate<T>::setBackEnd( BackEnd* end ) { m_backEnd = end; + if (m_backEnd ) + m_backEnd->setFrontend( this ); +} +template <class T> +void OPimAccessTemplate<T>::cache( const T& t ) const{ + /* hacky we need to work around the const*/ + ((OPimAccessTemplate<T>*)this)->m_cache.add( t ); +} +template <class T> +void OPimAccessTemplate<T>::setSaneCacheSize( int size ) { + m_cache.setSize( size ); } #endif |