summaryrefslogtreecommitdiff
path: root/libopie2/opiepim/core/opimaccesstemplate.h
Unidiff
Diffstat (limited to 'libopie2/opiepim/core/opimaccesstemplate.h') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/core/opimaccesstemplate.h351
1 files changed, 250 insertions, 101 deletions
diff --git a/libopie2/opiepim/core/opimaccesstemplate.h b/libopie2/opiepim/core/opimaccesstemplate.h
index f936d4e..2deb92a 100644
--- a/libopie2/opiepim/core/opimaccesstemplate.h
+++ b/libopie2/opiepim/core/opimaccesstemplate.h
@@ -1,7 +1,7 @@
1/* 1/*
2 This file is part of the Opie Project 2 This file is part of the Opie Project
3 Copyright (C) Holger Freyther <zecke@handhelds.org> 3 Copyright (C) Holger Freyther <zecke@handhelds.org>
4 Copyright (C) Stefan Eilers <eilers.stefan@epost.de> 4 Copyright (C) Stefan Eilers <eilers.stefan@epost.de>
5 =. Copyright (C) The Opie Team <opie-devel@handhelds.org> 5 =. Copyright (C) The Opie Team <opie-devel@handhelds.org>
6 .=l. 6 .=l.
7 .>+-= 7 .>+-=
@@ -40,6 +40,7 @@
40 40
41/* QT */ 41/* QT */
42#include <qarray.h> 42#include <qarray.h>
43#include <qdatetime.h>
43 44
44namespace Opie { 45namespace Opie {
45 46
@@ -56,6 +57,9 @@ class OPimAccessTemplatePrivate;
56template <class T = OPimRecord > 57template <class T = OPimRecord >
57class OPimAccessTemplate : public OTemplateBase<T> { 58class OPimAccessTemplate : public OTemplateBase<T> {
58public: 59public:
60 /**
61 *
62 */
59 enum Access { 63 enum Access {
60 Random = 0, 64 Random = 0,
61 SortedAccess 65 SortedAccess
@@ -64,124 +68,72 @@ public:
64 typedef OPimAccessBackend<T> BackEnd; 68 typedef OPimAccessBackend<T> BackEnd;
65 typedef OPimCache<T> Cache; 69 typedef OPimCache<T> Cache;
66 70
67 /** 71 //@{
68 * c'tor BackEnd
69 * enum Access a small hint on how to handle the backend
70 */
71 OPimAccessTemplate( BackEnd* end); 72 OPimAccessTemplate( BackEnd* end);
72
73 virtual ~OPimAccessTemplate(); 73 virtual ~OPimAccessTemplate();
74 //@}
74 75
75 /** 76 //@{
76 * load from the backend
77 */
78 bool load(); 77 bool load();
79
80 /** Reload database.
81 * You should execute this function if the external database
82 * was changed.
83 * This function will load the external database and afterwards
84 * rejoin the local changes. Therefore the local database will be set consistent.
85 */
86 virtual bool reload(); 78 virtual bool reload();
87
88 /** Save contacts database.
89 * Save is more a "commit". After calling this function, all changes are public available.
90 * @return true if successful
91 */
92 bool save(); 79 bool save();
80 void clear() ;
81 //@}
82
93 83
94 /**
95 * if the resource was changed externally
96 * You should use the signal handling instead of polling possible changes !
97 * zecke: Do you implement a signal for otodoaccess ?
98 */
99 bool wasChangedExternally()const; 84 bool wasChangedExternally()const;
100 85
101 /** 86 //@{
102 * return a List of records
103 * you can iterate over them
104 */
105 virtual List allRecords()const; 87 virtual List allRecords()const;
106
107 /**
108 * return a List of records
109 * that match the regex
110 */
111 virtual List matchRegexp( const QRegExp &r ) const; 88 virtual List matchRegexp( const QRegExp &r ) const;
112
113 /**
114 * queryByExample.
115 * @see otodoaccess, ocontactaccess
116 */
117 virtual List queryByExample( const T& t, int querySettings, const QDateTime& d = QDateTime() ); 89 virtual List queryByExample( const T& t, int querySettings, const QDateTime& d = QDateTime() );
90 virtual T find( UID uid )const;
91 virtual T find( UID uid, const QArray<int>&,
92 uint current, typename OTemplateBase<T>::CacheDirection dir = OTemplateBase<T>::Forward )const;
93 virtual List sorted( const List&, bool ascending, int sortOrder,
94 int sortFilter, int cat )const;
95 virtual List sorted( const List&, bool ascending, int sortOrder,
96 int sortFilter, const QArray<UID>& cats )const;
97 virtual List sorted( bool ascending, int sortOrder, int sortFilter, int cat )const;
98 virtual List sorted( bool ascending, int sortOrder, int sortOrder,
99 const QArray<UID>& cats )const;
100 //@}
118 101
119 /** 102 /**
120 * find the OPimRecord uid 103 * (Re)Implementation
121 */
122 T find( int uid )const;
123
124 /**
125 * read ahead cache find method ;)
126 */
127 T find( int uid, const QArray<int>&,
128 uint current, typename OTemplateBase<T>::CacheDirection dir = OTemplateBase<T>::Forward )const;
129
130
131 /* invalidate cache here */
132 /**
133 * clears the backend and invalidates the backend
134 */ 104 */
135 void clear() ; 105 //@{
136 106 UIDArray matchRegexpSimple( const QRegExp& r )const;
137 /** 107 UIDArray queryByExampleSimple( const OPimRecord*, int, const QDateTime& )const;
138 * add T to the backend 108 UIDArray sortedSimple( const UIDArray&, bool asc, int sortOrder,
139 * @param t The item to add. 109 int sortFilter, int cat )const;
140 * @return <i>true</i> if added successfully. 110 UIDArray sortedSimple( const UIDArray&, bool asc, int sortOrder,
141 */ 111 int sortFilter, const QArray<int>& )const;
142 virtual bool add( const T& t ) ; 112 UIDArray sortedSimple( bool ascending, int sortOrder, int sortFilter,
143 113 int cat )const;
114 UIDArray sortedSimple( bool ascending, int sortOrder, int sortFilter,
115 const QArray<int>& )const;
116 OPimOccurrence::List occurrences( const QDate& start, const QDate& end )const;
117 OPimOccurrence::List occurrences( const QDateTime& dt )const;
118 //@}
119
120 //@{
121 virtual bool add( const T& t ) ;
144 bool add( const OPimRecord& ); 122 bool add( const OPimRecord& );
145 /**
146 * Add an Opie PimRecord.
147 * Info: Take this if you are working with OPimRecords and you need to add it into any database.
148 * But take care that the accessing database is compatible to the real type of OPimRecord !!
149 * Otherwise this access will be rejected !
150 */
151 bool add( const OPimRecord* ); 123 bool add( const OPimRecord* );
152
153
154 /* only the uid matters */
155 /**
156 * remove T from the backend
157 * @param t The item to remove
158 * @return <i>true</i> if successful.
159 */
160 virtual bool remove( const T& t ); 124 virtual bool remove( const T& t );
161 125 bool remove( UID uid );
162 /**
163 * remove the OPimRecord with uid
164 * @param uid The ID of the item to remove
165 * @return <i>true</i> if successful.
166 */
167 bool remove( int uid );
168 bool remove( const OPimRecord& ); 126 bool remove( const OPimRecord& );
169
170 /**
171 * replace T from backend
172 * @param t The item to replace
173 * @return <i>true</i> if successful.
174 */
175 virtual bool replace( const T& t) ; 127 virtual bool replace( const T& t) ;
176 128
129 //@}
130
177 void setReadAhead( uint count ); 131 void setReadAhead( uint count );
178 /** 132 virtual T cacheFind( int uid )const;
179 * @internal
180 */
181 void cache( const T& )const; 133 void cache( const T& )const;
182 void setSaneCacheSize( int ); 134 void setSaneCacheSize( int );
183 135
184 QArray<int> records()const; 136 QArray<UID> records()const;
185protected: 137protected:
186 /** 138 /**
187 * invalidate the cache 139 * invalidate the cache
@@ -202,6 +154,10 @@ private:
202 154
203}; 155};
204 156
157/**
158 * c'tor BackEnd
159 * enum Access a small hint on how to handle the backend
160 */
205template <class T> 161template <class T>
206OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end ) 162OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end )
207 : OTemplateBase<T>(), m_backEnd( end ) 163 : OTemplateBase<T>(), m_backEnd( end )
@@ -211,39 +167,76 @@ OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end )
211} 167}
212template <class T> 168template <class T>
213OPimAccessTemplate<T>::~OPimAccessTemplate() { 169OPimAccessTemplate<T>::~OPimAccessTemplate() {
214 owarn << "~OPimAccessTemplate<T>" << oendl;
215 delete m_backEnd; 170 delete m_backEnd;
216} 171}
172
173/**
174 * load from the backend
175 */
217template <class T> 176template <class T>
218bool OPimAccessTemplate<T>::load() { 177bool OPimAccessTemplate<T>::load() {
219 invalidateCache(); 178 invalidateCache();
220 return m_backEnd->load(); 179 return m_backEnd->load();
221} 180}
181
182/** Reload database.
183 * You should execute this function if the external database
184 * was changed.
185 * This function will load the external database and afterwards
186 * rejoin the local changes. Therefore the local database will be set consistent.
187 */
222template <class T> 188template <class T>
223bool OPimAccessTemplate<T>::reload() { 189bool OPimAccessTemplate<T>::reload() {
224 invalidateCache(); 190 invalidateCache();
225 return m_backEnd->reload(); 191 return m_backEnd->reload();
226} 192}
193
194/**
195 * Save contacts database.
196 * Save is more a "commit". After calling this function, all changes are public available.
197 * @return true if successful
198 */
227template <class T> 199template <class T>
228bool OPimAccessTemplate<T>::save() { 200bool OPimAccessTemplate<T>::save() {
229 return m_backEnd->save(); 201 return m_backEnd->save();
230} 202}
203
204
205/**
206 * return a List of records
207 * you can iterate over them
208 */
231template <class T> 209template <class T>
232typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::allRecords()const { 210typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::allRecords()const {
233 QArray<int> ints = m_backEnd->allRecords(); 211 QArray<int> ints = m_backEnd->allRecords();
234 List lis(ints, this ); 212 List lis(ints, this );
235 return lis; 213 return lis;
236} 214}
215
216/**
217 * return a List of records
218 * that match the regex
219 */
237template <class T> 220template <class T>
238typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::matchRegexp( const QRegExp &r )const { 221typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::matchRegexp( const QRegExp &r )const {
239 QArray<int> ints = m_backEnd->matchRegexp( r ); 222 QArray<int> ints = m_backEnd->matchRegexp( r );
240 List lis(ints, this ); 223 List lis(ints, this );
241 return lis; 224 return lis;
242} 225}
226
227/**
228 * find the OPimRecord uid
229 */
243template <class T> 230template <class T>
244QArray<int> OPimAccessTemplate<T>::records()const { 231QArray<int> OPimAccessTemplate<T>::records()const {
245 return m_backEnd->allRecords(); 232 return m_backEnd->allRecords();
246} 233}
234
235
236/**
237 * queryByExample.
238 * @see otodoaccess, ocontactaccess
239 */
247template <class T> 240template <class T>
248typename OPimAccessTemplate<T>::List 241typename OPimAccessTemplate<T>::List
249OPimAccessTemplate<T>::queryByExample( const T& t, int settings, const QDateTime& d ) { 242OPimAccessTemplate<T>::queryByExample( const T& t, int settings, const QDateTime& d ) {
@@ -252,8 +245,9 @@ OPimAccessTemplate<T>::queryByExample( const T& t, int settings, const QDateTime
252 List lis(ints, this ); 245 List lis(ints, this );
253 return lis; 246 return lis;
254} 247}
248
255template <class T> 249template <class T>
256T OPimAccessTemplate<T>::find( int uid ) const{ 250T OPimAccessTemplate<T>::find( UID uid ) const{
257 // First search in cache.. 251 // First search in cache..
258 if ( m_cache.contains( uid ) ) 252 if ( m_cache.contains( uid ) )
259 return m_cache.find( uid ); 253 return m_cache.find( uid );
@@ -265,27 +259,46 @@ T OPimAccessTemplate<T>::find( int uid ) const{
265} 259}
266 260
267template <class T> 261template <class T>
268T OPimAccessTemplate<T>::find( int uid, const QArray<int>& ar, 262T OPimAccessTemplate<T>::cacheFind( int uid ) const
263{
264 return m_cache.find( uid );
265}
266
267/**
268 * read ahead cache find method ;)
269 */
270template <class T>
271T OPimAccessTemplate<T>::find( UID uid, const QArray<int>& ar,
269 uint current, typename OTemplateBase<T>::CacheDirection dir )const { 272 uint current, typename OTemplateBase<T>::CacheDirection dir )const {
270 /* 273 /*
271 * better do T.isEmpty() 274 * better do T.isEmpty()
272 * after a find this way we would 275 * after a find this way we would
273 * avoid two finds in QCache... 276 * avoid two finds in QCache...
274 */ 277 */
275 // owarn << "find it now " << uid << oendl; 278 if (m_cache.contains( uid ) )
276 if ( m_cache.contains( uid ) ) {
277 return m_cache.find( uid ); 279 return m_cache.find( uid );
278 } 280
279 281
280 T t = m_backEnd->find( uid, ar, current, dir ); 282 T t = m_backEnd->find( uid, ar, current, dir );
281 cache( t ); 283 cache( t );
282 return t; 284 return t;
283} 285}
286
287/**
288 * clears the backend and invalidates the backend
289 */
284template <class T> 290template <class T>
285void OPimAccessTemplate<T>::clear() { 291void OPimAccessTemplate<T>::clear() {
286 invalidateCache(); 292 invalidateCache();
287 m_backEnd->clear(); 293 m_backEnd->clear();
288} 294}
295
296
297/**
298 * add T to the backend
299 * @param t The item to add.
300 * @return <i>true</i> if added successfully.
301 */
289template <class T> 302template <class T>
290bool OPimAccessTemplate<T>::add( const T& t ) { 303bool OPimAccessTemplate<T>::add( const T& t ) {
291 cache( t ); 304 cache( t );
@@ -305,6 +318,12 @@ bool OPimAccessTemplate<T>::add( const OPimRecord& rec ) {
305 return false; 318 return false;
306} 319}
307 320
321/**
322 * Add an Opie PimRecord.
323 * Info: Take this if you are working with OPimRecords and you need to add it into any database.
324 * But take care that the accessing database is compatible to the real type of OPimRecord !!
325 * Otherwise this access will be rejected !
326 */
308template <class T> 327template <class T>
309bool OPimAccessTemplate<T>::add( const OPimRecord* rec) { 328bool OPimAccessTemplate<T>::add( const OPimRecord* rec) {
310 /* same type, but pointer */ 329 /* same type, but pointer */
@@ -318,12 +337,23 @@ bool OPimAccessTemplate<T>::add( const OPimRecord* rec) {
318 return false; 337 return false;
319} 338}
320 339
340/**
341 * remove T from the backend
342 * @param t The item to remove
343 * @return <i>true</i> if successful.
344 */
321template <class T> 345template <class T>
322bool OPimAccessTemplate<T>::remove( const T& t ) { 346bool OPimAccessTemplate<T>::remove( const T& t ) {
323 return remove( t.uid() ); 347 return remove( t.uid() );
324} 348}
349
350/**
351 * remove the OPimRecord with uid
352 * @param uid The ID of the item to remove
353 * @return <i>true</i> if successful.
354 */
325template <class T> 355template <class T>
326bool OPimAccessTemplate<T>::remove( int uid ) { 356bool OPimAccessTemplate<T>::remove( UID uid ) {
327 m_cache.remove( uid ); 357 m_cache.remove( uid );
328 return m_backEnd->remove( uid ); 358 return m_backEnd->remove( uid );
329} 359}
@@ -331,11 +361,21 @@ template <class T>
331bool OPimAccessTemplate<T>::remove( const OPimRecord& rec) { 361bool OPimAccessTemplate<T>::remove( const OPimRecord& rec) {
332 return remove( rec.uid() ); 362 return remove( rec.uid() );
333} 363}
364
365/**
366 * replace T from backend
367 * @param t The item to replace
368 * @return <i>true</i> if successful.
369 */
334template <class T> 370template <class T>
335bool OPimAccessTemplate<T>::replace( const T& t ) { 371bool OPimAccessTemplate<T>::replace( const T& t ) {
336 m_cache.replace( t ); 372 m_cache.replace( t );
337 return m_backEnd->replace( t ); 373 return m_backEnd->replace( t );
338} 374}
375
376/**
377 * @internal
378 */
339template <class T> 379template <class T>
340void OPimAccessTemplate<T>::invalidateCache() { 380void OPimAccessTemplate<T>::invalidateCache() {
341 m_cache.invalidate(); 381 m_cache.invalidate();
@@ -344,6 +384,12 @@ template <class T>
344typename OPimAccessTemplate<T>::BackEnd* OPimAccessTemplate<T>::backEnd() { 384typename OPimAccessTemplate<T>::BackEnd* OPimAccessTemplate<T>::backEnd() {
345 return m_backEnd; 385 return m_backEnd;
346} 386}
387
388/**
389 * if the resource was changed externally
390 * You should use the signal handling instead of polling possible changes !
391 * zecke: Do you implement a signal for otodoaccess ?
392 */
347template <class T> 393template <class T>
348bool OPimAccessTemplate<T>::wasChangedExternally()const { 394bool OPimAccessTemplate<T>::wasChangedExternally()const {
349 return false; 395 return false;
@@ -368,6 +414,109 @@ void OPimAccessTemplate<T>::setReadAhead( uint count ) {
368 m_backEnd->setReadAhead( count ); 414 m_backEnd->setReadAhead( count );
369} 415}
370 416
417
418template <class T>
419typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::sorted( const OPimAccessTemplate::List& lst,
420 bool ascending, int sortOrder,
421 int sortFilter, int cat )const {
422 QArray<int> cats( 1 );
423 cats[0] = cat;
424 UIDArray ints = m_backEnd->sorted( lst.uids(), ascending, sortOrder,
425 sortFilter, cats );
426 return List(ints, this);
427}
428
429template<class T>
430typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::sorted( const OPimAccessTemplate::List& lst,
431 bool ascending, int sortOrder,
432 int sortFilter, const QArray<UID>& cats )const {
433 UIDArray ints = m_backEnd->sorted( lst.uids(), ascending, sortOrder,
434 sortFilter, cats );
435 return List(ints, this);
436}
437
438template<class T>
439typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::sorted( bool ascending, int sortOrder,
440 int sortFilter, int cat )const {
441 QArray<int> cats( 1 );
442 cats[0] = cat;
443 UIDArray ints = m_backEnd->sorted( ascending, sortOrder,
444 sortFilter, cats );
445 return List(ints, this);
446}
447
448template<class T>
449typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::sorted( bool ascending, int sortOrder,
450 int sortFilter, const QArray<UID>& cats )const {
451 UIDArray ints = m_backEnd->sorted( ascending, sortOrder,
452 sortFilter, cats );
453 return List(ints, this);
454}
455
456template <class T>
457OPimOccurrence::List OPimAccessTemplate<T>::occurrences( const QDate& start,
458 const QDate& end ) const {
459 /*
460 * Some magic involved to go from single OPimBackendOccurrence
461 * to multiple OPimOccurrence's
462 */
463 return OPimBase::convertOccurrenceFromBackend( m_backEnd->occurrences( start, end ) );
464}
465
466template<class T>
467OPimOccurrence::List OPimAccessTemplate<T>::occurrences( const QDateTime& dt )const {
468 return OPimBase::convertOccurrenceFromBackend( m_backEnd->occurrences( dt ) );
469}
470
471/*
472 *Implementations!!
473 */
474template <class T>
475UIDArray OPimAccessTemplate<T>::matchRegexpSimple( const QRegExp &r )const {
476 return m_backEnd->matchRegexp( r );
477}
478
479template <class T>
480UIDArray OPimAccessTemplate<T>::queryByExampleSimple( const OPimRecord* rec,
481 int settings,
482 const QDateTime& d )const {
483 return m_backEnd->queryByExample( rec, settings, d );
484}
485
486template <class T>
487UIDArray OPimAccessTemplate<T>::sortedSimple( const UIDArray& lst,
488 bool ascending,
489 int sortOrder, int sortFilter,
490 int cat ) const{
491 QArray<int> cats( 1 );
492 cats[0] = cat;
493 return m_backEnd->sorted( lst, ascending, sortOrder, sortFilter, cats );
494}
495
496template <class T>
497UIDArray OPimAccessTemplate<T>::sortedSimple( const UIDArray& lst,
498 bool ascending,
499 int sortOrder, int sortFilter,
500 const QArray<int>& cats ) const{
501 return m_backEnd->sorted( lst, ascending, sortOrder, sortFilter, cats );
502}
503
504template <class T>
505UIDArray OPimAccessTemplate<T>::sortedSimple( bool ascending,
506 int sortOrder, int sortFilter,
507 int cat ) const{
508 QArray<int> cats( 1 );
509 cats[0] = cat;
510
511 return m_backEnd->sorted( ascending, sortOrder, sortFilter, cats );
512}
513
514template <class T>
515UIDArray OPimAccessTemplate<T>::sortedSimple( bool ascending,
516 int sortOrder, int sortFilter,
517 const QArray<int>& cats ) const{
518 return m_backEnd->sorted( ascending, sortOrder, sortFilter, cats );
519}
371} 520}
372 521
373#endif 522#endif