-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp index 6aaa14c..f684f8c 100644 --- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp +++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp @@ -555,193 +555,193 @@ UIDArray OPimContactAccessBackend_SQL::queryByExample ( const UIDArray& uidlist, if ( qd.isValid() ) startDate = qd.date(); else startDate = QDate::currentDate(); QMap<int, QString> queryFields = query.toMap(); QStringList fieldList = OPimContactFields::untrfields( false ); QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); // Convert every filled field to a SQL-Query // bool isAnyFieldSelected = false; for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ int id = translate[*it]; QString queryStr = queryFields[id]; QDate* endDate = 0l; if ( !queryStr.isEmpty() ){ // If something is alredy stored in the query, add an "AND" // to the end of the string to prepare for the next .. if ( !searchQuery.isEmpty() ) searchQuery += " AND"; // isAnyFieldSelected = true; switch( id ){ case Qtopia::Birthday: endDate = new QDate( query.birthday() ); // Fall through ! case Qtopia::Anniversary: if ( endDate == 0l ) endDate = new QDate( query.anniversary() ); if ( settings & OPimContactAccess::DateDiff ) { // To handle datediffs correctly, we need to remove the year information from // the birthday and anniversary. // To do this efficiently, we will create a temporary table which contains the // information we need and do the query on it. // This table is just visible for this process and will be removed // automatically after using. datediff_query = "SELECT uid,substr(\"Birthday\", 6, 10) as \"BirthdayMD\", substr(\"Anniversary\", 6, 10) as \"AnniversaryMD\" FROM addressbook WHERE ( \"Birthday\" != '' OR \"Anniversary\" != '' ) AND "; datediff_query += QString( " (\"%1MD\" <= '%2-%3\' AND \"%4MD\" >= '%5-%6')" ) .arg( *it ) //.arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) ) .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) ) .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) ) .arg( *it ) //.arg( QString::number( startDate.year() ).rightJustify( 4, '0' ) ) .arg( QString::number( startDate.month() ).rightJustify( 2, '0' ) ) .arg( QString::number( startDate.day() ).rightJustify( 2, '0' ) ) ; } if ( settings & OPimContactAccess::DateYear ){ searchQuery += QString( " (\"%1\" LIKE '%2-%')" ) .arg( *it ) .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) ); } if ( settings & OPimContactAccess::DateMonth ){ if ( settings & OPimContactAccess::DateYear ) searchQuery += " AND"; searchQuery += QString( " (\"%1\" LIKE '%-%2-%')" ) .arg( *it ) .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) ); } if ( settings & OPimContactAccess::DateDay ){ if ( ( settings & OPimContactAccess::DateYear ) || ( settings & OPimContactAccess::DateMonth ) ) searchQuery += " AND"; searchQuery += QString( " (\"%1\" LIKE '%-%-%2')" ) .arg( *it ) .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) ); } break; default: // Switching between case sensitive and insensitive... // LIKE is not case sensitive, GLOB is case sensitive // Do exist a better solution to switch this ? if ( settings & OPimContactAccess::IgnoreCase ) searchQuery += " (\"" + *it + "\"" + " LIKE " + "'" + queryStr.replace(QRegExp("\\*"),"%") + "'" + ")"; else searchQuery += " (\"" + *it + "\"" + " GLOB " + "'" + queryStr + "'" + ")"; } } delete endDate; // The following if line is a replacement for // if ( searchQuery.endsWith( "AND" ) ) - if ( searchQuery.findRev( "AND" ) == ( searchQuery.length() - 3 ) ){ + if ( searchQuery.findRev( "AND" ) == static_cast<int>( searchQuery.length() - 3 ) ){ odebug << "remove AND" << oendl; searchQuery.remove( searchQuery.length()-3, 3 ); // Hmmmm.. } } // Now compose the complete query QString qu = "SELECT uid FROM addressbook WHERE " + uid_query; if ( !datediff_query.isEmpty() && !searchQuery.isEmpty() ){ // If we use DateDiff, we have to intersect two queries. qu = datediff_query + QString( " INTERSECT " ) + qu + searchQuery; } else if ( datediff_query.isEmpty() && !searchQuery.isEmpty() ){ qu += searchQuery; } else if ( !datediff_query.isEmpty() && searchQuery.isEmpty() ){ qu = datediff_query; } else if ( datediff_query.isEmpty() && searchQuery.isEmpty() ){ UIDArray empty; return empty; } odebug << "queryByExample query: " << qu << "" << oendl; // Execute query and return the received uid's OSQLRawQuery raw( qu ); OSQLResult res = m_driver->query( &raw ); if ( res.state() != OSQLResult::Success ){ UIDArray empty; return empty; } UIDArray list = extractUids( res ); return list; } UIDArray OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const { #if 0 QArray<int> nix(0); return nix; #else QString qu = "SELECT uid FROM addressbook WHERE ("; QString searchlist; QStringList fieldList = OPimContactFields::untrfields( false ); // QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ if ( !searchlist.isEmpty() ) searchlist += " OR "; searchlist += " rlike(\""+ r.pattern() + "\",\"" + *it + "\") "; } qu = qu + searchlist + ")"; odebug << "query: " << qu << "" << oendl; OSQLRawQuery raw( qu ); OSQLResult res = m_driver->query( &raw ); return extractUids( res ); #endif } const uint OPimContactAccessBackend_SQL::querySettings() const { return OPimContactAccess::IgnoreCase | OPimContactAccess::WildCards | OPimContactAccess::DateDiff | OPimContactAccess::DateYear | OPimContactAccess::DateMonth | OPimContactAccess::DateDay ; } bool OPimContactAccessBackend_SQL::hasQuerySettings (uint querySettings) const { /* OPimContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay * may be added with any of the other settings. IgnoreCase should never used alone. * Wildcards, RegExp, ExactMatch should never used at the same time... */ // Step 1: Check whether the given settings are supported by this backend if ( ( querySettings & ( OPimContactAccess::IgnoreCase | OPimContactAccess::WildCards | OPimContactAccess::DateDiff | OPimContactAccess::DateYear | OPimContactAccess::DateMonth | OPimContactAccess::DateDay // | OPimContactAccess::RegExp // | OPimContactAccess::ExactMatch ) ) != querySettings ) @@ -780,192 +780,198 @@ UIDArray OPimContactAccessBackend_SQL::sorted( const UIDArray& ar, bool asc, int { QTime t; t.start(); QString query = "SELECT uid FROM addressbook"; query += " WHERE ("; for ( uint i = 0; i < ar.count(); i++ ) { query += " uid = " + QString::number( ar[i] ) + " OR"; } query.remove( query.length()-2, 2 ); // Hmmmm.. query += ")"; if ( filter != OPimBase::FilterOff ){ if ( filter & OPimContactAccess::DoNotShowWithCategory ){ query += " AND ( \"Categories\" == '' )"; } else if ( filter & OPimBase::FilterCategory ){ query += " AND ("; for ( uint i = 0; i < categories.count(); i++ ){ query += "\"Categories\" LIKE"; query += QString( " '%" ) + QString::number( categories[i] ) + "%' OR"; } query.remove( query.length()-2, 2 ); // Hmmmm.. query += ")"; } if ( filter & OPimContactAccess::DoNotShowWithoutChildren ){ query += " AND ( \"Children\" != '' )"; } if ( filter & OPimContactAccess::DoNotShowWithoutAnniversary ){ query += " AND ( \"Anniversary\" != '' )"; } if ( filter & OPimContactAccess::DoNotShowWithoutBirthday ){ query += " AND ( \"Birthday\" != '' )"; } if ( filter & OPimContactAccess::DoNotShowWithoutHomeAddress ){ // Expect that no Street means no Address, too! (eilers) query += " AND ( \"Home Street\" != '' )"; } if ( filter & OPimContactAccess::DoNotShowWithoutBusinessAddress ){ // Expect that no Street means no Address, too! (eilers) query += " AND ( \"Business Street\" != '' )"; } } query += " ORDER BY"; switch ( sortOrder ) { case OPimContactAccess::SortSummary: query += " \"Notes\""; break; case OPimContactAccess::SortByCategory: query += " \"Categories\""; break; case OPimContactAccess::SortByDate: query += " \"\""; break; case OPimContactAccess::SortTitle: query += " \"Name Title\""; break; case OPimContactAccess::SortFirstName: query += " \"First Name\""; break; case OPimContactAccess::SortMiddleName: query += " \"Middle Name\""; break; case OPimContactAccess::SortLastName: query += " \"Last Name\""; break; case OPimContactAccess::SortFileAsName: query += " \"File As\""; break; case OPimContactAccess::SortSuffix: query += " \"Suffix\""; break; case OPimContactAccess::SortEmail: query += " \"Default Email\""; break; case OPimContactAccess::SortNickname: query += " \"Nickname\""; break; case OPimContactAccess::SortAnniversary: query += " \"Anniversary\""; break; case OPimContactAccess::SortBirthday: query += " \"Birthday\""; break; case OPimContactAccess::SortGender: query += " \"Gender\""; break; + case OPimContactAccess::SortBirthdayWithoutYear: + query += " substr(\"Birthday\", 6, 10)"; + break; + case OPimContactAccess::SortAnniversaryWithoutYear: + query += " substr(\"Anniversary\", 6, 10)"; + break; default: query += " \"Last Name\""; } if ( !asc ) query += " DESC"; odebug << "sorted query is: " << query << "" << oendl; OSQLRawQuery raw( query ); OSQLResult res = m_driver->query( &raw ); if ( res.state() != OSQLResult::Success ){ UIDArray empty; return empty; } UIDArray list = extractUids( res ); odebug << "sorted needed " << t.elapsed() << " ms!" << oendl; return list; } void OPimContactAccessBackend_SQL::update() { odebug << "Update starts" << oendl; QTime t; t.start(); // Now load the database set and extract the uid's // which will be held locally LoadQuery lo; OSQLResult res = m_driver->query(&lo); if ( res.state() != OSQLResult::Success ) return; m_uids = extractUids( res ); m_changed = false; odebug << "Update ends " << t.elapsed() << " ms" << oendl; } UIDArray OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const { odebug << "extractUids" << oendl; QTime t; t.start(); OSQLResultItem::ValueList list = res.results(); OSQLResultItem::ValueList::Iterator it; UIDArray ints(list.count() ); odebug << " count = " << list.count() << "" << oendl; int i = 0; for (it = list.begin(); it != list.end(); ++it ) { ints[i] = (*it).data("uid").toInt(); i++; } odebug << "extractUids ready: count2 = " << i << " needs " << t.elapsed() << " ms" << oendl; return ints; } QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) const { QTime t; t.start(); int t2needed = 0; int t3needed = 0; QTime t2; t2.start(); FindQuery query( uid ); OSQLResult res_noncustom = m_driver->query( &query ); t2needed = t2.elapsed(); OSQLResultItem resItem = res_noncustom.first(); 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 */ |