summaryrefslogtreecommitdiff
path: root/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp
Side-by-side diff
Diffstat (limited to 'libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp1326
1 files changed, 665 insertions, 661 deletions
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp
index 14207be..dda23cc 100644
--- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp
+++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp
@@ -32,13 +32,7 @@
#include "ocontactaccessbackend_sql.h"
-#include <qarray.h>
-#include <qdatetime.h>
-#include <qstringlist.h>
-
-#include <qpe/global.h>
-#include <qpe/recordfields.h>
-
+/* OPIE */
#include <opie2/opimcontact.h>
#include <opie2/opimcontactfields.h>
#include <opie2/opimdateconversion.h>
@@ -46,6 +40,16 @@
#include <opie2/osqlresult.h>
#include <opie2/osqlmanager.h>
#include <opie2/osqlquery.h>
+#include <opie2/odebug.h>
+
+#include <qpe/global.h>
+#include <qpe/recordfields.h>
+
+/* QT */
+#include <qarray.h>
+#include <qdatetime.h>
+#include <qstringlist.h>
+
using namespace Opie;
using namespace Opie::DB;
@@ -59,285 +63,285 @@ using namespace Opie::DB;
* CLEAR
*/
namespace {
- /**
- * CreateQuery for the Todolist Table
- */
- class CreateQuery : public OSQLQuery {
- public:
- CreateQuery();
- ~CreateQuery();
- QString query()const;
- };
-
- /**
- * Clears (delete) a Table
- */
- class ClearQuery : public OSQLQuery {
- public:
- ClearQuery();
- ~ClearQuery();
- QString query()const;
-
- };
-
-
- /**
- * LoadQuery
- * this one queries for all uids
- */
- class LoadQuery : public OSQLQuery {
- public:
- LoadQuery();
- ~LoadQuery();
- QString query()const;
- };
-
- /**
- * inserts/adds a OPimContact to the table
- */
- class InsertQuery : public OSQLQuery {
- public:
- InsertQuery(const OPimContact& );
- ~InsertQuery();
- QString query()const;
- private:
- OPimContact m_contact;
- };
-
-
- /**
- * removes one from the table
- */
- class RemoveQuery : public OSQLQuery {
- public:
- RemoveQuery(int uid );
- ~RemoveQuery();
- QString query()const;
- private:
- int m_uid;
- };
-
- /**
- * a find query for noncustom elements
- */
- class FindQuery : public OSQLQuery {
- public:
- FindQuery(int uid);
- FindQuery(const QArray<int>& );
- ~FindQuery();
- QString query()const;
- private:
- QString single()const;
- QString multi()const;
- QArray<int> m_uids;
- int m_uid;
- };
-
- /**
- * a find query for custom elements
- */
- class FindCustomQuery : public OSQLQuery {
- public:
- FindCustomQuery(int uid);
- FindCustomQuery(const QArray<int>& );
- ~FindCustomQuery();
- QString query()const;
- private:
- QString single()const;
- QString multi()const;
- QArray<int> m_uids;
- int m_uid;
- };
-
-
-
- // We using two tables to store the information:
- // 1. addressbook : It contains General information about the contact (non custom)
- // 2. custom_data : Not official supported entries
- // All tables are connected by the uid of the contact.
- // Maybe I should add a table for meta-information ?
- CreateQuery::CreateQuery() : OSQLQuery() {}
- CreateQuery::~CreateQuery() {}
- QString CreateQuery::query()const {
- QString qu;
-
- qu += "create table addressbook( uid PRIMARY KEY ";
-
- QStringList fieldList = OPimContactFields::untrfields( false );
- for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
- qu += QString( ",\"%1\" VARCHAR(10)" ).arg( *it );
- }
- qu += " );";
-
- qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), priority INTEGER, value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );";
-
- return qu;
- }
-
- ClearQuery::ClearQuery()
- : OSQLQuery() {}
- ClearQuery::~ClearQuery() {}
- QString ClearQuery::query()const {
- QString qu = "drop table addressbook;";
- qu += "drop table custom_data;";
-// qu += "drop table dates;";
- return qu;
- }
-
-
- LoadQuery::LoadQuery() : OSQLQuery() {}
- LoadQuery::~LoadQuery() {}
- QString LoadQuery::query()const {
- QString qu;
- qu += "select uid from addressbook";
-
- return qu;
- }
-
-
- InsertQuery::InsertQuery( const OPimContact& contact )
- : OSQLQuery(), m_contact( contact ) {
- }
-
- InsertQuery::~InsertQuery() {
- }
-
- /*
- * converts from a OPimContact to a query
- */
- QString InsertQuery::query()const{
-
- QString qu;
- qu += "insert into addressbook VALUES( " +
- QString::number( m_contact.uid() );
-
- // Get all information out of the contact-class
- // Remember: The category is stored in contactMap, too !
- QMap<int, QString> contactMap = m_contact.toMap();
-
- QStringList fieldList = OPimContactFields::untrfields( false );
- QMap<QString, int> translate = OPimContactFields::untrFieldsToId();
- for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
- // Convert Column-String to Id and get value for this id..
- // Hmmm.. Maybe not very cute solution..
- int id = translate[*it];
- switch ( id ){
- case Qtopia::Birthday:
- case Qtopia::Anniversary:{
- QDate day;
- if ( id == Qtopia::Birthday ){
- day = m_contact.birthday();
- } else {
- day = m_contact.anniversary();
- }
- // These entries should stored in a special format
- // year-month-day
- if ( day.isValid() ){
- qu += QString(",\"%1-%2-%3\"")
- .arg( QString::number( day.year() ).rightJustify( 4, '0' ) )
- .arg( QString::number( day.month() ).rightJustify( 2, '0' ) )
- .arg( QString::number( day.day() ).rightJustify( 2, '0' ) );
- } else {
- qu += ",\"\"";
- }
- }
- break;
- default:
- qu += QString( ",\"%1\"" ).arg( contactMap[id] );
- }
- }
- qu += " );";
-
-
- // Now add custom data..
- int id = 0;
- id = 0;
- QMap<QString, QString> customMap = m_contact.toExtraMap();
- for( QMap<QString, QString>::Iterator it = customMap.begin();
- it != customMap.end(); ++it ){
- qu += "insert into custom_data VALUES("
- + QString::number( m_contact.uid() )
- + ","
- + QString::number( id++ )
- + ",'"
- + it.key()
- + "',"
- + "0" // Priority for future enhancements
- + ",'"
- + it.data()
- + "');";
- }
- // qu += "commit;";
- qDebug("add %s", qu.latin1() );
- return qu;
- }
-
-
- RemoveQuery::RemoveQuery(int uid )
- : OSQLQuery(), m_uid( uid ) {}
- RemoveQuery::~RemoveQuery() {}
- QString RemoveQuery::query()const {
- QString qu = "DELETE from addressbook where uid = "
- + QString::number(m_uid) + ";";
- qu += "DELETE from custom_data where uid = "
- + QString::number(m_uid) + ";";
- return qu;
- }
-
-
-
-
- FindQuery::FindQuery(int uid)
- : OSQLQuery(), m_uid( uid ) {
- }
- FindQuery::FindQuery(const QArray<int>& ints)
- : OSQLQuery(), m_uids( ints ){
- }
- FindQuery::~FindQuery() {
- }
- QString FindQuery::query()const{
-// if ( m_uids.count() == 0 )
- return single();
- }
- /*
- else
- return multi();
- }
+ /**
+ * CreateQuery for the Todolist Table
+ */
+ class CreateQuery : public OSQLQuery {
+ public:
+ CreateQuery();
+ ~CreateQuery();
+ QString query()const;
+ };
+
+ /**
+ * Clears (delete) a Table
+ */
+ class ClearQuery : public OSQLQuery {
+ public:
+ ClearQuery();
+ ~ClearQuery();
+ QString query()const;
+
+ };
+
+
+ /**
+ * LoadQuery
+ * this one queries for all uids
+ */
+ class LoadQuery : public OSQLQuery {
+ public:
+ LoadQuery();
+ ~LoadQuery();
+ QString query()const;
+ };
+
+ /**
+ * inserts/adds a OPimContact to the table
+ */
+ class InsertQuery : public OSQLQuery {
+ public:
+ InsertQuery(const OPimContact& );
+ ~InsertQuery();
+ QString query()const;
+ private:
+ OPimContact m_contact;
+ };
+
+
+ /**
+ * removes one from the table
+ */
+ class RemoveQuery : public OSQLQuery {
+ public:
+ RemoveQuery(int uid );
+ ~RemoveQuery();
+ QString query()const;
+ private:
+ int m_uid;
+ };
+
+ /**
+ * a find query for noncustom elements
+ */
+ class FindQuery : public OSQLQuery {
+ public:
+ FindQuery(int uid);
+ FindQuery(const QArray<int>& );
+ ~FindQuery();
+ QString query()const;
+ private:
+ QString single()const;
+ QString multi()const;
+ QArray<int> m_uids;
+ int m_uid;
+ };
+
+ /**
+ * a find query for custom elements
+ */
+ class FindCustomQuery : public OSQLQuery {
+ public:
+ FindCustomQuery(int uid);
+ FindCustomQuery(const QArray<int>& );
+ ~FindCustomQuery();
+ QString query()const;
+ private:
+ QString single()const;
+ QString multi()const;
+ QArray<int> m_uids;
+ int m_uid;
+ };
+
+
+
+ // We using two tables to store the information:
+ // 1. addressbook : It contains General information about the contact (non custom)
+ // 2. custom_data : Not official supported entries
+ // All tables are connected by the uid of the contact.
+ // Maybe I should add a table for meta-information ?
+ CreateQuery::CreateQuery() : OSQLQuery() {}
+ CreateQuery::~CreateQuery() {}
+ QString CreateQuery::query()const {
+ QString qu;
+
+ qu += "create table addressbook( uid PRIMARY KEY ";
+
+ QStringList fieldList = OPimContactFields::untrfields( false );
+ for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
+ qu += QString( ",\"%1\" VARCHAR(10)" ).arg( *it );
+ }
+ qu += " );";
+
+ qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), priority INTEGER, value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );";
+
+ return qu;
+ }
+
+ ClearQuery::ClearQuery()
+ : OSQLQuery() {}
+ ClearQuery::~ClearQuery() {}
+ QString ClearQuery::query()const {
+ QString qu = "drop table addressbook;";
+ qu += "drop table custom_data;";
+// qu += "drop table dates;";
+ return qu;
+ }
+
+
+ LoadQuery::LoadQuery() : OSQLQuery() {}
+ LoadQuery::~LoadQuery() {}
+ QString LoadQuery::query()const {
+ QString qu;
+ qu += "select uid from addressbook";
+
+ return qu;
+ }
+
+
+ InsertQuery::InsertQuery( const OPimContact& contact )
+ : OSQLQuery(), m_contact( contact ) {
+ }
+
+ InsertQuery::~InsertQuery() {
+ }
+
+ /*
+ * converts from a OPimContact to a query
+ */
+ QString InsertQuery::query()const{
+
+ QString qu;
+ qu += "insert into addressbook VALUES( " +
+ QString::number( m_contact.uid() );
+
+ // Get all information out of the contact-class
+ // Remember: The category is stored in contactMap, too !
+ QMap<int, QString> contactMap = m_contact.toMap();
+
+ QStringList fieldList = OPimContactFields::untrfields( false );
+ QMap<QString, int> translate = OPimContactFields::untrFieldsToId();
+ for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
+ // Convert Column-String to Id and get value for this id..
+ // Hmmm.. Maybe not very cute solution..
+ int id = translate[*it];
+ switch ( id ){
+ case Qtopia::Birthday:
+ case Qtopia::Anniversary:{
+ QDate day;
+ if ( id == Qtopia::Birthday ){
+ day = m_contact.birthday();
+ } else {
+ day = m_contact.anniversary();
+ }
+ // These entries should stored in a special format
+ // year-month-day
+ if ( day.isValid() ){
+ qu += QString(",\"%1-%2-%3\"")
+ .arg( QString::number( day.year() ).rightJustify( 4, '0' ) )
+ .arg( QString::number( day.month() ).rightJustify( 2, '0' ) )
+ .arg( QString::number( day.day() ).rightJustify( 2, '0' ) );
+ } else {
+ qu += ",\"\"";
+ }
+ }
+ break;
+ default:
+ qu += QString( ",\"%1\"" ).arg( contactMap[id] );
+ }
+ }
+ qu += " );";
+
+
+ // Now add custom data..
+ int id = 0;
+ id = 0;
+ QMap<QString, QString> customMap = m_contact.toExtraMap();
+ for( QMap<QString, QString>::Iterator it = customMap.begin();
+ it != customMap.end(); ++it ){
+ qu += "insert into custom_data VALUES("
+ + QString::number( m_contact.uid() )
+ + ","
+ + QString::number( id++ )
+ + ",'"
+ + it.key()
+ + "',"
+ + "0" // Priority for future enhancements
+ + ",'"
+ + it.data()
+ + "');";
+ }
+ // qu += "commit;";
+ odebug << "add " << qu << "" << oendl;
+ return qu;
+ }
+
+
+ RemoveQuery::RemoveQuery(int uid )
+ : OSQLQuery(), m_uid( uid ) {}
+ RemoveQuery::~RemoveQuery() {}
+ QString RemoveQuery::query()const {
+ QString qu = "DELETE from addressbook where uid = "
+ + QString::number(m_uid) + ";";
+ qu += "DELETE from custom_data where uid = "
+ + QString::number(m_uid) + ";";
+ return qu;
+ }
+
+
+
+
+ FindQuery::FindQuery(int uid)
+ : OSQLQuery(), m_uid( uid ) {
+ }
+ FindQuery::FindQuery(const QArray<int>& ints)
+ : OSQLQuery(), m_uids( ints ){
+ }
+ FindQuery::~FindQuery() {
+ }
+ QString FindQuery::query()const{
+// if ( m_uids.count() == 0 )
+ return single();
+ }
+ /*
+ else
+ return multi();
+ }
QString FindQuery::multi()const {
- QString qu = "select uid, type, value from addressbook where";
- for (uint i = 0; i < m_uids.count(); i++ ) {
- qu += " UID = " + QString::number( m_uids[i] ) + " OR";
- }
- qu.remove( qu.length()-2, 2 ); // Hmmmm..
- return qu;
- }
- */
- QString FindQuery::single()const{
- QString qu = "select *";
- qu += " from addressbook where uid = " + QString::number(m_uid);
-
- // qWarning("find query: %s", qu.latin1() );
- return qu;
- }
-
-
- FindCustomQuery::FindCustomQuery(int uid)
- : OSQLQuery(), m_uid( uid ) {
- }
- FindCustomQuery::FindCustomQuery(const QArray<int>& ints)
- : OSQLQuery(), m_uids( ints ){
- }
- FindCustomQuery::~FindCustomQuery() {
- }
- QString FindCustomQuery::query()const{
-// if ( m_uids.count() == 0 )
- return single();
- }
- QString FindCustomQuery::single()const{
- QString qu = "select uid, type, value from custom_data where uid = ";
- qu += QString::number(m_uid);
- return qu;
- }
+ QString qu = "select uid, type, value from addressbook where";
+ for (uint i = 0; i < m_uids.count(); i++ ) {
+ qu += " UID = " + QString::number( m_uids[i] ) + " OR";
+ }
+ qu.remove( qu.length()-2, 2 ); // Hmmmm..
+ return qu;
+ }
+ */
+ QString FindQuery::single()const{
+ QString qu = "select *";
+ qu += " from addressbook where uid = " + QString::number(m_uid);
+
+ // owarn << "find query: " << qu << "" << oendl;
+ return qu;
+ }
+
+
+ FindCustomQuery::FindCustomQuery(int uid)
+ : OSQLQuery(), m_uid( uid ) {
+ }
+ FindCustomQuery::FindCustomQuery(const QArray<int>& ints)
+ : OSQLQuery(), m_uids( ints ){
+ }
+ FindCustomQuery::~FindCustomQuery() {
+ }
+ QString FindCustomQuery::query()const{
+// if ( m_uids.count() == 0 )
+ return single();
+ }
+ QString FindCustomQuery::single()const{
+ QString qu = "select uid, type, value from custom_data where uid = ";
+ qu += QString::number(m_uid);
+ return qu;
+ }
};
@@ -346,286 +350,286 @@ namespace {
namespace Opie {
-OPimContactAccessBackend_SQL::OPimContactAccessBackend_SQL ( const QString& /* appname */,
- const QString& filename ):
- OPimContactAccessBackend(), m_changed(false), m_driver( NULL )
+OPimContactAccessBackend_SQL::OPimContactAccessBackend_SQL ( const QString& /* appname */,
+ const QString& filename ):
+ OPimContactAccessBackend(), m_changed(false), m_driver( NULL )
{
- qDebug("C'tor OPimContactAccessBackend_SQL starts");
- QTime t;
- t.start();
+ odebug << "C'tor OPimContactAccessBackend_SQL starts" << oendl;
+ QTime t;
+ t.start();
- /* Expecting to access the default filename if nothing else is set */
- if ( filename.isEmpty() ){
- m_fileName = Global::applicationFileName( "addressbook","addressbook.db" );
- } else
- m_fileName = filename;
+ /* Expecting to access the default filename if nothing else is set */
+ if ( filename.isEmpty() ){
+ m_fileName = Global::applicationFileName( "addressbook","addressbook.db" );
+ } else
+ m_fileName = filename;
- // Get the standart sql-driver from the OSQLManager..
- OSQLManager man;
- m_driver = man.standard();
- m_driver->setUrl( m_fileName );
+ // Get the standart sql-driver from the OSQLManager..
+ OSQLManager man;
+ m_driver = man.standard();
+ m_driver->setUrl( m_fileName );
- load();
+ load();
- qDebug("C'tor OPimContactAccessBackend_SQL ends: %d ms", t.elapsed() );
+ odebug << "C'tor OPimContactAccessBackend_SQL ends: " << t.elapsed() << " ms" << oendl;
}
OPimContactAccessBackend_SQL::~OPimContactAccessBackend_SQL ()
{
- if( m_driver )
- delete m_driver;
+ if( m_driver )
+ delete m_driver;
}
bool OPimContactAccessBackend_SQL::load ()
{
- if (!m_driver->open() )
- return false;
+ if (!m_driver->open() )
+ return false;
- // Don't expect that the database exists.
- // It is save here to create the table, even if it
- // do exist. ( Is that correct for all databases ?? )
- CreateQuery creat;
- OSQLResult res = m_driver->query( &creat );
+ // Don't expect that the database exists.
+ // It is save here to create the table, even if it
+ // do exist. ( Is that correct for all databases ?? )
+ CreateQuery creat;
+ OSQLResult res = m_driver->query( &creat );
- update();
+ update();
- return true;
+ return true;
}
bool OPimContactAccessBackend_SQL::reload()
{
- return load();
+ return load();
}
bool OPimContactAccessBackend_SQL::save()
{
- return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers)
+ return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers)
}
void OPimContactAccessBackend_SQL::clear ()
{
- ClearQuery cle;
- OSQLResult res = m_driver->query( &cle );
+ ClearQuery cle;
+ OSQLResult res = m_driver->query( &cle );
- reload();
+ reload();
}
bool OPimContactAccessBackend_SQL::wasChangedExternally()
{
- return false;
+ return false;
}
QArray<int> OPimContactAccessBackend_SQL::allRecords() const
{
- // FIXME: Think about cute handling of changed tables..
- // Thus, we don't have to call update here...
- if ( m_changed )
- ((OPimContactAccessBackend_SQL*)this)->update();
-
- return m_uids;
+ // FIXME: Think about cute handling of changed tables..
+ // Thus, we don't have to call update here...
+ if ( m_changed )
+ ((OPimContactAccessBackend_SQL*)this)->update();
+
+ return m_uids;
}
bool OPimContactAccessBackend_SQL::add ( const OPimContact &newcontact )
{
- qDebug("add in contact SQL-Backend");
- InsertQuery ins( newcontact );
- OSQLResult res = m_driver->query( &ins );
-
- if ( res.state() == OSQLResult::Failure )
- return false;
-
- int c = m_uids.count();
- m_uids.resize( c+1 );
- m_uids[c] = newcontact.uid();
-
- return true;
+ odebug << "add in contact SQL-Backend" << oendl;
+ InsertQuery ins( newcontact );
+ OSQLResult res = m_driver->query( &ins );
+
+ if ( res.state() == OSQLResult::Failure )
+ return false;
+
+ int c = m_uids.count();
+ m_uids.resize( c+1 );
+ m_uids[c] = newcontact.uid();
+
+ return true;
}
bool OPimContactAccessBackend_SQL::remove ( int uid )
{
- RemoveQuery rem( uid );
- OSQLResult res = m_driver->query(&rem );
+ RemoveQuery rem( uid );
+ OSQLResult res = m_driver->query(&rem );
- if ( res.state() == OSQLResult::Failure )
- return false;
+ if ( res.state() == OSQLResult::Failure )
+ return false;
- m_changed = true;
+ m_changed = true;
- return true;
+ return true;
}
bool OPimContactAccessBackend_SQL::replace ( const OPimContact &contact )
{
- if ( !remove( contact.uid() ) )
- return false;
-
- return add( contact );
+ if ( !remove( contact.uid() ) )
+ return false;
+
+ return add( contact );
}
OPimContact OPimContactAccessBackend_SQL::find ( int uid ) const
{
- qDebug("OPimContactAccessBackend_SQL::find()");
- QTime t;
- t.start();
+ odebug << "OPimContactAccessBackend_SQL::find()" << oendl;
+ QTime t;
+ t.start();
- OPimContact retContact( requestNonCustom( uid ) );
- retContact.setExtraMap( requestCustom( uid ) );
+ OPimContact retContact( requestNonCustom( uid ) );
+ retContact.setExtraMap( requestCustom( uid ) );
- qDebug("OPimContactAccessBackend_SQL::find() needed: %d ms", t.elapsed() );
- return retContact;
+ odebug << "OPimContactAccessBackend_SQL::find() needed: " << t.elapsed() << " ms" << oendl;
+ return retContact;
}
QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &query, int settings, const QDateTime& qd )
{
- QString qu = "SELECT uid FROM addressbook WHERE";
- QString searchQuery ="";
-
- QDate startDate;
-
- 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 ) {
- searchQuery += QString( " (\"%1\" <= '%2-%3-%4\' AND \"%5\" >= '%6-%7-%8')" )
- .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 ){
- if ( settings & OPimContactAccess::DateDiff )
- searchQuery += " AND";
-
- searchQuery += QString( " (\"%1\" LIKE '%2-%')" )
- .arg( *it )
- .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) );
- }
-
- if ( settings & OPimContactAccess::DateMonth ){
- if ( ( settings & OPimContactAccess::DateDiff )
- || ( 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::DateDiff )
- || ( 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 + "'" + ")";
-
- }
- }
- }
- // Skip trailing "AND"
-// if ( isAnyFieldSelected )
-// qu = qu.left( qu.length() - 4 );
-
- qu += searchQuery;
-
- qDebug( "queryByExample query: %s", qu.latin1() );
-
- // Execute query and return the received uid's
- OSQLRawQuery raw( qu );
- OSQLResult res = m_driver->query( &raw );
- if ( res.state() != OSQLResult::Success ){
- QArray<int> empty;
- return empty;
- }
-
- QArray<int> list = extractUids( res );
-
- return list;
+ QString qu = "SELECT uid FROM addressbook WHERE";
+ QString searchQuery ="";
+
+ QDate startDate;
+
+ 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 ) {
+ searchQuery += QString( " (\"%1\" <= '%2-%3-%4\' AND \"%5\" >= '%6-%7-%8')" )
+ .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 ){
+ if ( settings & OPimContactAccess::DateDiff )
+ searchQuery += " AND";
+
+ searchQuery += QString( " (\"%1\" LIKE '%2-%')" )
+ .arg( *it )
+ .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) );
+ }
+
+ if ( settings & OPimContactAccess::DateMonth ){
+ if ( ( settings & OPimContactAccess::DateDiff )
+ || ( 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::DateDiff )
+ || ( 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 + "'" + ")";
+
+ }
+ }
+ }
+ // Skip trailing "AND"
+// if ( isAnyFieldSelected )
+// qu = qu.left( qu.length() - 4 );
+
+ qu += searchQuery;
+
+ 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 ){
+ QArray<int> empty;
+ return empty;
+ }
+
+ QArray<int> list = extractUids( res );
+
+ return list;
}
QArray<int> OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const
{
#if 0
- QArray<int> nix(0);
- return nix;
+ QArray<int> nix(0);
+ return nix;
#else
- QString qu = "SELECT uid FROM addressbook WHERE (";
- QString searchlist;
+ 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 + ")";
+ 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 + "\") ";
+ }
- qDebug( "query: %s", qu.latin1() );
+ qu = qu + searchlist + ")";
- OSQLRawQuery raw( qu );
- OSQLResult res = m_driver->query( &raw );
+ odebug << "query: " << qu << "" << oendl;
- return extractUids( res );
+ OSQLRawQuery raw( qu );
+ OSQLResult res = m_driver->query( &raw );
+
+ return extractUids( res );
#endif
@@ -633,220 +637,220 @@ QArray<int> OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const
const uint OPimContactAccessBackend_SQL::querySettings()
{
- return OPimContactAccess::IgnoreCase
- | OPimContactAccess::WildCards
- | OPimContactAccess::DateDiff
- | OPimContactAccess::DateYear
- | OPimContactAccess::DateMonth
- | OPimContactAccess::DateDay
- ;
+ 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 )
- return false;
-
- // Step 2: Check whether the given combinations are ok..
-
- // IngoreCase alone is invalid
- if ( querySettings == OPimContactAccess::IgnoreCase )
- return false;
-
- // WildCards, RegExp and ExactMatch should never used at the same time
- switch ( querySettings & ~( OPimContactAccess::IgnoreCase
- | OPimContactAccess::DateDiff
- | OPimContactAccess::DateYear
- | OPimContactAccess::DateMonth
- | OPimContactAccess::DateDay
- )
- ){
- case OPimContactAccess::RegExp:
- return ( true );
- case OPimContactAccess::WildCards:
- return ( true );
- case OPimContactAccess::ExactMatch:
- return ( true );
- case 0: // one of the upper removed bits were set..
- return ( true );
- default:
- return ( false );
- }
+ /* 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 )
+ return false;
+
+ // Step 2: Check whether the given combinations are ok..
+
+ // IngoreCase alone is invalid
+ if ( querySettings == OPimContactAccess::IgnoreCase )
+ return false;
+
+ // WildCards, RegExp and ExactMatch should never used at the same time
+ switch ( querySettings & ~( OPimContactAccess::IgnoreCase
+ | OPimContactAccess::DateDiff
+ | OPimContactAccess::DateYear
+ | OPimContactAccess::DateMonth
+ | OPimContactAccess::DateDay
+ )
+ ){
+ case OPimContactAccess::RegExp:
+ return ( true );
+ case OPimContactAccess::WildCards:
+ return ( true );
+ case OPimContactAccess::ExactMatch:
+ return ( true );
+ case 0: // one of the upper removed bits were set..
+ return ( true );
+ default:
+ return ( false );
+ }
}
QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int )
{
- QTime t;
- t.start();
+ QTime t;
+ t.start();
- QString query = "SELECT uid FROM addressbook ";
- query += "ORDER BY \"Last Name\" ";
+ QString query = "SELECT uid FROM addressbook ";
+ query += "ORDER BY \"Last Name\" ";
- if ( !asc )
- query += "DESC";
+ if ( !asc )
+ query += "DESC";
- // qDebug("sorted query is: %s", query.latin1() );
+ // odebug << "sorted query is: " << query << "" << oendl;
- OSQLRawQuery raw( query );
- OSQLResult res = m_driver->query( &raw );
- if ( res.state() != OSQLResult::Success ){
- QArray<int> empty;
- return empty;
- }
+ OSQLRawQuery raw( query );
+ OSQLResult res = m_driver->query( &raw );
+ if ( res.state() != OSQLResult::Success ){
+ QArray<int> empty;
+ return empty;
+ }
- QArray<int> list = extractUids( res );
+ QArray<int> list = extractUids( res );
- qDebug("sorted needed %d ms!", t.elapsed() );
- return list;
+ odebug << "sorted needed " << t.elapsed() << " ms!" << oendl;
+ return list;
}
void OPimContactAccessBackend_SQL::update()
{
- qDebug("Update starts");
- QTime t;
- t.start();
+ odebug << "Update starts" << oendl;
+ QTime t;
+ t.start();
- // Now load the database set and extract the uid's
- // which will be held locally
+ // 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;
+ LoadQuery lo;
+ OSQLResult res = m_driver->query(&lo);
+ if ( res.state() != OSQLResult::Success )
+ return;
- m_uids = extractUids( res );
+ m_uids = extractUids( res );
- m_changed = false;
+ m_changed = false;
- qDebug("Update ends %d ms", t.elapsed() );
+ odebug << "Update ends " << t.elapsed() << " ms" << oendl;
}
QArray<int> OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const
{
- qDebug("extractUids");
- QTime t;
- t.start();
- OSQLResultItem::ValueList list = res.results();
- OSQLResultItem::ValueList::Iterator it;
- QArray<int> ints(list.count() );
- qDebug(" count = %d", list.count() );
-
- int i = 0;
- for (it = list.begin(); it != list.end(); ++it ) {
- ints[i] = (*it).data("uid").toInt();
- i++;
- }
- qDebug("extractUids ready: count2 = %d needs %d ms", i, t.elapsed() );
-
- return ints;
+ odebug << "extractUids" << oendl;
+ QTime t;
+ t.start();
+ OSQLResultItem::ValueList list = res.results();
+ OSQLResultItem::ValueList::Iterator it;
+ QArray<int> 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();
-
- QMap<int, QString> nonCustomMap;
-
- 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();
-
- QTime t3;
- t3.start();
- // Now loop through all columns
- QStringList fieldList = OPimContactFields::untrfields( false );
- QMap<QString, int> translate = OPimContactFields::untrFieldsToId();
- for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
- // Get data for the selected column and store it with the
- // corresponding id into the map..
-
- int id = translate[*it];
- QString value = resItem.data( (*it) );
-
- // qDebug("Reading %s... found: %s", (*it).latin1(), value.latin1() );
-
- switch( id ){
- case Qtopia::Birthday:
- case Qtopia::Anniversary:{
- // Birthday and Anniversary are encoded special ( yyyy-mm-dd )
- QStringList list = QStringList::split( '-', value );
- QStringList::Iterator lit = list.begin();
- int year = (*lit).toInt();
- int month = (*(++lit)).toInt();
- int day = (*(++lit)).toInt();
- if ( ( day != 0 ) && ( month != 0 ) && ( year != 0 ) ){
- QDate date( year, month, day );
- nonCustomMap.insert( id, OPimDateConversion::dateToString( date ) );
- }
- }
- break;
- case Qtopia::AddressCategory:
- qDebug("Category is: %s", value.latin1() );
- default:
- nonCustomMap.insert( id, value );
- }
- }
-
- // First insert uid
- nonCustomMap.insert( Qtopia::AddressUid, resItem.data( "uid" ) );
- t3needed = t3.elapsed();
-
- // qDebug("Adding UID: %s", resItem.data( "uid" ).latin1() );
- qDebug("RequestNonCustom needed: insg.:%d ms, query: %d ms, mapping: %d ms",
- t.elapsed(), t2needed, t3needed );
-
- return nonCustomMap;
+ QTime t;
+ t.start();
+
+ QMap<int, QString> nonCustomMap;
+
+ 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();
+
+ QTime t3;
+ t3.start();
+ // Now loop through all columns
+ QStringList fieldList = OPimContactFields::untrfields( false );
+ QMap<QString, int> translate = OPimContactFields::untrFieldsToId();
+ for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
+ // Get data for the selected column and store it with the
+ // corresponding id into the map..
+
+ int id = translate[*it];
+ QString value = resItem.data( (*it) );
+
+ // odebug << "Reading " << (*it) << "... found: " << value << "" << oendl;
+
+ switch( id ){
+ case Qtopia::Birthday:
+ case Qtopia::Anniversary:{
+ // Birthday and Anniversary are encoded special ( yyyy-mm-dd )
+ QStringList list = QStringList::split( '-', value );
+ QStringList::Iterator lit = list.begin();
+ int year = (*lit).toInt();
+ int month = (*(++lit)).toInt();
+ int day = (*(++lit)).toInt();
+ if ( ( day != 0 ) && ( month != 0 ) && ( year != 0 ) ){
+ QDate date( year, month, day );
+ nonCustomMap.insert( id, OPimDateConversion::dateToString( date ) );
+ }
+ }
+ break;
+ case Qtopia::AddressCategory:
+ odebug << "Category is: " << value << "" << oendl;
+ default:
+ nonCustomMap.insert( id, value );
+ }
+ }
+
+ // 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;
+
+ return nonCustomMap;
}
QMap<QString, QString> OPimContactAccessBackend_SQL::requestCustom( int uid ) const
{
- QTime t;
- t.start();
-
- QMap<QString, QString> customMap;
-
- FindCustomQuery query( uid );
- OSQLResult res_custom = m_driver->query( &query );
-
- if ( res_custom.state() == OSQLResult::Failure ) {
- qWarning("OSQLResult::Failure in find query !!");
- QMap<QString, QString> empty;
- return empty;
- }
-
- OSQLResultItem::ValueList list = res_custom.results();
- OSQLResultItem::ValueList::Iterator it = list.begin();
- for ( ; it != list.end(); ++it ) {
- customMap.insert( (*it).data( "type" ), (*it).data( "value" ) );
- }
-
- qDebug("RequestCustom needed: %d ms", t.elapsed() );
- return customMap;
+ QTime t;
+ t.start();
+
+ QMap<QString, QString> customMap;
+
+ FindCustomQuery query( uid );
+ OSQLResult res_custom = m_driver->query( &query );
+
+ if ( res_custom.state() == OSQLResult::Failure ) {
+ owarn << "OSQLResult::Failure in find query !!" << oendl;
+ QMap<QString, QString> empty;
+ return empty;
+ }
+
+ OSQLResultItem::ValueList list = res_custom.results();
+ OSQLResultItem::ValueList::Iterator it = list.begin();
+ for ( ; it != list.end(); ++it ) {
+ customMap.insert( (*it).data( "type" ), (*it).data( "value" ) );
+ }
+
+ odebug << "RequestCustom needed: " << t.elapsed() << " ms" << oendl;
+ return customMap;
}
}