summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp8
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 */