00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef OPIE_PIM_ACCESS_TEMPLATE_H
00031 #define OPIE_PIM_ACCESS_TEMPLATE_H
00032
00033
00034 #include <opie2/opimrecord.h>
00035 #include <opie2/opimaccessbackend.h>
00036 #include <opie2/opimrecordlist.h>
00037
00038 #include <opie2/opimtemplatebase.h>
00039 #include <opie2/odebug.h>
00040
00041
00042 #include <qarray.h>
00043 #include <qdatetime.h>
00044
00045 namespace Opie {
00046
00047 class OPimAccessTemplatePrivate;
00057 template <class T = OPimRecord >
00058 class OPimAccessTemplate : public OTemplateBase<T> {
00059 public:
00063 enum Access {
00064 Random = 0,
00065 SortedAccess
00066 };
00067 typedef OPimRecordList<T> List;
00068 typedef OPimAccessBackend<T> BackEnd;
00069 typedef OPimCache<T> Cache;
00070
00072 OPimAccessTemplate( BackEnd* end);
00073 virtual ~OPimAccessTemplate();
00075
00077 bool load();
00078 virtual bool reload();
00079 bool save();
00080 void clear() ;
00082
00083
00084 bool wasChangedExternally()const;
00085
00087 virtual List allRecords()const;
00088 virtual List matchRegexp( const QRegExp &r ) const;
00089
00096 const uint querySettings();
00097
00103 bool hasQuerySettings ( int querySettings ) const;
00104
00116 virtual List queryByExample( const T& query, int querySettings, const QDateTime& startperiod = QDateTime() );
00117
00129 virtual List queryByExample( const OPimRecord* query, int querySettings, const QDateTime& startperiod = QDateTime() );
00142 virtual List queryByExample( const OPimAccessTemplate::List& uidlist, const T& query, int querySettings,
00143 const QDateTime& startperiod = QDateTime() );
00144
00145 virtual T find( UID uid )const;
00146 virtual T find( UID uid, const QArray<int>&,
00147 uint current, typename OTemplateBase<T>::CacheDirection dir = OTemplateBase<T>::Forward )const;
00149
00159 virtual List sorted( const List& list, bool ascending, int sortOrder,
00160 int sortFilter, int cat )const;
00161
00171 virtual List sorted( const List& list, bool ascending, int sortOrder,
00172 int sortFilter, const QArray<UID>& cats )const;
00173
00182 virtual List sorted( bool ascending, int sortOrder, int sortFilter, int cat )const;
00183
00192 virtual List sorted( bool ascending, int sortOrder, int sortFilter,
00193 const QArray<UID>& cats )const;
00198 UIDArray matchRegexpSimple( const QRegExp& r )const;
00199 UIDArray queryByExampleSimple( const OPimRecord*, int, const QDateTime& )const;
00200 UIDArray sortedSimple( const UIDArray&, bool asc, int sortOrder,
00201 int sortFilter, int cat )const;
00202 UIDArray sortedSimple( const UIDArray&, bool asc, int sortOrder,
00203 int sortFilter, const QArray<int>& )const;
00204 UIDArray sortedSimple( bool ascending, int sortOrder, int sortFilter,
00205 int cat )const;
00206 UIDArray sortedSimple( bool ascending, int sortOrder, int sortFilter,
00207 const QArray<int>& )const;
00208 OPimOccurrence::List occurrences( const QDate& start, const QDate& end )const;
00209 OPimOccurrence::List occurrences( const QDateTime& dt )const;
00211
00213 virtual bool add( const T& t ) ;
00214 bool add( const OPimRecord& );
00215 bool add( const OPimRecord* );
00216 virtual bool remove( const T& t );
00217 bool remove( UID uid );
00218 bool remove( const OPimRecord& );
00219 virtual bool replace( const T& t) ;
00220
00222
00223 void setReadAhead( uint count );
00224 void cache( const T& )const;
00225 void setSaneCacheSize( int );
00226
00227 QArray<UID> records()const;
00228 protected:
00232 void invalidateCache();
00233
00234 void setBackEnd( BackEnd* end );
00238 BackEnd* backEnd();
00239 BackEnd* m_backEnd;
00240
00241 Cache m_cache;
00242
00243 private:
00244 OPimAccessTemplatePrivate *d;
00245
00246 };
00247
00252 template <class T>
00253 OPimAccessTemplate<T>::OPimAccessTemplate( BackEnd* end )
00254 : OTemplateBase<T>(), m_backEnd( end )
00255 {
00256 if (end )
00257 end->setFrontend( this );
00258 }
00259 template <class T>
00260 OPimAccessTemplate<T>::~OPimAccessTemplate() {
00261 delete m_backEnd;
00262 }
00263
00267 template <class T>
00268 bool OPimAccessTemplate<T>::load() {
00269 invalidateCache();
00270 return m_backEnd->load();
00271 }
00272
00279 template <class T>
00280 bool OPimAccessTemplate<T>::reload() {
00281 invalidateCache();
00282 return m_backEnd->reload();
00283 }
00284
00290 template <class T>
00291 bool OPimAccessTemplate<T>::save() {
00292 return m_backEnd->save();
00293 }
00294
00295
00300 template <class T>
00301 typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::allRecords()const {
00302 QArray<int> ints = m_backEnd->allRecords();
00303 List lis(ints, this );
00304 return lis;
00305 }
00306
00311 template <class T>
00312 typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::matchRegexp( const QRegExp &r )const {
00313 QArray<int> ints = m_backEnd->matchRegexp( r );
00314 List lis(ints, this );
00315 return lis;
00316 }
00317
00321 template <class T>
00322 QArray<int> OPimAccessTemplate<T>::records()const {
00323 return m_backEnd->allRecords();
00324 }
00325
00326 template <class T>
00327 const uint OPimAccessTemplate<T>::querySettings(){
00328 return m_backEnd->querySettings();
00329 }
00330
00331 template <class T>
00332 bool OPimAccessTemplate<T>::hasQuerySettings ( int querySettings ) const {
00333 return m_backEnd->hasQuerySettings( querySettings );
00334 }
00335
00336
00337 template <class T>
00338 typename OPimAccessTemplate<T>::List
00339 OPimAccessTemplate<T>::queryByExample( const T& t, int settings, const QDateTime& d ) {
00340 QArray<int> ints = m_backEnd->queryByExample( t, settings, d );
00341
00342 List list(ints, this );
00343 return list;
00344 }
00345
00346 template <class T>
00347 typename OPimAccessTemplate<T>::List
00348 OPimAccessTemplate<T>::queryByExample( const OPimRecord* t, int settings, const QDateTime& d ) {
00349 T tempInstance;
00350
00351 if ( t->rtti() == tempInstance.rtti() ) {
00352 QArray<int> ints = m_backEnd->queryByExample( t, settings, d );
00353 List list( ints, this );
00354 return list;
00355 } else {
00356 owarn << "Query not possible: Objecttype mismatch" << oendl;
00357 }
00358
00359 return List();
00360 }
00361
00362 template <class T>
00363 typename OPimAccessTemplate<T>::List
00364 OPimAccessTemplate<T>::queryByExample( const OPimAccessTemplate::List& uidlist, const T& t, int settings, const QDateTime& d ) {
00365 QArray<int> ints = m_backEnd->queryByExample( uidlist.uids(), t, settings, d );
00366
00367 List list( ints, this );
00368 return list;
00369 }
00370
00371
00372 template <class T>
00373 T OPimAccessTemplate<T>::find( UID uid ) const{
00374
00375 if ( m_cache.contains( uid ) )
00376 return m_cache.find( uid );
00377
00378 T t = m_backEnd->find( uid );
00379 cache( t );
00380
00381 return t;
00382 }
00383
00384
00388 template <class T>
00389 T OPimAccessTemplate<T>::find( UID uid, const QArray<int>& ar,
00390 uint current, typename OTemplateBase<T>::CacheDirection dir )const {
00391
00392
00393
00394
00395
00396 if (m_cache.contains( uid ) )
00397 return m_cache.find( uid );
00398
00399
00400 T t = m_backEnd->find( uid, ar, current, dir );
00401 cache( t );
00402 return t;
00403 }
00404
00408 template <class T>
00409 void OPimAccessTemplate<T>::clear() {
00410 invalidateCache();
00411 m_backEnd->clear();
00412 }
00413
00414
00420 template <class T>
00421 bool OPimAccessTemplate<T>::add( const T& t ) {
00422 cache( t );
00423 return m_backEnd->add( t );
00424 }
00425
00426 template <class T>
00427 bool OPimAccessTemplate<T>::add( const OPimRecord& rec ) {
00428
00429 T tempInstance;
00430 if ( rec.rtti() == tempInstance.rtti() ) {
00431 const T& t = static_cast<const T&>(rec);
00432 return add(t);
00433 } else {
00434 owarn << "Adding not possible: Objecttype mismatch" << oendl;
00435 }
00436 return false;
00437 }
00438
00445 template <class T>
00446 bool OPimAccessTemplate<T>::add( const OPimRecord* rec) {
00447
00448 T tempInstance;
00449 if ( rec -> rtti() == tempInstance.rtti() ) {
00450 const T* t = static_cast<const T*>(rec);
00451 return add( *t );
00452 } else {
00453 owarn << "Adding not possible: Objecttype mismatch" << oendl;
00454 }
00455 return false;
00456 }
00457
00463 template <class T>
00464 bool OPimAccessTemplate<T>::remove( const T& t ) {
00465 return remove( t.uid() );
00466 }
00467
00473 template <class T>
00474 bool OPimAccessTemplate<T>::remove( UID uid ) {
00475 m_cache.remove( uid );
00476 return m_backEnd->remove( uid );
00477 }
00478 template <class T>
00479 bool OPimAccessTemplate<T>::remove( const OPimRecord& rec) {
00480 return remove( rec.uid() );
00481 }
00482
00488 template <class T>
00489 bool OPimAccessTemplate<T>::replace( const T& t ) {
00490 m_cache.replace( t );
00491 return m_backEnd->replace( t );
00492 }
00493
00497 template <class T>
00498 void OPimAccessTemplate<T>::invalidateCache() {
00499 m_cache.invalidate();
00500 }
00501 template <class T>
00502 typename OPimAccessTemplate<T>::BackEnd* OPimAccessTemplate<T>::backEnd() {
00503 return m_backEnd;
00504 }
00505
00511 template <class T>
00512 bool OPimAccessTemplate<T>::wasChangedExternally()const {
00513 return false;
00514 }
00515 template <class T>
00516 void OPimAccessTemplate<T>::setBackEnd( BackEnd* end ) {
00517 m_backEnd = end;
00518 if (m_backEnd )
00519 m_backEnd->setFrontend( this );
00520 }
00521 template <class T>
00522 void OPimAccessTemplate<T>::cache( const T& t ) const{
00523
00524 ((OPimAccessTemplate<T>*)this)->m_cache.add( t );
00525 }
00526 template <class T>
00527 void OPimAccessTemplate<T>::setSaneCacheSize( int size ) {
00528 m_cache.setSize( size );
00529 }
00530 template <class T>
00531 void OPimAccessTemplate<T>::setReadAhead( uint count ) {
00532 m_backEnd->setReadAhead( count );
00533 }
00534
00535
00536 template <class T>
00537 typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::sorted( const OPimAccessTemplate::List& lst,
00538 bool ascending, int sortOrder,
00539 int sortFilter, int cat )const {
00540 QArray<int> cats( 1 );
00541 cats[0] = cat;
00542 UIDArray ints = m_backEnd->sorted( lst.uids(), ascending, sortOrder,
00543 sortFilter, cats );
00544 return List(ints, this);
00545 }
00546
00547 template<class T>
00548 typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::sorted( const OPimAccessTemplate::List& lst,
00549 bool ascending, int sortOrder,
00550 int sortFilter, const QArray<UID>& cats )const {
00551 UIDArray ints = m_backEnd->sorted( lst.uids(), ascending, sortOrder,
00552 sortFilter, cats );
00553 return List(ints, this);
00554 }
00555
00556 template<class T>
00557 typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::sorted( bool ascending, int sortOrder,
00558 int sortFilter, int cat )const {
00559 QArray<int> cats( 1 );
00560 cats[0] = cat;
00561 UIDArray ints = m_backEnd->sorted( ascending, sortOrder,
00562 sortFilter, cats );
00563 return List(ints, this);
00564 }
00565
00566 template<class T>
00567 typename OPimAccessTemplate<T>::List OPimAccessTemplate<T>::sorted( bool ascending, int sortOrder,
00568 int sortFilter, const QArray<UID>& cats )const {
00569 UIDArray ints = m_backEnd->sorted( ascending, sortOrder,
00570 sortFilter, cats );
00571 return List(ints, this);
00572 }
00573
00574 template <class T>
00575 OPimOccurrence::List OPimAccessTemplate<T>::occurrences( const QDate& start,
00576 const QDate& end ) const {
00577
00578
00579
00580
00581 return OPimBase::convertOccurrenceFromBackend( m_backEnd->occurrences( start, end ) );
00582 }
00583
00584 template<class T>
00585 OPimOccurrence::List OPimAccessTemplate<T>::occurrences( const QDateTime& dt )const {
00586 return OPimBase::convertOccurrenceFromBackend( m_backEnd->occurrences( dt ) );
00587 }
00588
00589
00590
00591
00592 template <class T>
00593 UIDArray OPimAccessTemplate<T>::matchRegexpSimple( const QRegExp &r )const {
00594 return m_backEnd->matchRegexp( r );
00595 }
00596
00597 template <class T>
00598 UIDArray OPimAccessTemplate<T>::queryByExampleSimple( const OPimRecord* rec,
00599 int settings,
00600 const QDateTime& d )const {
00601 return m_backEnd->queryByExample( rec, settings, d );
00602 }
00603
00604 template <class T>
00605 UIDArray OPimAccessTemplate<T>::sortedSimple( const UIDArray& lst,
00606 bool ascending,
00607 int sortOrder, int sortFilter,
00608 int cat ) const{
00609 QArray<int> cats( 1 );
00610 cats[0] = cat;
00611 return m_backEnd->sorted( lst, ascending, sortOrder, sortFilter, cats );
00612 }
00613
00614 template <class T>
00615 UIDArray OPimAccessTemplate<T>::sortedSimple( const UIDArray& lst,
00616 bool ascending,
00617 int sortOrder, int sortFilter,
00618 const QArray<int>& cats ) const{
00619 return m_backEnd->sorted( lst, ascending, sortOrder, sortFilter, cats );
00620 }
00621
00622 template <class T>
00623 UIDArray OPimAccessTemplate<T>::sortedSimple( bool ascending,
00624 int sortOrder, int sortFilter,
00625 int cat ) const{
00626 QArray<int> cats( 1 );
00627 cats[0] = cat;
00628
00629 return m_backEnd->sorted( ascending, sortOrder, sortFilter, cats );
00630 }
00631
00632 template <class T>
00633 UIDArray OPimAccessTemplate<T>::sortedSimple( bool ascending,
00634 int sortOrder, int sortFilter,
00635 const QArray<int>& cats ) const{
00636 return m_backEnd->sorted( ascending, sortOrder, sortFilter, cats );
00637 }
00638 }
00639
00640 #endif