-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp | 128 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.h | 5 | ||||
-rw-r--r-- | libopie2/opiepim/backend/opimaccessbackend.h | 20 |
3 files changed, 134 insertions, 19 deletions
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp index dda23cc..abfd944 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp | |||
@@ -302,6 +302,4 @@ namespace { | |||
302 | QString FindQuery::query()const{ | 302 | QString FindQuery::query()const{ |
303 | // if ( m_uids.count() == 0 ) | 303 | if ( m_uids.count() == 0 ) |
304 | return single(); | 304 | return single(); |
305 | } | ||
306 | /* | ||
307 | else | 305 | else |
@@ -309,11 +307,14 @@ namespace { | |||
309 | } | 307 | } |
308 | |||
310 | QString FindQuery::multi()const { | 309 | QString FindQuery::multi()const { |
311 | QString qu = "select uid, type, value from addressbook where"; | 310 | QString qu = "select * from addressbook where"; |
312 | for (uint i = 0; i < m_uids.count(); i++ ) { | 311 | for (uint i = 0; i < m_uids.count(); i++ ) { |
313 | qu += " UID = " + QString::number( m_uids[i] ) + " OR"; | 312 | qu += " uid = " + QString::number( m_uids[i] ) + " OR"; |
314 | } | 313 | } |
315 | qu.remove( qu.length()-2, 2 ); // Hmmmm.. | 314 | qu.remove( qu.length()-2, 2 ); // Hmmmm.. |
315 | |||
316 | odebug << "find query: " << qu << "" << oendl; | ||
316 | return qu; | 317 | return qu; |
317 | } | 318 | } |
318 | */ | 319 | |
319 | QString FindQuery::single()const{ | 320 | QString FindQuery::single()const{ |
@@ -475,3 +476,3 @@ OPimContact OPimContactAccessBackend_SQL::find ( int uid ) const | |||
475 | { | 476 | { |
476 | odebug << "OPimContactAccessBackend_SQL::find()" << oendl; | 477 | odebug << "OPimContactAccessBackend_SQL::find(" << uid << ")" << oendl; |
477 | QTime t; | 478 | QTime t; |
@@ -486,2 +487,43 @@ OPimContact OPimContactAccessBackend_SQL::find ( int uid ) const | |||
486 | 487 | ||
488 | OPimContact OPimContactAccessBackend_SQL::find( int uid, const QArray<int>& queryUids, uint current, Frontend::CacheDirection direction ) const | ||
489 | { | ||
490 | odebug << "OPimContactAccessBackend_SQL::find( ..multi.. )" << oendl; | ||
491 | odebug << "searching for " << uid << "" << oendl; | ||
492 | |||
493 | QTime t; | ||
494 | t.start(); | ||
495 | |||
496 | uint numReadAhead = readAhead(); | ||
497 | QArray<int> searchList( numReadAhead ); | ||
498 | |||
499 | uint size =0; | ||
500 | |||
501 | // Build an array with all elements which should be requested and cached | ||
502 | // We will just request "numReadAhead" elements, starting from "current" position in | ||
503 | // the list of many uids ! | ||
504 | switch( direction ) { | ||
505 | /* forward */ | ||
506 | case Frontend::Forward: | ||
507 | for ( uint i = current; i < queryUids.count() && size < numReadAhead; i++ ) { | ||
508 | searchList[size] = queryUids[i]; | ||
509 | size++; | ||
510 | } | ||
511 | break; | ||
512 | /* reverse */ | ||
513 | case Frontend::Reverse: | ||
514 | for ( uint i = current; i != 0 && size < numReadAhead; i-- ) { | ||
515 | searchList[size] = queryUids[i]; | ||
516 | size++; | ||
517 | } | ||
518 | break; | ||
519 | } | ||
520 | |||
521 | //Shrink to real size.. | ||
522 | searchList.resize( size ); | ||
523 | |||
524 | OPimContact retContact( requestContactsAndCache( uid, searchList ) ); | ||
525 | |||
526 | odebug << "OPimContactAccessBackend_SQL::find( ..multi.. ) needed: " << t.elapsed() << " ms" << oendl; | ||
527 | return retContact; | ||
528 | } | ||
487 | 529 | ||
@@ -770,4 +812,2 @@ QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) co | |||
770 | 812 | ||
771 | QMap<int, QString> nonCustomMap; | ||
772 | |||
773 | int t2needed = 0; | 813 | int t2needed = 0; |
@@ -782,4 +822,63 @@ QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) co | |||
782 | 822 | ||
823 | QMap<int, QString> nonCustomMap; | ||
783 | QTime t3; | 824 | QTime t3; |
784 | t3.start(); | 825 | t3.start(); |
826 | nonCustomMap = fillNonCustomMap( resItem ); | ||
827 | t3needed = t3.elapsed(); | ||
828 | |||
829 | |||
830 | // odebug << "Adding UID: " << resItem.data( "uid" ) << "" << oendl; | ||
831 | odebug << "RequestNonCustom needed: insg.:" << t.elapsed() << " ms, query: " << t2needed | ||
832 | << " ms, mapping: " << t3needed << " ms" << oendl; | ||
833 | |||
834 | return nonCustomMap; | ||
835 | } | ||
836 | |||
837 | /* Returns contact requested by uid and fills cache with contacts requested by uids in the cachelist */ | ||
838 | OPimContact OPimContactAccessBackend_SQL::requestContactsAndCache( int uid, const QArray<int>& uidlist )const | ||
839 | { | ||
840 | // We want to get all contacts with one query. | ||
841 | // We don't have to add the given uid to the uidlist, it is expected to be there already (see opimrecordlist.h). | ||
842 | // All contacts will be stored in the cache, afterwards the contact with the user id "uid" will be returned | ||
843 | // by using the cache.. | ||
844 | QArray<int> cachelist = uidlist; | ||
845 | |||
846 | odebug << "Reqest and cache" << cachelist.size() << "elements !" << oendl; | ||
847 | |||
848 | QTime t; | ||
849 | t.start(); | ||
850 | |||
851 | int t2needed = 0; | ||
852 | int t3needed = 0; | ||
853 | QTime t2; | ||
854 | t2.start(); | ||
855 | FindQuery query( cachelist ); | ||
856 | OSQLResult res_noncustom = m_driver->query( &query ); | ||
857 | t2needed = t2.elapsed(); | ||
858 | |||
859 | QMap<int, QString> nonCustomMap; | ||
860 | QTime t3; | ||
861 | t3.start(); | ||
862 | OSQLResultItem resItem = res_noncustom.first(); | ||
863 | do { | ||
864 | OPimContact contact( fillNonCustomMap( resItem ) ); | ||
865 | contact.setExtraMap( requestCustom( contact.uid() ) ); | ||
866 | odebug << "Caching uid: " << contact.uid() << oendl; | ||
867 | cache( contact ); | ||
868 | resItem = res_noncustom.next(); | ||
869 | } while ( ! res_noncustom.atEnd() ); //atEnd() is true if we are past(!) the list !! | ||
870 | t3needed = t3.elapsed(); | ||
871 | |||
872 | |||
873 | // odebug << "Adding UID: " << resItem.data( "uid" ) << "" << oendl; | ||
874 | odebug << "RequestContactsAndCache needed: insg.:" << t.elapsed() << " ms, query: " << t2needed | ||
875 | << " ms, mapping: " << t3needed << " ms" << oendl; | ||
876 | |||
877 | return cacheFind( uid ); | ||
878 | } | ||
879 | |||
880 | QMap<int, QString> OPimContactAccessBackend_SQL::fillNonCustomMap( const OSQLResultItem& resultItem ) const | ||
881 | { | ||
882 | QMap<int, QString> nonCustomMap; | ||
883 | |||
785 | // Now loop through all columns | 884 | // Now loop through all columns |
@@ -792,3 +891,3 @@ QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) co | |||
792 | int id = translate[*it]; | 891 | int id = translate[*it]; |
793 | QString value = resItem.data( (*it) ); | 892 | QString value = resultItem.data( (*it) ); |
794 | 893 | ||
@@ -818,9 +917,3 @@ QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) co | |||
818 | 917 | ||
819 | // First insert uid | 918 | nonCustomMap.insert( Qtopia::AddressUid, resultItem.data( "uid" ) ); |
820 | nonCustomMap.insert( Qtopia::AddressUid, resItem.data( "uid" ) ); | ||
821 | t3needed = t3.elapsed(); | ||
822 | |||
823 | // odebug << "Adding UID: " << resItem.data( "uid" ) << "" << oendl; | ||
824 | odebug << "RequestNonCustom needed: insg.:" << t.elapsed() << " ms, query: " << t2needed | ||
825 | << " ms, mapping: " << t3needed << " ms" << oendl; | ||
826 | 919 | ||
@@ -829,2 +922,3 @@ QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) co | |||
829 | 922 | ||
923 | |||
830 | QMap<QString, QString> OPimContactAccessBackend_SQL::requestCustom( int uid ) const | 924 | QMap<QString, QString> OPimContactAccessBackend_SQL::requestCustom( int uid ) const |
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.h b/libopie2/opiepim/backend/ocontactaccessbackend_sql.h index ba122ec..4f81735 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.h +++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.h | |||
@@ -75,4 +75,3 @@ class OPimContactAccessBackend_SQL : public OPimContactAccessBackend { | |||
75 | OPimContact find ( int uid ) const; | 75 | OPimContact find ( int uid ) const; |
76 | // FIXME: Add lookahead-cache support ! | 76 | OPimContact find( int uid, const QArray<int>&, uint cur, Frontend::CacheDirection ) const; |
77 | //OPimContact find(int uid, const QArray<int>&, uint cur, Frontend::CacheDirection )const; | ||
78 | 77 | ||
@@ -100,2 +99,4 @@ class OPimContactAccessBackend_SQL : public OPimContactAccessBackend { | |||
100 | QMap<QString, QString> requestCustom( int uid ) const; | 99 | QMap<QString, QString> requestCustom( int uid ) const; |
100 | QMap<int, QString> fillNonCustomMap( const Opie::DB::OSQLResultItem& resultItem ) const; | ||
101 | OPimContact requestContactsAndCache( int uid, const QArray<int>& cachelist ) const; | ||
101 | void update(); | 102 | void update(); |
diff --git a/libopie2/opiepim/backend/opimaccessbackend.h b/libopie2/opiepim/backend/opimaccessbackend.h index 0682063..15a7b7f 100644 --- a/libopie2/opiepim/backend/opimaccessbackend.h +++ b/libopie2/opiepim/backend/opimaccessbackend.h | |||
@@ -130,2 +130,3 @@ protected: | |||
130 | int access()const; | 130 | int access()const; |
131 | |||
131 | void cache( const T& t )const; | 132 | void cache( const T& t )const; |
@@ -133,2 +134,9 @@ protected: | |||
133 | /** | 134 | /** |
135 | * Returns the element with given uid out of the cache. | ||
136 | * Returns empty element if nothing was found. | ||
137 | * <b>Attention:</b> This just works if we have a frontend which contains the cache ! | ||
138 | */ | ||
139 | T cacheFind( int uid ) const; | ||
140 | |||
141 | /** | ||
134 | * use a prime number here! | 142 | * use a prime number here! |
@@ -166,2 +174,13 @@ void OPimAccessBackend<T>::cache( const T& t )const { | |||
166 | } | 174 | } |
175 | |||
176 | template <class T> | ||
177 | T OPimAccessBackend<T>::cacheFind( int uid )const { | ||
178 | if ( ! m_front ){ | ||
179 | qWarning ( "No frontend assigned ! Therefore we cannot access the cache to return the right element!" ); | ||
180 | return T(); | ||
181 | } | ||
182 | |||
183 | return m_front->cacheFind( uid ); | ||
184 | } | ||
185 | |||
167 | template <class T> | 186 | template <class T> |
@@ -174,2 +193,3 @@ T OPimAccessBackend<T>::find( int uid, const QArray<int>&, | |||
174 | uint, typename Frontend::CacheDirection )const { | 193 | uint, typename Frontend::CacheDirection )const { |
194 | qDebug( "*** Lookahead feature not supported. Fallback to default find!" ); | ||
175 | return find( uid ); | 195 | return find( uid ); |