Diffstat (limited to 'libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp | 128 |
1 files changed, 111 insertions, 17 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 { QString FindQuery::query()const{ -// if ( m_uids.count() == 0 ) + if ( m_uids.count() == 0 ) return single(); - } - /* else @@ -309,11 +307,14 @@ namespace { } + QString FindQuery::multi()const { - QString qu = "select uid, type, value from addressbook where"; + QString qu = "select * from addressbook where"; for (uint i = 0; i < m_uids.count(); i++ ) { - qu += " UID = " + QString::number( m_uids[i] ) + " OR"; + qu += " uid = " + QString::number( m_uids[i] ) + " OR"; } qu.remove( qu.length()-2, 2 ); // Hmmmm.. + + odebug << "find query: " << qu << "" << oendl; return qu; } - */ + QString FindQuery::single()const{ @@ -475,3 +476,3 @@ OPimContact OPimContactAccessBackend_SQL::find ( int uid ) const { - odebug << "OPimContactAccessBackend_SQL::find()" << oendl; + odebug << "OPimContactAccessBackend_SQL::find(" << uid << ")" << oendl; QTime t; @@ -486,2 +487,43 @@ OPimContact OPimContactAccessBackend_SQL::find ( int uid ) const +OPimContact OPimContactAccessBackend_SQL::find( int uid, const QArray<int>& queryUids, uint current, Frontend::CacheDirection direction ) const +{ + odebug << "OPimContactAccessBackend_SQL::find( ..multi.. )" << oendl; + odebug << "searching for " << uid << "" << oendl; + + QTime t; + t.start(); + + uint numReadAhead = readAhead(); + QArray<int> searchList( numReadAhead ); + + uint size =0; + + // Build an array with all elements which should be requested and cached + // We will just request "numReadAhead" elements, starting from "current" position in + // the list of many uids ! + switch( direction ) { + /* forward */ + case Frontend::Forward: + for ( uint i = current; i < queryUids.count() && size < numReadAhead; i++ ) { + searchList[size] = queryUids[i]; + size++; + } + break; + /* reverse */ + case Frontend::Reverse: + for ( uint i = current; i != 0 && size < numReadAhead; i-- ) { + searchList[size] = queryUids[i]; + size++; + } + break; + } + + //Shrink to real size.. + searchList.resize( size ); + + OPimContact retContact( requestContactsAndCache( uid, searchList ) ); + + odebug << "OPimContactAccessBackend_SQL::find( ..multi.. ) needed: " << t.elapsed() << " ms" << oendl; + return retContact; +} @@ -770,4 +812,2 @@ QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) co - QMap<int, QString> nonCustomMap; - int t2needed = 0; @@ -782,4 +822,63 @@ QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) co + QMap<int, QString> nonCustomMap; QTime t3; t3.start(); + nonCustomMap = fillNonCustomMap( resItem ); + t3needed = t3.elapsed(); + + + // odebug << "Adding UID: " << resItem.data( "uid" ) << "" << oendl; + odebug << "RequestNonCustom needed: insg.:" << t.elapsed() << " ms, query: " << t2needed + << " ms, mapping: " << t3needed << " ms" << oendl; + + return nonCustomMap; +} + +/* Returns contact requested by uid and fills cache with contacts requested by uids in the cachelist */ +OPimContact OPimContactAccessBackend_SQL::requestContactsAndCache( int uid, const QArray<int>& uidlist )const +{ + // We want to get all contacts with one query. + // We don't have to add the given uid to the uidlist, it is expected to be there already (see opimrecordlist.h). + // All contacts will be stored in the cache, afterwards the contact with the user id "uid" will be returned + // by using the cache.. + QArray<int> cachelist = uidlist; + + odebug << "Reqest and cache" << cachelist.size() << "elements !" << oendl; + + QTime t; + t.start(); + + int t2needed = 0; + int t3needed = 0; + QTime t2; + t2.start(); + FindQuery query( cachelist ); + OSQLResult res_noncustom = m_driver->query( &query ); + t2needed = t2.elapsed(); + + QMap<int, QString> nonCustomMap; + QTime t3; + t3.start(); + OSQLResultItem resItem = res_noncustom.first(); + do { + OPimContact contact( fillNonCustomMap( resItem ) ); + contact.setExtraMap( requestCustom( contact.uid() ) ); + odebug << "Caching uid: " << contact.uid() << oendl; + cache( contact ); + resItem = res_noncustom.next(); + } while ( ! res_noncustom.atEnd() ); //atEnd() is true if we are past(!) the list !! + t3needed = t3.elapsed(); + + + // odebug << "Adding UID: " << resItem.data( "uid" ) << "" << oendl; + odebug << "RequestContactsAndCache needed: insg.:" << t.elapsed() << " ms, query: " << t2needed + << " ms, mapping: " << t3needed << " ms" << oendl; + + return cacheFind( uid ); +} + +QMap<int, QString> OPimContactAccessBackend_SQL::fillNonCustomMap( const OSQLResultItem& resultItem ) const +{ + QMap<int, QString> nonCustomMap; + // Now loop through all columns @@ -792,3 +891,3 @@ QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) co int id = translate[*it]; - QString value = resItem.data( (*it) ); + QString value = resultItem.data( (*it) ); @@ -818,9 +917,3 @@ QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) co - // First insert uid - nonCustomMap.insert( Qtopia::AddressUid, resItem.data( "uid" ) ); - t3needed = t3.elapsed(); - - // odebug << "Adding UID: " << resItem.data( "uid" ) << "" << oendl; - odebug << "RequestNonCustom needed: insg.:" << t.elapsed() << " ms, query: " << t2needed - << " ms, mapping: " << t3needed << " ms" << oendl; + nonCustomMap.insert( Qtopia::AddressUid, resultItem.data( "uid" ) ); @@ -829,2 +922,3 @@ QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) co + QMap<QString, QString> OPimContactAccessBackend_SQL::requestCustom( int uid ) const |