summaryrefslogtreecommitdiff
path: root/libopie2/opiepim/core
authoreilers <eilers>2004-08-29 12:50:18 (UTC)
committer eilers <eilers>2004-08-29 12:50:18 (UTC)
commit679d9fef2673eea18fe5d9c85df2b10b09a8a250 (patch) (unidiff)
tree8b3d6dbef45568be6f5daac31094d6e599fdefdf /libopie2/opiepim/core
parent45327ef3c0f093fc227682f79158632afc09e6d1 (diff)
downloadopie-679d9fef2673eea18fe5d9c85df2b10b09a8a250.zip
opie-679d9fef2673eea18fe5d9c85df2b10b09a8a250.tar.gz
opie-679d9fef2673eea18fe5d9c85df2b10b09a8a250.tar.bz2
Added lookahead caching for addressbook (SQL-only) for speed improvement.
Diffstat (limited to 'libopie2/opiepim/core') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/core/opimaccesstemplate.h40
-rw-r--r--libopie2/opiepim/core/opimtemplatebase.h16
2 files changed, 45 insertions, 11 deletions
diff --git a/libopie2/opiepim/core/opimaccesstemplate.h b/libopie2/opiepim/core/opimaccesstemplate.h
index 55d600a..6f01b46 100644
--- a/libopie2/opiepim/core/opimaccesstemplate.h
+++ b/libopie2/opiepim/core/opimaccesstemplate.h
@@ -32,13 +32,12 @@
32 32
33/* OPIE */ 33/* OPIE */
34#include <opie2/opimrecord.h> 34#include <opie2/opimrecord.h>
35#include <opie2/opimaccessbackend.h> 35#include <opie2/opimaccessbackend.h>
36#include <opie2/opimrecordlist.h> 36#include <opie2/opimrecordlist.h>
37 37
38#include <opie2/opimcache.h>
39#include <opie2/opimtemplatebase.h> 38#include <opie2/opimtemplatebase.h>
40#include <opie2/odebug.h> 39#include <opie2/odebug.h>
41 40
42/* QT */ 41/* QT */
43#include <qarray.h> 42#include <qarray.h>
44 43
@@ -125,30 +124,33 @@ public:
125 /** 124 /**
126 * read ahead cache find method ;) 125 * read ahead cache find method ;)
127 */ 126 */
128 virtual T find( int uid, const QArray<int>&, 127 virtual T find( int uid, const QArray<int>&,
129 uint current, typename OTemplateBase<T>::CacheDirection dir = OTemplateBase<T>::Forward )const; 128 uint current, typename OTemplateBase<T>::CacheDirection dir = OTemplateBase<T>::Forward )const;
130 129
130
131 /* invalidate cache here */ 131 /* invalidate cache here */
132 /** 132 /**
133 * clears the backend and invalidates the backend 133 * clears the backend and invalidates the backend
134 */ 134 */
135 void clear() ; 135 void clear() ;
136 136
137 /** 137 /**
138 * add T to the backend 138 * add T to the backend
139 * @param t The item to add. 139 * @param t The item to add.
140 * @return <i>true</i> if added successfully. 140 * @return <i>true</i> if added successfully.
141 */ 141 */
142 virtual bool add( const T& t ) ; 142 virtual bool add( const T& t ) ;
143
143 bool add( const OPimRecord& ); 144 bool add( const OPimRecord& );
144 // Needed for real generic access (eilers) 145 /**
145 // Info: Take this if you are working with OPimRecord, which is a generic base class, and 146 * Add an Opie PimRecord.
146 // you need to add it into any database, you cannot generate a reference to 147 * Info: Take this if you are working with OPimRecords and you need to add it into any database.
147 // it and casting may be not approriate, too. 148 * But take care that the accessing database is compatible to the real type of OPimRecord !!
148 // But take care that the accessing database is compatible to the real type of OPimRecord !! 149 * Otherwise this access will be rejected !
150 */
149 bool add( const OPimRecord* ); 151 bool add( const OPimRecord* );
150 152
151 153
152 /* only the uid matters */ 154 /* only the uid matters */
153 /** 155 /**
154 * remove T from the backend 156 * remove T from the backend
@@ -173,12 +175,13 @@ public:
173 virtual bool replace( const T& t) ; 175 virtual bool replace( const T& t) ;
174 176
175 void setReadAhead( uint count ); 177 void setReadAhead( uint count );
176 /** 178 /**
177 * @internal 179 * @internal
178 */ 180 */
181 virtual T cacheFind( int uid )const;
179 void cache( const T& )const; 182 void cache( const T& )const;
180 void setSaneCacheSize( int ); 183 void setSaneCacheSize( int );
181 184
182 QArray<int> records()const; 185 QArray<int> records()const;
183protected: 186protected:
184 /** 187 /**
@@ -189,12 +192,13 @@ protected:
189 void setBackEnd( BackEnd* end ); 192 void setBackEnd( BackEnd* end );
190 /** 193 /**
191 * returns the backend 194 * returns the backend
192 */ 195 */
193 BackEnd* backEnd(); 196 BackEnd* backEnd();
194 BackEnd* m_backEnd; 197 BackEnd* m_backEnd;
198
195 Cache m_cache; 199 Cache m_cache;
196 200
197private: 201private:
198 OPimAccessTemplatePrivate *d; 202 OPimAccessTemplatePrivate *d;
199 203
200}; 204};
@@ -215,13 +219,13 @@ template <class T>
215bool OPimAccessTemplate<T>::load() { 219bool OPimAccessTemplate<T>::load() {
216 invalidateCache(); 220 invalidateCache();
217 return m_backEnd->load(); 221 return m_backEnd->load();
218} 222}
219template <class T> 223template <class T>
220bool OPimAccessTemplate<T>::reload() { 224bool OPimAccessTemplate<T>::reload() {
221 invalidateCache(); // zecke: I think this should be added (se) 225 invalidateCache();
222 return m_backEnd->reload(); 226 return m_backEnd->reload();
223} 227}
224template <class T> 228template <class T>
225bool OPimAccessTemplate<T>::save() { 229bool OPimAccessTemplate<T>::save() {
226 return m_backEnd->save(); 230 return m_backEnd->save();
227} 231}
@@ -248,26 +252,38 @@ OPimAccessTemplate<T>::queryByExample( const T& t, int settings, const QDateTime
248 252
249 List lis(ints, this ); 253 List lis(ints, this );
250 return lis; 254 return lis;
251} 255}
252template <class T> 256template <class T>
253T OPimAccessTemplate<T>::find( int uid ) const{ 257T OPimAccessTemplate<T>::find( int uid ) const{
258 // First search in cache..
259 if ( m_cache.contains( uid ) )
260 return m_cache.find( uid );
261
254 T t = m_backEnd->find( uid ); 262 T t = m_backEnd->find( uid );
255 cache( t ); 263 cache( t );
264
256 return t; 265 return t;
257} 266}
267
268template <class T>
269T OPimAccessTemplate<T>::cacheFind( int uid ) const
270{
271 return m_cache.find( uid );
272}
273
258template <class T> 274template <class T>
259T OPimAccessTemplate<T>::find( int uid, const QArray<int>& ar, 275T OPimAccessTemplate<T>::find( int uid, const QArray<int>& ar,
260 uint current, typename OTemplateBase<T>::CacheDirection dir )const { 276 uint current, typename OTemplateBase<T>::CacheDirection dir )const {
261 /* 277 /*
262 * better do T.isEmpty() 278 * better do T.isEmpty()
263 * after a find this way we would 279 * after a find this way we would
264 * avoid two finds in QCache... 280 * avoid two finds in QCache...
265 */ 281 */
266 // owarn << "find it now " << uid << oendl; 282 // owarn << "find it now " << uid << oendl;
267 if (m_cache.contains( uid ) ) { 283 if ( m_cache.contains( uid ) ) {
268 return m_cache.find( uid ); 284 return m_cache.find( uid );
269 } 285 }
270 286
271 T t = m_backEnd->find( uid, ar, current, dir ); 287 T t = m_backEnd->find( uid, ar, current, dir );
272 cache( t ); 288 cache( t );
273 return t; 289 return t;
@@ -281,29 +297,33 @@ template <class T>
281bool OPimAccessTemplate<T>::add( const T& t ) { 297bool OPimAccessTemplate<T>::add( const T& t ) {
282 cache( t ); 298 cache( t );
283 return m_backEnd->add( t ); 299 return m_backEnd->add( t );
284} 300}
285 301
286template <class T> 302template <class T>
287bool OPimAccessTemplate<T>::add( const OPimRecord& rec) { 303bool OPimAccessTemplate<T>::add( const OPimRecord& rec ) {
288 /* same type */ 304 /* same type */
289 T tempInstance; 305 T tempInstance;
290 if ( rec.rtti() == tempInstance.rtti() ) { 306 if ( rec.rtti() == tempInstance.rtti() ) {
291 const T& t = static_cast<const T&>(rec); 307 const T& t = static_cast<const T&>(rec);
292 return add(t); 308 return add(t);
309 } else {
310 owarn << "Adding not possible: Objecttype mismatch" << oendl;
293 } 311 }
294 return false; 312 return false;
295} 313}
296 314
297template <class T> 315template <class T>
298bool OPimAccessTemplate<T>::add( const OPimRecord* rec) { 316bool OPimAccessTemplate<T>::add( const OPimRecord* rec) {
299 /* same type, but pointer */ 317 /* same type, but pointer */
300 T tempInstance; 318 T tempInstance;
301 if ( rec -> rtti() == tempInstance.rtti() ) { 319 if ( rec -> rtti() == tempInstance.rtti() ) {
302 const T* t = static_cast<const T*>(rec); 320 const T* t = static_cast<const T*>(rec);
303 return add( *t ); 321 return add( *t );
322 } else {
323 owarn << "Adding not possible: Objecttype mismatch" << oendl;
304 } 324 }
305 return false; 325 return false;
306} 326}
307 327
308template <class T> 328template <class T>
309bool OPimAccessTemplate<T>::remove( const T& t ) { 329bool OPimAccessTemplate<T>::remove( const T& t ) {
diff --git a/libopie2/opiepim/core/opimtemplatebase.h b/libopie2/opiepim/core/opimtemplatebase.h
index b48dfed..ec9a94e 100644
--- a/libopie2/opiepim/core/opimtemplatebase.h
+++ b/libopie2/opiepim/core/opimtemplatebase.h
@@ -28,12 +28,13 @@
28*/ 28*/
29#ifndef OTEMPLATEBASE_H 29#ifndef OTEMPLATEBASE_H
30#define OTEMPLATEBASE_H 30#define OTEMPLATEBASE_H
31 31
32/* OPIE */ 32/* OPIE */
33#include <opie2/opimrecord.h> 33#include <opie2/opimrecord.h>
34#include <opie2/opimcache.h>
34 35
35/* QT */ 36/* QT */
36#include <qarray.h> 37#include <qarray.h>
37 38
38namespace Opie { 39namespace Opie {
39/** 40/**
@@ -67,36 +68,49 @@ struct OPimBase {
67private: 68private:
68 OPimBasePrivate* d; 69 OPimBasePrivate* d;
69 70
70}; 71};
71/** 72/**
72 * internal template base 73 * internal template base
73 * T needs to implement the copy c'tor!!! 74 * Attention: T needs to implement the copy c'tor!!!
74 */ 75 */
75class OTemplateBasePrivate; 76class OTemplateBasePrivate;
76template <class T = OPimRecord> 77template <class T = OPimRecord>
77class OTemplateBase : public OPimBase { 78class OTemplateBase : public OPimBase {
78public: 79public:
80 /** Look ahead direction of cache */
79 enum CacheDirection { Forward=0, Reverse }; 81 enum CacheDirection { Forward=0, Reverse };
82
80 OTemplateBase() { 83 OTemplateBase() {
81 }; 84 };
82 virtual ~OTemplateBase() { 85 virtual ~OTemplateBase() {
83 } 86 }
84 virtual T find( int uid )const = 0; 87 virtual T find( int uid )const = 0;
85 88
86 /** 89 /**
87 * read ahead find 90 * read ahead find
88 */ 91 */
89 virtual T find( int uid, const QArray<int>& items, 92 virtual T find( int uid, const QArray<int>& items,
90 uint current, CacheDirection dir = Forward )const = 0; 93 uint current, CacheDirection dir = Forward )const = 0;
94
95 /**
96 * Find in Cache..
97 * Returns empty object if nothing found.
98 */
99 virtual T cacheFind( int uid )const = 0;
100
101 /**
102 * Put element into Cache
103 */
91 virtual void cache( const T& )const = 0; 104 virtual void cache( const T& )const = 0;
92 virtual void setSaneCacheSize( int ) = 0; 105 virtual void setSaneCacheSize( int ) = 0;
93 106
94 OPimRecord* record()const; 107 OPimRecord* record()const;
95 OPimRecord* record(int uid )const; 108 OPimRecord* record(int uid )const;
96 static T* rec(); 109 static T* rec();
110
97 111
98private: 112private:
99 OTemplateBasePrivate *d; 113 OTemplateBasePrivate *d;
100}; 114};
101 115
102 116