author | zecke <zecke> | 2002-10-10 17:08:58 (UTC) |
---|---|---|
committer | zecke <zecke> | 2002-10-10 17:08:58 (UTC) |
commit | 1dcc1b1fc9fd35d959255452c8b5be1269ca4f44 (patch) (side-by-side diff) | |
tree | 469d239dec74f5751f3aced43c4bae1f0f3a42e3 /libopie2/opiepim/core | |
parent | aa38f642a07810515dcc18ea38bf520e26d7f88e (diff) | |
download | opie-1dcc1b1fc9fd35d959255452c8b5be1269ca4f44.zip opie-1dcc1b1fc9fd35d959255452c8b5be1269ca4f44.tar.gz opie-1dcc1b1fc9fd35d959255452c8b5be1269ca4f44.tar.bz2 |
The Cache is finally in place
I tested it with my todolist and it 'works' for 10.000 todos the hits are awesome ;)
The read ahead functionality does not make sense for XMLs backends because most of the stuff is already in memory. While using readahead on SQL makes things a lot faster....
I still have to fully implement read ahead
This change is bic but sc
-rw-r--r-- | libopie2/opiepim/core/opimaccesstemplate.h | 57 | ||||
-rw-r--r-- | libopie2/opiepim/core/opimcache.h | 117 | ||||
-rw-r--r-- | libopie2/opiepim/core/otemplatebase.h | 11 |
3 files changed, 182 insertions, 3 deletions
diff --git a/libopie2/opiepim/core/opimaccesstemplate.h b/libopie2/opiepim/core/opimaccesstemplate.h index 31ab516..92d7192 100644 --- a/libopie2/opiepim/core/opimaccesstemplate.h +++ b/libopie2/opiepim/core/opimaccesstemplate.h @@ -7,6 +7,7 @@ #include <opie/opimaccessbackend.h> #include <opie/orecordlist.h> +#include "opimcache.h" #include "otemplatebase.h" /** @@ -23,6 +24,7 @@ class OPimAccessTemplate : public OTemplateBase<T> { public: typedef ORecordList<T> List; typedef OPimAccessBackend<T> BackEnd; + typedef OPimCache<T> Cache; /** * our sort order @@ -73,6 +75,12 @@ public: */ 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 @@ -99,6 +107,12 @@ public: * replace T from backend */ virtual bool replace( const T& t) ; + + /** + * @internal + */ + void cache( const T& )const; + void setSaneCacheSize( int ); protected: /** * invalidate the cache @@ -111,6 +125,7 @@ protected: */ BackEnd* backEnd(); BackEnd* m_backEnd; + Cache m_cache; }; @@ -118,7 +133,8 @@ template <class T> OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end ) : OTemplateBase<T>(), m_backEnd( end ) { - + if (end ) + end->setFrontend( this ); } template <class T> OPimAccessTemplate<T>::~OPimAccessTemplate() { @@ -127,6 +143,7 @@ OPimAccessTemplate<T>::~OPimAccessTemplate() { } template <class T> bool OPimAccessTemplate<T>::load() { + invalidateCache(); return m_backEnd->load(); } template <class T> @@ -154,6 +171,26 @@ 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> @@ -163,23 +200,26 @@ void OPimAccessTemplate<T>::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() { @@ -192,5 +232,16 @@ 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 diff --git a/libopie2/opiepim/core/opimcache.h b/libopie2/opiepim/core/opimcache.h new file mode 100644 index 0000000..067f6e7 --- a/dev/null +++ b/libopie2/opiepim/core/opimcache.h @@ -0,0 +1,117 @@ +#ifndef OPIE_PIM_CACHE_H +#define OPIE_PIM_CACHE_H + +#include <qintcache.h> + +#include "opimrecord.h" + +template <class T = OPimRecord> +class OPimCacheItem { +public: + OPimCacheItem( const T& t = T() ); + ~OPimCacheItem(); + + T record()const; + void setRecord( const T& ); +private: + T m_t; +}; + +/** + * OPimCache for caching the items + * We support adding, removing + * and finding + */ +template <class T = OPimRecord> +class OPimCache { +public: + typedef OPimCacheItem<T> Item; + OPimCache(); + ~OPimCache(); + + bool contains(int uid)const; + void invalidate(); + void setSize( int size ); + + T find(int uid )const; + void add( const T& ); + void remove( int uid ); + void replace( const T& ); + +private: + QIntCache<Item> m_cache; +}; + +// Implementation +template <class T> +OPimCacheItem<T>::OPimCacheItem( const T& t ) + : m_t(t) { +} +template <class T> +OPimCacheItem<T>::~OPimCacheItem() { + +} +template <class T> +T OPimCacheItem<T>::record()const { + return m_t; +} +template <class T> +void OPimCacheItem<T>::setRecord( const T& t ) { + m_t = t; +} +// Cache +template <class T> +OPimCache<T>::OPimCache() { + m_cache.setAutoDelete( TRUE ); +} +template <class T> +OPimCache<T>::~OPimCache() { + +} +template <class T> +bool OPimCache<T>::contains(int uid )const { + Item* it = m_cache.find( uid, FALSE ); + if (!it) + return false; + return true; +} +template <class T> +void OPimCache<T>::invalidate() { + m_cache.clear(); +} +template <class T> +void OPimCache<T>::setSize( int size ) { + m_cache.setMaxCost( size ); +} +template <class T> +T OPimCache<T>::find(int uid )const { + Item *it = m_cache.find( uid ); + if (it) + return it->record(); + return T(); +} +template <class T> +void OPimCache<T>::add( const T& t ) { + Item* it = 0l; + it = m_cache.find(t.uid(), FALSE ); + + if (it ) + it->setRecord( t ); + + it = new Item( t ); + if (!m_cache.insert( t.uid(), it ) ) + delete it; +} +template <class T> +void OPimCache<T>::remove( int uid ) { + m_cache.remove( uid ); +} +template <class T> +void OPimCache<T>::replace( const T& t) { + Item *it = m_cache.find( t.uid() ); + if ( it ) { + it->setRecord( t ); + } +} + +#endif diff --git a/libopie2/opiepim/core/otemplatebase.h b/libopie2/opiepim/core/otemplatebase.h index f71417b..b855919 100644 --- a/libopie2/opiepim/core/otemplatebase.h +++ b/libopie2/opiepim/core/otemplatebase.h @@ -1,6 +1,8 @@ #ifndef OPIE_TEMPLATE_BASE_H #define OPIE_TEMPLATE_BASE_H +#include <qarray.h> + #include "opimrecord.h" /** @@ -9,12 +11,21 @@ template <class T = OPimRecord> class OTemplateBase { public: + enum CacheDirection { Forward=0, Reverse }; OTemplateBase() { }; virtual ~OTemplateBase() { } virtual T find( int uid )const = 0; + /** + * read ahead find + */ + virtual T find( int uid, const QArray<int>& items, + uint current, CacheDirection dir = Forward )const = 0; + virtual void cache( const T& )const = 0; + virtual void setSaneCacheSize( int ) = 0; + }; |