summaryrefslogtreecommitdiff
authorbrad <brad>2004-04-11 12:43:55 (UTC)
committer brad <brad>2004-04-11 12:43:55 (UTC)
commit9716f8c5672a8596306a9b432d9fabc4361baea5 (patch) (unidiff)
tree2b4f23f7e1291ff9f3ff7788068918e31ed63bef
parent40c0415fe7afeeb03de7441e2f667495e81edfa7 (diff)
downloadopie-9716f8c5672a8596306a9b432d9fabc4361baea5.zip
opie-9716f8c5672a8596306a9b432d9fabc4361baea5.tar.gz
opie-9716f8c5672a8596306a9b432d9fabc4361baea5.tar.bz2
Fixes for sqlite regex driver. Function must be implemented as
rlike("pattern","match") instead of "where uid rlike("99")" you must use "where rlike("99",uid). My mistake. Also fixes for pointer math for context regex caching.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--libopie2/opiedb/osqlitedriver.cpp19
-rw-r--r--libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp4
2 files changed, 14 insertions, 9 deletions
diff --git a/libopie2/opiedb/osqlitedriver.cpp b/libopie2/opiedb/osqlitedriver.cpp
index ccac2f8..588fc8f 100644
--- a/libopie2/opiedb/osqlitedriver.cpp
+++ b/libopie2/opiedb/osqlitedriver.cpp
@@ -1,233 +1,238 @@
1/* 1/*
2                 This file is part of the Opie Project 2                 This file is part of the Opie Project
3 3
4 =. 4 =.
5 .=l. 5 .=l.
6           .>+-= 6           .>+-=
7 _;:,     .>    :=|. This program is free software; you can 7 _;:,     .>    :=|. This program is free software; you can
8.> <`_,   >  .   <= redistribute it and/or modify it under 8.> <`_,   >  .   <= redistribute it and/or modify it under
9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public 9:`=1 )Y*s>-.--   : the terms of the GNU Library General Public
10.="- .-=="i,     .._ License as published by the Free Software 10.="- .-=="i,     .._ License as published by the Free Software
11 - .   .-<_>     .<> Foundation; either version 2 of the License, 11 - .   .-<_>     .<> Foundation; either version 2 of the License,
12     ._= =}       : or (at your option) any later version. 12     ._= =}       : or (at your option) any later version.
13    .%`+i>       _;_. 13    .%`+i>       _;_.
14    .i_,=:_.      -<s. This program is distributed in the hope that 14    .i_,=:_.      -<s. This program is distributed in the hope that
15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY; 15     +  .  -:.       = it will be useful, but WITHOUT ANY WARRANTY;
16    : ..    .:,     . . . without even the implied warranty of 16    : ..    .:,     . . . without even the implied warranty of
17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A 17    =_        +     =;=|` MERCHANTABILITY or FITNESS FOR A
18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU 18  _.=:.       :    :=>`: PARTICULAR PURPOSE. See the GNU
19..}^=.=       =       ; Library General Public License for more 19..}^=.=       =       ; Library General Public License for more
20++=   -.     .`     .: details. 20++=   -.     .`     .: details.
21 :     =  ...= . :.=- 21 :     =  ...= . :.=-
22 -.   .:....=;==+<; You should have received a copy of the GNU 22 -.   .:....=;==+<; You should have received a copy of the GNU
23  -_. . .   )=.  = Library General Public License along with 23  -_. . .   )=.  = Library General Public License along with
24    --        :-=` this library; see the file COPYING.LIB. 24    --        :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28 28
29*/ 29*/
30 30
31#include "osqlquery.h" 31#include "osqlquery.h"
32#include "osqlitedriver.h" 32#include "osqlitedriver.h"
33 33
34#include <opie2/odebug.h> 34#include <opie2/odebug.h>
35 35
36#include <stdlib.h> 36#include <stdlib.h>
37#include <stdio.h> 37#include <stdio.h>
38 38
39// fromLocal8Bit() does not work as expected. Thus it 39// fromLocal8Bit() does not work as expected. Thus it
40// is replaced by fromLatin1() (eilers) 40// is replaced by fromLatin1() (eilers)
41#define __BUGGY_LOCAL8BIT_ 41#define __BUGGY_LOCAL8BIT_
42 42
43namespace Opie { 43namespace Opie {
44namespace DB { 44namespace DB {
45namespace Internal { 45namespace Internal {
46 46
47namespace { 47namespace {
48 struct Query { 48 struct Query {
49 OSQLError::ValueList errors; 49 OSQLError::ValueList errors;
50 OSQLResultItem::ValueList items; 50 OSQLResultItem::ValueList items;
51 OSQLiteDriver *driver; 51 OSQLiteDriver *driver;
52 }; 52 };
53} 53}
54 54
55 55
56OSQLiteDriver::OSQLiteDriver( QLibrary *lib ) 56OSQLiteDriver::OSQLiteDriver( QLibrary *lib )
57 : OSQLDriver( lib ) 57 : OSQLDriver( lib )
58{ 58{
59 m_sqlite = 0l; 59 m_sqlite = 0l;
60} 60}
61 61
62 62
63OSQLiteDriver::~OSQLiteDriver() { 63OSQLiteDriver::~OSQLiteDriver() {
64 close(); 64 close();
65} 65}
66 66
67 67
68QString OSQLiteDriver::id()const { 68QString OSQLiteDriver::id()const {
69 return QString::fromLatin1("SQLite"); 69 return QString::fromLatin1("SQLite");
70} 70}
71 71
72void OSQLiteDriver::setUserName( const QString& ) {} 72void OSQLiteDriver::setUserName( const QString& ) {}
73 73
74 74
75void OSQLiteDriver::setPassword( const QString& ) {} 75void OSQLiteDriver::setPassword( const QString& ) {}
76 76
77 77
78void OSQLiteDriver::setUrl( const QString& url ) { 78void OSQLiteDriver::setUrl( const QString& url ) {
79 m_url = url; 79 m_url = url;
80} 80}
81 81
82 82
83void OSQLiteDriver::setOptions( const QStringList& ) { 83void OSQLiteDriver::setOptions( const QStringList& ) {
84} 84}
85 85
86/* 86/*
87 * Functions to patch a regex search into sqlite 87 * Functions to patch a regex search into sqlite
88 */ 88 */
89int sqliteRlikeCompare(const char *zPattern, const char *zString, sqregex *reg){ 89int sqliteRlikeCompare(const char *zPattern, const char *zString, sqregex *reg){
90 int res; 90 int res;
91
92 if (reg->regex_raw == NULL || (strcmp (zPattern, reg->regex_raw) != 0)){ 91 if (reg->regex_raw == NULL || (strcmp (zPattern, reg->regex_raw) != 0)){
93 if (reg->regex_raw != NULL) { 92 if (reg->regex_raw != NULL) {
94 free(reg->regex_raw); 93 free(reg->regex_raw);
95 regfree(&reg->regex_c); 94 regfree(&reg->regex_c);
96 } 95 }
97 reg->regex_raw = (char *)malloc(strlen(zPattern)+1); 96 reg->regex_raw = (char *)malloc(strlen(zPattern)+1);
98 strncpy(reg->regex_raw, zPattern, strlen(zPattern)+1); 97 strncpy(reg->regex_raw, zPattern, strlen(zPattern)+1);
99 res = regcomp(&reg->regex_c, zPattern, REG_EXTENDED); 98 res = regcomp(&reg->regex_c, zPattern, REG_EXTENDED);
100 if ( res != 0 ) { 99 if ( res != 0 ) {
101 printf("Regcomp failed with code %u on string %s\n",res,zPattern); 100 printf("Regcomp failed with code %u on string %s\n",res,zPattern);
102 free(reg->regex_raw); 101 free(reg->regex_raw);
103 reg->regex_raw=NULL; 102 reg->regex_raw=NULL;
104 return 0; 103 return 0;
105 } 104 }
106 } 105 }
107 res = (regexec(&reg->regex_c, zString, 0, NULL, 0)==0); 106 res = (regexec(&reg->regex_c, zString, 0, NULL, 0)==0);
108 return res; 107 return res;
109} 108}
110 109
111void rlikeFunc(sqlite_func *context, int arg, const char **argv){ 110void rlikeFunc(sqlite_func *context, int arg, const char **argv){
112 if( argv[0]==0 || argv[1]==0 || argv[2]==0){ 111 if( argv[0]==0 || argv[1]==0 ){
113 printf("One of arguments Null!!\n"); 112 printf("One of arguments Null!!\n");
114 return; 113 return;
115 } 114 }
116 sqlite_set_result_int(context, 115 sqlite_set_result_int(context,
117 sqliteRlikeCompare((const char*)argv[0], 116 sqliteRlikeCompare((const char*)argv[0],
118 (const char*)argv[1], (sqregex*)argv[2])); 117 (const char*)argv[1], (sqregex *)sqlite_user_data(context) ));
119} 118}
120 119
121/* 120/*
122 * try to open a db specified via setUrl 121 * try to open a db specified via setUrl
123 * and options 122 * and options
124 */ 123 */
125bool OSQLiteDriver::open() { 124bool OSQLiteDriver::open() {
126 char *error; 125 char *error;
127 qDebug("OSQLiteDriver::open: about to open"); 126
127 qDebug("OSQLiteDriver::open: about to open");
128 m_sqlite = sqlite_open(m_url.local8Bit(), 128 m_sqlite = sqlite_open(m_url.local8Bit(),
129 0, 129 0,
130 &error ); 130 &error );
131 131
132 /* failed to open */ 132 /* failed to open */
133 if (m_sqlite == 0l ) { 133 if (m_sqlite == 0l ) {
134 // FIXME set the last error 134 // FIXME set the last error
135 qWarning("OSQLiteDriver::open: %s", error ); 135 qWarning("OSQLiteDriver::open: %s", error );
136 free( error ); 136 free( error );
137 return false; 137 return false;
138 } 138 }
139 sqlite_create_function(m_sqlite,"rlike",3,rlikeFunc,&sqreg); 139 if (sqlite_create_function(m_sqlite,"rlike",2,rlikeFunc,&sqreg) != 0)
140 odebug << "Unable to create user defined function!" << oendl;
141 if (sqlite_function_type(m_sqlite,"rlike",SQLITE_NUMERIC) != 0)
142 odebug << "Unable to set rlike function result type!" << oendl;
143 sqreg.regex_raw = NULL;
140 return true; 144 return true;
141} 145}
142 146
143 147
144/* close the db 148/* close the db
145 * sqlite closes them without 149 * sqlite closes them without
146 * telling failure or success 150 * telling failure or success
147 */ 151 */
148bool OSQLiteDriver::close() { 152bool OSQLiteDriver::close() {
149 if (m_sqlite ) 153 if (m_sqlite )
150 sqlite_close( m_sqlite ), m_sqlite=0l; 154 sqlite_close( m_sqlite ), m_sqlite=0l;
151 if (sqreg.regex_raw != NULL){ 155 if (sqreg.regex_raw != NULL){
152 free(sqreg.regex_raw); 156 odebug << "Freeing regex on close" << oendl;
157 free(sqreg.regex_raw);
153 sqreg.regex_raw=NULL; 158 sqreg.regex_raw=NULL;
154 regfree(&sqreg.regex_c); 159 regfree(&sqreg.regex_c);
155 } 160 }
156 return true; 161 return true;
157} 162}
158 163
159 164
160/* Query */ 165/* Query */
161OSQLResult OSQLiteDriver::query( OSQLQuery* qu) { 166OSQLResult OSQLiteDriver::query( OSQLQuery* qu) {
162 if ( !m_sqlite ) { 167 if ( !m_sqlite ) {
163 // FIXME set error code 168 // FIXME set error code
164 OSQLResult result( OSQLResult::Failure ); 169 OSQLResult result( OSQLResult::Failure );
165 return result; 170 return result;
166 } 171 }
167 Query query; 172 Query query;
168 query.driver = this; 173 query.driver = this;
169 char *err; 174 char *err;
170 /* SQLITE_OK 0 if return code > 0 == failure */ 175 /* SQLITE_OK 0 if return code > 0 == failure */
171 if ( sqlite_exec(m_sqlite, qu->query(),&call_back, &query, &err) > 0 ) { 176 if ( sqlite_exec(m_sqlite, qu->query(),&call_back, &query, &err) > 0 ) {
172 qWarning("OSQLiteDriver::query: Error while executing"); 177 qWarning("OSQLiteDriver::query: Error while executing %s",err);
173 free(err ); 178 free(err );
174 // FixMe Errors 179 // FixMe Errors
175 } 180 }
176 181
177 OSQLResult result(OSQLResult::Success, 182 OSQLResult result(OSQLResult::Success,
178 query.items, 183 query.items,
179 query.errors ); 184 query.errors );
180 return result; 185 return result;
181} 186}
182 187
183 188
184OSQLTable::ValueList OSQLiteDriver::tables() const { 189OSQLTable::ValueList OSQLiteDriver::tables() const {
185 190
186} 191}
187 192
188 193
189OSQLError OSQLiteDriver::lastError() { 194OSQLError OSQLiteDriver::lastError() {
190 OSQLError error; 195 OSQLError error;
191 return error; 196 return error;
192}; 197};
193 198
194 199
195/* handle a callback add the row to the global 200/* handle a callback add the row to the global
196 * OSQLResultItem 201 * OSQLResultItem
197 */ 202 */
198int OSQLiteDriver::handleCallBack( int, char**, char** ) { 203int OSQLiteDriver::handleCallBack( int, char**, char** ) {
199 return 0; 204 return 0;
200} 205}
201 206
202 207
203/* callback_handler add the values to the list*/ 208/* callback_handler add the values to the list*/
204int OSQLiteDriver::call_back( void* voi, int argc, 209int OSQLiteDriver::call_back( void* voi, int argc,
205 char** argv, char** columns) { 210 char** argv, char** columns) {
206 Query* qu = (Query*)voi; 211 Query* qu = (Query*)voi;
207 212
208 //copy them over to a OSQLResultItem 213 //copy them over to a OSQLResultItem
209 QMap<QString, QString> tableString; 214 QMap<QString, QString> tableString;
210 QMap<int, QString> tableInt; 215 QMap<int, QString> tableInt;
211 for (int i = 0; i < argc; i++ ) { 216 for (int i = 0; i < argc; i++ ) {
212 217
213#ifdef __BUGGY_LOCAL8BIT_ 218#ifdef __BUGGY_LOCAL8BIT_
214 tableInt.insert( i, QString::fromLatin1( argv[i] ) ); 219 tableInt.insert( i, QString::fromLatin1( argv[i] ) );
215 tableString.insert( QString::fromLatin1( columns[i] ), 220 tableString.insert( QString::fromLatin1( columns[i] ),
216 QString::fromLatin1( argv[i] ) ); 221 QString::fromLatin1( argv[i] ) );
217#else 222#else
218 tableInt.insert( i, QString::fromLocal8Bit( argv[i] ) ); 223 tableInt.insert( i, QString::fromLocal8Bit( argv[i] ) );
219 tableString.insert( QString::fromLocal8Bit( columns[i] ), 224 tableString.insert( QString::fromLocal8Bit( columns[i] ),
220 QString::fromLocal8Bit( argv[i] ) ); 225 QString::fromLocal8Bit( argv[i] ) );
221#endif 226#endif
222 } 227 }
223 OSQLResultItem item( tableString, tableInt ); 228 OSQLResultItem item( tableString, tableInt );
224 qu->items.append( item ); 229 qu->items.append( item );
225 230
226 return ((Query*)voi)->driver->handleCallBack( argc, 231 return ((Query*)voi)->driver->handleCallBack( argc,
227 argv, 232 argv,
228 columns ); 233 columns );
229 234
230 235
231} 236}
232 237
233}}} // namespace OPIE::DB::Internal 238}}} // namespace OPIE::DB::Internal
diff --git a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp
index bb5c99b..401a3c1 100644
--- a/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp
+++ b/libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp
@@ -1,851 +1,851 @@
1/* 1/*
2 This file is part of the Opie Project 2 This file is part of the Opie Project
3 Copyright (C) Stefan Eilers <eilers.stefan@epost.de> 3 Copyright (C) Stefan Eilers <eilers.stefan@epost.de>
4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org> 4 =. Copyright (C) The Opie Team <opie-devel@handhelds.org>
5 .=l. 5 .=l.
6 .>+-= 6 .>+-=
7 _;:, .> :=|. This program is free software; you can 7 _;:, .> :=|. This program is free software; you can
8.> <`_, > . <= redistribute it and/or modify it under 8.> <`_, > . <= redistribute it and/or modify it under
9:`=1 )Y*s>-.-- : the terms of the GNU Library General Public 9:`=1 )Y*s>-.-- : the terms of the GNU Library General Public
10.="- .-=="i, .._ License as published by the Free Software 10.="- .-=="i, .._ License as published by the Free Software
11 - . .-<_> .<> Foundation; either version 2 of the License, 11 - . .-<_> .<> Foundation; either version 2 of the License,
12 ._= =} : or (at your option) any later version. 12 ._= =} : or (at your option) any later version.
13 .%`+i> _;_. 13 .%`+i> _;_.
14 .i_,=:_. -<s. This program is distributed in the hope that 14 .i_,=:_. -<s. This program is distributed in the hope that
15 + . -:. = it will be useful, but WITHOUT ANY WARRANTY; 15 + . -:. = it will be useful, but WITHOUT ANY WARRANTY;
16 : .. .:, . . . without even the implied warranty of 16 : .. .:, . . . without even the implied warranty of
17 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A 17 =_ + =;=|` MERCHANTABILITY or FITNESS FOR A
18 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU 18 _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU
19..}^=.= = ; Library General Public License for more 19..}^=.= = ; Library General Public License for more
20++= -. .` .: details. 20++= -. .` .: details.
21 : = ...= . :.=- 21 : = ...= . :.=-
22 -. .:....=;==+<; You should have received a copy of the GNU 22 -. .:....=;==+<; You should have received a copy of the GNU
23 -_. . . )=. = Library General Public License along with 23 -_. . . )=. = Library General Public License along with
24 -- :-=` this library; see the file COPYING.LIB. 24 -- :-=` this library; see the file COPYING.LIB.
25 If not, write to the Free Software Foundation, 25 If not, write to the Free Software Foundation,
26 Inc., 59 Temple Place - Suite 330, 26 Inc., 59 Temple Place - Suite 330,
27 Boston, MA 02111-1307, USA. 27 Boston, MA 02111-1307, USA.
28*/ 28*/
29/* 29/*
30 * SQL Backend for the OPIE-Contact Database. 30 * SQL Backend for the OPIE-Contact Database.
31 */ 31 */
32 32
33#include "ocontactaccessbackend_sql.h" 33#include "ocontactaccessbackend_sql.h"
34 34
35#include <qarray.h> 35#include <qarray.h>
36#include <qdatetime.h> 36#include <qdatetime.h>
37#include <qstringlist.h> 37#include <qstringlist.h>
38 38
39#include <qpe/global.h> 39#include <qpe/global.h>
40#include <qpe/recordfields.h> 40#include <qpe/recordfields.h>
41 41
42#include <opie2/opimcontact.h> 42#include <opie2/opimcontact.h>
43#include <opie2/opimcontactfields.h> 43#include <opie2/opimcontactfields.h>
44#include <opie2/opimdateconversion.h> 44#include <opie2/opimdateconversion.h>
45#include <opie2/osqldriver.h> 45#include <opie2/osqldriver.h>
46#include <opie2/osqlresult.h> 46#include <opie2/osqlresult.h>
47#include <opie2/osqlmanager.h> 47#include <opie2/osqlmanager.h>
48#include <opie2/osqlquery.h> 48#include <opie2/osqlquery.h>
49 49
50using namespace Opie; 50using namespace Opie;
51using namespace Opie::DB; 51using namespace Opie::DB;
52 52
53 53
54/* 54/*
55 * Implementation of used query types * CREATE query 55 * Implementation of used query types * CREATE query
56 * LOAD query 56 * LOAD query
57 * INSERT 57 * INSERT
58 * REMOVE 58 * REMOVE
59 * CLEAR 59 * CLEAR
60 */ 60 */
61namespace { 61namespace {
62 /** 62 /**
63 * CreateQuery for the Todolist Table 63 * CreateQuery for the Todolist Table
64 */ 64 */
65 class CreateQuery : public OSQLQuery { 65 class CreateQuery : public OSQLQuery {
66 public: 66 public:
67 CreateQuery(); 67 CreateQuery();
68 ~CreateQuery(); 68 ~CreateQuery();
69 QString query()const; 69 QString query()const;
70 }; 70 };
71 71
72 /** 72 /**
73 * Clears (delete) a Table 73 * Clears (delete) a Table
74 */ 74 */
75 class ClearQuery : public OSQLQuery { 75 class ClearQuery : public OSQLQuery {
76 public: 76 public:
77 ClearQuery(); 77 ClearQuery();
78 ~ClearQuery(); 78 ~ClearQuery();
79 QString query()const; 79 QString query()const;
80 80
81 }; 81 };
82 82
83 83
84 /** 84 /**
85 * LoadQuery 85 * LoadQuery
86 * this one queries for all uids 86 * this one queries for all uids
87 */ 87 */
88 class LoadQuery : public OSQLQuery { 88 class LoadQuery : public OSQLQuery {
89 public: 89 public:
90 LoadQuery(); 90 LoadQuery();
91 ~LoadQuery(); 91 ~LoadQuery();
92 QString query()const; 92 QString query()const;
93 }; 93 };
94 94
95 /** 95 /**
96 * inserts/adds a OPimContact to the table 96 * inserts/adds a OPimContact to the table
97 */ 97 */
98 class InsertQuery : public OSQLQuery { 98 class InsertQuery : public OSQLQuery {
99 public: 99 public:
100 InsertQuery(const OPimContact& ); 100 InsertQuery(const OPimContact& );
101 ~InsertQuery(); 101 ~InsertQuery();
102 QString query()const; 102 QString query()const;
103 private: 103 private:
104 OPimContact m_contact; 104 OPimContact m_contact;
105 }; 105 };
106 106
107 107
108 /** 108 /**
109 * removes one from the table 109 * removes one from the table
110 */ 110 */
111 class RemoveQuery : public OSQLQuery { 111 class RemoveQuery : public OSQLQuery {
112 public: 112 public:
113 RemoveQuery(int uid ); 113 RemoveQuery(int uid );
114 ~RemoveQuery(); 114 ~RemoveQuery();
115 QString query()const; 115 QString query()const;
116 private: 116 private:
117 int m_uid; 117 int m_uid;
118 }; 118 };
119 119
120 /** 120 /**
121 * a find query for noncustom elements 121 * a find query for noncustom elements
122 */ 122 */
123 class FindQuery : public OSQLQuery { 123 class FindQuery : public OSQLQuery {
124 public: 124 public:
125 FindQuery(int uid); 125 FindQuery(int uid);
126 FindQuery(const QArray<int>& ); 126 FindQuery(const QArray<int>& );
127 ~FindQuery(); 127 ~FindQuery();
128 QString query()const; 128 QString query()const;
129 private: 129 private:
130 QString single()const; 130 QString single()const;
131 QString multi()const; 131 QString multi()const;
132 QArray<int> m_uids; 132 QArray<int> m_uids;
133 int m_uid; 133 int m_uid;
134 }; 134 };
135 135
136 /** 136 /**
137 * a find query for custom elements 137 * a find query for custom elements
138 */ 138 */
139 class FindCustomQuery : public OSQLQuery { 139 class FindCustomQuery : public OSQLQuery {
140 public: 140 public:
141 FindCustomQuery(int uid); 141 FindCustomQuery(int uid);
142 FindCustomQuery(const QArray<int>& ); 142 FindCustomQuery(const QArray<int>& );
143 ~FindCustomQuery(); 143 ~FindCustomQuery();
144 QString query()const; 144 QString query()const;
145 private: 145 private:
146 QString single()const; 146 QString single()const;
147 QString multi()const; 147 QString multi()const;
148 QArray<int> m_uids; 148 QArray<int> m_uids;
149 int m_uid; 149 int m_uid;
150 }; 150 };
151 151
152 152
153 153
154 // We using two tables to store the information: 154 // We using two tables to store the information:
155 // 1. addressbook : It contains General information about the contact (non custom) 155 // 1. addressbook : It contains General information about the contact (non custom)
156 // 2. custom_data : Not official supported entries 156 // 2. custom_data : Not official supported entries
157 // All tables are connected by the uid of the contact. 157 // All tables are connected by the uid of the contact.
158 // Maybe I should add a table for meta-information ? 158 // Maybe I should add a table for meta-information ?
159 CreateQuery::CreateQuery() : OSQLQuery() {} 159 CreateQuery::CreateQuery() : OSQLQuery() {}
160 CreateQuery::~CreateQuery() {} 160 CreateQuery::~CreateQuery() {}
161 QString CreateQuery::query()const { 161 QString CreateQuery::query()const {
162 QString qu; 162 QString qu;
163 163
164 qu += "create table addressbook( uid PRIMARY KEY "; 164 qu += "create table addressbook( uid PRIMARY KEY ";
165 165
166 QStringList fieldList = OPimContactFields::untrfields( false ); 166 QStringList fieldList = OPimContactFields::untrfields( false );
167 for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ 167 for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
168 qu += QString( ",\"%1\" VARCHAR(10)" ).arg( *it ); 168 qu += QString( ",\"%1\" VARCHAR(10)" ).arg( *it );
169 } 169 }
170 qu += " );"; 170 qu += " );";
171 171
172 qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), priority INTEGER, value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );"; 172 qu += "create table custom_data( uid INTEGER, id INTEGER, type VARCHAR(10), priority INTEGER, value VARCHAR(10), PRIMARY KEY /* identifier */ (uid, id) );";
173 173
174 return qu; 174 return qu;
175 } 175 }
176 176
177 ClearQuery::ClearQuery() 177 ClearQuery::ClearQuery()
178 : OSQLQuery() {} 178 : OSQLQuery() {}
179 ClearQuery::~ClearQuery() {} 179 ClearQuery::~ClearQuery() {}
180 QString ClearQuery::query()const { 180 QString ClearQuery::query()const {
181 QString qu = "drop table addressbook;"; 181 QString qu = "drop table addressbook;";
182 qu += "drop table custom_data;"; 182 qu += "drop table custom_data;";
183 // qu += "drop table dates;"; 183 // qu += "drop table dates;";
184 return qu; 184 return qu;
185 } 185 }
186 186
187 187
188 LoadQuery::LoadQuery() : OSQLQuery() {} 188 LoadQuery::LoadQuery() : OSQLQuery() {}
189 LoadQuery::~LoadQuery() {} 189 LoadQuery::~LoadQuery() {}
190 QString LoadQuery::query()const { 190 QString LoadQuery::query()const {
191 QString qu; 191 QString qu;
192 qu += "select uid from addressbook"; 192 qu += "select uid from addressbook";
193 193
194 return qu; 194 return qu;
195 } 195 }
196 196
197 197
198 InsertQuery::InsertQuery( const OPimContact& contact ) 198 InsertQuery::InsertQuery( const OPimContact& contact )
199 : OSQLQuery(), m_contact( contact ) { 199 : OSQLQuery(), m_contact( contact ) {
200 } 200 }
201 201
202 InsertQuery::~InsertQuery() { 202 InsertQuery::~InsertQuery() {
203 } 203 }
204 204
205 /* 205 /*
206 * converts from a OPimContact to a query 206 * converts from a OPimContact to a query
207 */ 207 */
208 QString InsertQuery::query()const{ 208 QString InsertQuery::query()const{
209 209
210 QString qu; 210 QString qu;
211 qu += "insert into addressbook VALUES( " + 211 qu += "insert into addressbook VALUES( " +
212 QString::number( m_contact.uid() ); 212 QString::number( m_contact.uid() );
213 213
214 // Get all information out of the contact-class 214 // Get all information out of the contact-class
215 // Remember: The category is stored in contactMap, too ! 215 // Remember: The category is stored in contactMap, too !
216 QMap<int, QString> contactMap = m_contact.toMap(); 216 QMap<int, QString> contactMap = m_contact.toMap();
217 217
218 QStringList fieldList = OPimContactFields::untrfields( false ); 218 QStringList fieldList = OPimContactFields::untrfields( false );
219 QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); 219 QMap<QString, int> translate = OPimContactFields::untrFieldsToId();
220 for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ 220 for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
221 // Convert Column-String to Id and get value for this id.. 221 // Convert Column-String to Id and get value for this id..
222 // Hmmm.. Maybe not very cute solution.. 222 // Hmmm.. Maybe not very cute solution..
223 int id = translate[*it]; 223 int id = translate[*it];
224 switch ( id ){ 224 switch ( id ){
225 case Qtopia::Birthday: 225 case Qtopia::Birthday:
226 case Qtopia::Anniversary:{ 226 case Qtopia::Anniversary:{
227 QDate day; 227 QDate day;
228 if ( id == Qtopia::Birthday ){ 228 if ( id == Qtopia::Birthday ){
229 day = m_contact.birthday(); 229 day = m_contact.birthday();
230 } else { 230 } else {
231 day = m_contact.anniversary(); 231 day = m_contact.anniversary();
232 } 232 }
233 // These entries should stored in a special format 233 // These entries should stored in a special format
234 // year-month-day 234 // year-month-day
235 if ( day.isValid() ){ 235 if ( day.isValid() ){
236 qu += QString(",\"%1-%2-%3\"") 236 qu += QString(",\"%1-%2-%3\"")
237 .arg( QString::number( day.year() ).rightJustify( 4, '0' ) ) 237 .arg( QString::number( day.year() ).rightJustify( 4, '0' ) )
238 .arg( QString::number( day.month() ).rightJustify( 2, '0' ) ) 238 .arg( QString::number( day.month() ).rightJustify( 2, '0' ) )
239 .arg( QString::number( day.day() ).rightJustify( 2, '0' ) ); 239 .arg( QString::number( day.day() ).rightJustify( 2, '0' ) );
240 } else { 240 } else {
241 qu += ",\"\""; 241 qu += ",\"\"";
242 } 242 }
243 } 243 }
244 break; 244 break;
245 default: 245 default:
246 qu += QString( ",\"%1\"" ).arg( contactMap[id] ); 246 qu += QString( ",\"%1\"" ).arg( contactMap[id] );
247 } 247 }
248 } 248 }
249 qu += " );"; 249 qu += " );";
250 250
251 251
252 // Now add custom data.. 252 // Now add custom data..
253 int id = 0; 253 int id = 0;
254 id = 0; 254 id = 0;
255 QMap<QString, QString> customMap = m_contact.toExtraMap(); 255 QMap<QString, QString> customMap = m_contact.toExtraMap();
256 for( QMap<QString, QString>::Iterator it = customMap.begin(); 256 for( QMap<QString, QString>::Iterator it = customMap.begin();
257 it != customMap.end(); ++it ){ 257 it != customMap.end(); ++it ){
258 qu += "insert into custom_data VALUES(" 258 qu += "insert into custom_data VALUES("
259 + QString::number( m_contact.uid() ) 259 + QString::number( m_contact.uid() )
260 + "," 260 + ","
261 + QString::number( id++ ) 261 + QString::number( id++ )
262 + ",'" 262 + ",'"
263 + it.key() 263 + it.key()
264 + "'," 264 + "',"
265 + "0" // Priority for future enhancements 265 + "0" // Priority for future enhancements
266 + ",'" 266 + ",'"
267 + it.data() 267 + it.data()
268 + "');"; 268 + "');";
269 } 269 }
270 // qu += "commit;"; 270 // qu += "commit;";
271 qDebug("add %s", qu.latin1() ); 271 qDebug("add %s", qu.latin1() );
272 return qu; 272 return qu;
273 } 273 }
274 274
275 275
276 RemoveQuery::RemoveQuery(int uid ) 276 RemoveQuery::RemoveQuery(int uid )
277 : OSQLQuery(), m_uid( uid ) {} 277 : OSQLQuery(), m_uid( uid ) {}
278 RemoveQuery::~RemoveQuery() {} 278 RemoveQuery::~RemoveQuery() {}
279 QString RemoveQuery::query()const { 279 QString RemoveQuery::query()const {
280 QString qu = "DELETE from addressbook where uid = " 280 QString qu = "DELETE from addressbook where uid = "
281 + QString::number(m_uid) + ";"; 281 + QString::number(m_uid) + ";";
282 qu += "DELETE from custom_data where uid = " 282 qu += "DELETE from custom_data where uid = "
283 + QString::number(m_uid) + ";"; 283 + QString::number(m_uid) + ";";
284 return qu; 284 return qu;
285 } 285 }
286 286
287 287
288 288
289 289
290 FindQuery::FindQuery(int uid) 290 FindQuery::FindQuery(int uid)
291 : OSQLQuery(), m_uid( uid ) { 291 : OSQLQuery(), m_uid( uid ) {
292 } 292 }
293 FindQuery::FindQuery(const QArray<int>& ints) 293 FindQuery::FindQuery(const QArray<int>& ints)
294 : OSQLQuery(), m_uids( ints ){ 294 : OSQLQuery(), m_uids( ints ){
295 } 295 }
296 FindQuery::~FindQuery() { 296 FindQuery::~FindQuery() {
297 } 297 }
298 QString FindQuery::query()const{ 298 QString FindQuery::query()const{
299 // if ( m_uids.count() == 0 ) 299 // if ( m_uids.count() == 0 )
300 return single(); 300 return single();
301 } 301 }
302 /* 302 /*
303 else 303 else
304 return multi(); 304 return multi();
305 } 305 }
306 QString FindQuery::multi()const { 306 QString FindQuery::multi()const {
307 QString qu = "select uid, type, value from addressbook where"; 307 QString qu = "select uid, type, value from addressbook where";
308 for (uint i = 0; i < m_uids.count(); i++ ) { 308 for (uint i = 0; i < m_uids.count(); i++ ) {
309 qu += " UID = " + QString::number( m_uids[i] ) + " OR"; 309 qu += " UID = " + QString::number( m_uids[i] ) + " OR";
310 } 310 }
311 qu.remove( qu.length()-2, 2 ); // Hmmmm.. 311 qu.remove( qu.length()-2, 2 ); // Hmmmm..
312 return qu; 312 return qu;
313 } 313 }
314 */ 314 */
315 QString FindQuery::single()const{ 315 QString FindQuery::single()const{
316 QString qu = "select *"; 316 QString qu = "select *";
317 qu += " from addressbook where uid = " + QString::number(m_uid); 317 qu += " from addressbook where uid = " + QString::number(m_uid);
318 318
319 // qWarning("find query: %s", qu.latin1() ); 319 // qWarning("find query: %s", qu.latin1() );
320 return qu; 320 return qu;
321 } 321 }
322 322
323 323
324 FindCustomQuery::FindCustomQuery(int uid) 324 FindCustomQuery::FindCustomQuery(int uid)
325 : OSQLQuery(), m_uid( uid ) { 325 : OSQLQuery(), m_uid( uid ) {
326 } 326 }
327 FindCustomQuery::FindCustomQuery(const QArray<int>& ints) 327 FindCustomQuery::FindCustomQuery(const QArray<int>& ints)
328 : OSQLQuery(), m_uids( ints ){ 328 : OSQLQuery(), m_uids( ints ){
329 } 329 }
330 FindCustomQuery::~FindCustomQuery() { 330 FindCustomQuery::~FindCustomQuery() {
331 } 331 }
332 QString FindCustomQuery::query()const{ 332 QString FindCustomQuery::query()const{
333 // if ( m_uids.count() == 0 ) 333 // if ( m_uids.count() == 0 )
334 return single(); 334 return single();
335 } 335 }
336 QString FindCustomQuery::single()const{ 336 QString FindCustomQuery::single()const{
337 QString qu = "select uid, type, value from custom_data where uid = "; 337 QString qu = "select uid, type, value from custom_data where uid = ";
338 qu += QString::number(m_uid); 338 qu += QString::number(m_uid);
339 return qu; 339 return qu;
340 } 340 }
341 341
342}; 342};
343 343
344 344
345/* --------------------------------------------------------------------------- */ 345/* --------------------------------------------------------------------------- */
346 346
347namespace Opie { 347namespace Opie {
348 348
349OPimContactAccessBackend_SQL::OPimContactAccessBackend_SQL ( const QString& /* appname */, 349OPimContactAccessBackend_SQL::OPimContactAccessBackend_SQL ( const QString& /* appname */,
350 const QString& filename ): 350 const QString& filename ):
351 OPimContactAccessBackend(), m_changed(false), m_driver( NULL ) 351 OPimContactAccessBackend(), m_changed(false), m_driver( NULL )
352{ 352{
353 qDebug("C'tor OPimContactAccessBackend_SQL starts"); 353 qDebug("C'tor OPimContactAccessBackend_SQL starts");
354 QTime t; 354 QTime t;
355 t.start(); 355 t.start();
356 356
357 /* Expecting to access the default filename if nothing else is set */ 357 /* Expecting to access the default filename if nothing else is set */
358 if ( filename.isEmpty() ){ 358 if ( filename.isEmpty() ){
359 m_fileName = Global::applicationFileName( "addressbook","addressbook.db" ); 359 m_fileName = Global::applicationFileName( "addressbook","addressbook.db" );
360 } else 360 } else
361 m_fileName = filename; 361 m_fileName = filename;
362 362
363 // Get the standart sql-driver from the OSQLManager.. 363 // Get the standart sql-driver from the OSQLManager..
364 OSQLManager man; 364 OSQLManager man;
365 m_driver = man.standard(); 365 m_driver = man.standard();
366 m_driver->setUrl( m_fileName ); 366 m_driver->setUrl( m_fileName );
367 367
368 load(); 368 load();
369 369
370 qDebug("C'tor OPimContactAccessBackend_SQL ends: %d ms", t.elapsed() ); 370 qDebug("C'tor OPimContactAccessBackend_SQL ends: %d ms", t.elapsed() );
371} 371}
372 372
373OPimContactAccessBackend_SQL::~OPimContactAccessBackend_SQL () 373OPimContactAccessBackend_SQL::~OPimContactAccessBackend_SQL ()
374{ 374{
375 if( m_driver ) 375 if( m_driver )
376 delete m_driver; 376 delete m_driver;
377} 377}
378 378
379bool OPimContactAccessBackend_SQL::load () 379bool OPimContactAccessBackend_SQL::load ()
380{ 380{
381 if (!m_driver->open() ) 381 if (!m_driver->open() )
382 return false; 382 return false;
383 383
384 // Don't expect that the database exists. 384 // Don't expect that the database exists.
385 // It is save here to create the table, even if it 385 // It is save here to create the table, even if it
386 // do exist. ( Is that correct for all databases ?? ) 386 // do exist. ( Is that correct for all databases ?? )
387 CreateQuery creat; 387 CreateQuery creat;
388 OSQLResult res = m_driver->query( &creat ); 388 OSQLResult res = m_driver->query( &creat );
389 389
390 update(); 390 update();
391 391
392 return true; 392 return true;
393 393
394} 394}
395 395
396bool OPimContactAccessBackend_SQL::reload() 396bool OPimContactAccessBackend_SQL::reload()
397{ 397{
398 return load(); 398 return load();
399} 399}
400 400
401bool OPimContactAccessBackend_SQL::save() 401bool OPimContactAccessBackend_SQL::save()
402{ 402{
403 return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers) 403 return m_driver->close(); // Shouldn't m_driver->sync be better than close ? (eilers)
404} 404}
405 405
406 406
407void OPimContactAccessBackend_SQL::clear () 407void OPimContactAccessBackend_SQL::clear ()
408{ 408{
409 ClearQuery cle; 409 ClearQuery cle;
410 OSQLResult res = m_driver->query( &cle ); 410 OSQLResult res = m_driver->query( &cle );
411 411
412 reload(); 412 reload();
413} 413}
414 414
415bool OPimContactAccessBackend_SQL::wasChangedExternally() 415bool OPimContactAccessBackend_SQL::wasChangedExternally()
416{ 416{
417 return false; 417 return false;
418} 418}
419 419
420QArray<int> OPimContactAccessBackend_SQL::allRecords() const 420QArray<int> OPimContactAccessBackend_SQL::allRecords() const
421{ 421{
422 422
423 // FIXME: Think about cute handling of changed tables.. 423 // FIXME: Think about cute handling of changed tables..
424 // Thus, we don't have to call update here... 424 // Thus, we don't have to call update here...
425 if ( m_changed ) 425 if ( m_changed )
426 ((OPimContactAccessBackend_SQL*)this)->update(); 426 ((OPimContactAccessBackend_SQL*)this)->update();
427 427
428 return m_uids; 428 return m_uids;
429} 429}
430 430
431bool OPimContactAccessBackend_SQL::add ( const OPimContact &newcontact ) 431bool OPimContactAccessBackend_SQL::add ( const OPimContact &newcontact )
432{ 432{
433 InsertQuery ins( newcontact ); 433 InsertQuery ins( newcontact );
434 OSQLResult res = m_driver->query( &ins ); 434 OSQLResult res = m_driver->query( &ins );
435 435
436 if ( res.state() == OSQLResult::Failure ) 436 if ( res.state() == OSQLResult::Failure )
437 return false; 437 return false;
438 438
439 int c = m_uids.count(); 439 int c = m_uids.count();
440 m_uids.resize( c+1 ); 440 m_uids.resize( c+1 );
441 m_uids[c] = newcontact.uid(); 441 m_uids[c] = newcontact.uid();
442 442
443 return true; 443 return true;
444} 444}
445 445
446 446
447bool OPimContactAccessBackend_SQL::remove ( int uid ) 447bool OPimContactAccessBackend_SQL::remove ( int uid )
448{ 448{
449 RemoveQuery rem( uid ); 449 RemoveQuery rem( uid );
450 OSQLResult res = m_driver->query(&rem ); 450 OSQLResult res = m_driver->query(&rem );
451 451
452 if ( res.state() == OSQLResult::Failure ) 452 if ( res.state() == OSQLResult::Failure )
453 return false; 453 return false;
454 454
455 m_changed = true; 455 m_changed = true;
456 456
457 return true; 457 return true;
458} 458}
459 459
460bool OPimContactAccessBackend_SQL::replace ( const OPimContact &contact ) 460bool OPimContactAccessBackend_SQL::replace ( const OPimContact &contact )
461{ 461{
462 if ( !remove( contact.uid() ) ) 462 if ( !remove( contact.uid() ) )
463 return false; 463 return false;
464 464
465 return add( contact ); 465 return add( contact );
466} 466}
467 467
468 468
469OPimContact OPimContactAccessBackend_SQL::find ( int uid ) const 469OPimContact OPimContactAccessBackend_SQL::find ( int uid ) const
470{ 470{
471 qDebug("OPimContactAccessBackend_SQL::find()"); 471 qDebug("OPimContactAccessBackend_SQL::find()");
472 QTime t; 472 QTime t;
473 t.start(); 473 t.start();
474 474
475 OPimContact retContact( requestNonCustom( uid ) ); 475 OPimContact retContact( requestNonCustom( uid ) );
476 retContact.setExtraMap( requestCustom( uid ) ); 476 retContact.setExtraMap( requestCustom( uid ) );
477 477
478 qDebug("OPimContactAccessBackend_SQL::find() needed: %d ms", t.elapsed() ); 478 qDebug("OPimContactAccessBackend_SQL::find() needed: %d ms", t.elapsed() );
479 return retContact; 479 return retContact;
480} 480}
481 481
482 482
483 483
484QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &query, int settings, const QDateTime& qd ) 484QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &query, int settings, const QDateTime& qd )
485{ 485{
486 QString qu = "SELECT uid FROM addressbook WHERE"; 486 QString qu = "SELECT uid FROM addressbook WHERE";
487 QString searchQuery =""; 487 QString searchQuery ="";
488 488
489 QDate startDate; 489 QDate startDate;
490 490
491 if ( qd.isValid() ) 491 if ( qd.isValid() )
492 startDate = qd.date(); 492 startDate = qd.date();
493 else 493 else
494 startDate = QDate::currentDate(); 494 startDate = QDate::currentDate();
495 495
496 496
497 QMap<int, QString> queryFields = query.toMap(); 497 QMap<int, QString> queryFields = query.toMap();
498 QStringList fieldList = OPimContactFields::untrfields( false ); 498 QStringList fieldList = OPimContactFields::untrfields( false );
499 QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); 499 QMap<QString, int> translate = OPimContactFields::untrFieldsToId();
500 500
501 // Convert every filled field to a SQL-Query 501 // Convert every filled field to a SQL-Query
502 // bool isAnyFieldSelected = false; 502 // bool isAnyFieldSelected = false;
503 for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ 503 for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
504 504
505 int id = translate[*it]; 505 int id = translate[*it];
506 QString queryStr = queryFields[id]; 506 QString queryStr = queryFields[id];
507 QDate* endDate = 0l; 507 QDate* endDate = 0l;
508 508
509 if ( !queryStr.isEmpty() ){ 509 if ( !queryStr.isEmpty() ){
510 // If something is alredy stored in the query, add an "AND" 510 // If something is alredy stored in the query, add an "AND"
511 // to the end of the string to prepare for the next .. 511 // to the end of the string to prepare for the next ..
512 if ( !searchQuery.isEmpty() ) 512 if ( !searchQuery.isEmpty() )
513 searchQuery += " AND"; 513 searchQuery += " AND";
514 514
515 // isAnyFieldSelected = true; 515 // isAnyFieldSelected = true;
516 switch( id ){ 516 switch( id ){
517 case Qtopia::Birthday: 517 case Qtopia::Birthday:
518 endDate = new QDate( query.birthday() ); 518 endDate = new QDate( query.birthday() );
519 // Fall through ! 519 // Fall through !
520 case Qtopia::Anniversary: 520 case Qtopia::Anniversary:
521 if ( endDate == 0l ) 521 if ( endDate == 0l )
522 endDate = new QDate( query.anniversary() ); 522 endDate = new QDate( query.anniversary() );
523 523
524 if ( settings & OPimContactAccess::DateDiff ) { 524 if ( settings & OPimContactAccess::DateDiff ) {
525 searchQuery += QString( " (\"%1\" <= '%2-%3-%4\' AND \"%5\" >= '%6-%7-%8')" ) 525 searchQuery += QString( " (\"%1\" <= '%2-%3-%4\' AND \"%5\" >= '%6-%7-%8')" )
526 .arg( *it ) 526 .arg( *it )
527 .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) ) 527 .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) )
528 .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) ) 528 .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) )
529 .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) ) 529 .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) )
530 .arg( *it ) 530 .arg( *it )
531 .arg( QString::number( startDate.year() ).rightJustify( 4, '0' ) ) 531 .arg( QString::number( startDate.year() ).rightJustify( 4, '0' ) )
532 .arg( QString::number( startDate.month() ).rightJustify( 2, '0' ) ) 532 .arg( QString::number( startDate.month() ).rightJustify( 2, '0' ) )
533 .arg( QString::number( startDate.day() ).rightJustify( 2, '0' ) ) ; 533 .arg( QString::number( startDate.day() ).rightJustify( 2, '0' ) ) ;
534 } 534 }
535 535
536 if ( settings & OPimContactAccess::DateYear ){ 536 if ( settings & OPimContactAccess::DateYear ){
537 if ( settings & OPimContactAccess::DateDiff ) 537 if ( settings & OPimContactAccess::DateDiff )
538 searchQuery += " AND"; 538 searchQuery += " AND";
539 539
540 searchQuery += QString( " (\"%1\" LIKE '%2-%')" ) 540 searchQuery += QString( " (\"%1\" LIKE '%2-%')" )
541 .arg( *it ) 541 .arg( *it )
542 .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) ); 542 .arg( QString::number( endDate->year() ).rightJustify( 4, '0' ) );
543 } 543 }
544 544
545 if ( settings & OPimContactAccess::DateMonth ){ 545 if ( settings & OPimContactAccess::DateMonth ){
546 if ( ( settings & OPimContactAccess::DateDiff ) 546 if ( ( settings & OPimContactAccess::DateDiff )
547 || ( settings & OPimContactAccess::DateYear ) ) 547 || ( settings & OPimContactAccess::DateYear ) )
548 searchQuery += " AND"; 548 searchQuery += " AND";
549 549
550 searchQuery += QString( " (\"%1\" LIKE '%-%2-%')" ) 550 searchQuery += QString( " (\"%1\" LIKE '%-%2-%')" )
551 .arg( *it ) 551 .arg( *it )
552 .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) ); 552 .arg( QString::number( endDate->month() ).rightJustify( 2, '0' ) );
553 } 553 }
554 554
555 if ( settings & OPimContactAccess::DateDay ){ 555 if ( settings & OPimContactAccess::DateDay ){
556 if ( ( settings & OPimContactAccess::DateDiff ) 556 if ( ( settings & OPimContactAccess::DateDiff )
557 || ( settings & OPimContactAccess::DateYear ) 557 || ( settings & OPimContactAccess::DateYear )
558 || ( settings & OPimContactAccess::DateMonth ) ) 558 || ( settings & OPimContactAccess::DateMonth ) )
559 searchQuery += " AND"; 559 searchQuery += " AND";
560 560
561 searchQuery += QString( " (\"%1\" LIKE '%-%-%2')" ) 561 searchQuery += QString( " (\"%1\" LIKE '%-%-%2')" )
562 .arg( *it ) 562 .arg( *it )
563 .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) ); 563 .arg( QString::number( endDate->day() ).rightJustify( 2, '0' ) );
564 } 564 }
565 565
566 break; 566 break;
567 default: 567 default:
568 // Switching between case sensitive and insensitive... 568 // Switching between case sensitive and insensitive...
569 // LIKE is not case sensitive, GLOB is case sensitive 569 // LIKE is not case sensitive, GLOB is case sensitive
570 // Do exist a better solution to switch this ? 570 // Do exist a better solution to switch this ?
571 if ( settings & OPimContactAccess::IgnoreCase ) 571 if ( settings & OPimContactAccess::IgnoreCase )
572 searchQuery += "(\"" + *it + "\"" + " LIKE " + "'" 572 searchQuery += "(\"" + *it + "\"" + " LIKE " + "'"
573 + queryStr.replace(QRegExp("\\*"),"%") + "'" + ")"; 573 + queryStr.replace(QRegExp("\\*"),"%") + "'" + ")";
574 else 574 else
575 searchQuery += "(\"" + *it + "\"" + " GLOB " + "'" 575 searchQuery += "(\"" + *it + "\"" + " GLOB " + "'"
576 + queryStr + "'" + ")"; 576 + queryStr + "'" + ")";
577 577
578 } 578 }
579 } 579 }
580 } 580 }
581 // Skip trailing "AND" 581 // Skip trailing "AND"
582 // if ( isAnyFieldSelected ) 582 // if ( isAnyFieldSelected )
583 // qu = qu.left( qu.length() - 4 ); 583 // qu = qu.left( qu.length() - 4 );
584 584
585 qu += searchQuery; 585 qu += searchQuery;
586 586
587 qDebug( "queryByExample query: %s", qu.latin1() ); 587 qDebug( "queryByExample query: %s", qu.latin1() );
588 588
589 // Execute query and return the received uid's 589 // Execute query and return the received uid's
590 OSQLRawQuery raw( qu ); 590 OSQLRawQuery raw( qu );
591 OSQLResult res = m_driver->query( &raw ); 591 OSQLResult res = m_driver->query( &raw );
592 if ( res.state() != OSQLResult::Success ){ 592 if ( res.state() != OSQLResult::Success ){
593 QArray<int> empty; 593 QArray<int> empty;
594 return empty; 594 return empty;
595 } 595 }
596 596
597 QArray<int> list = extractUids( res ); 597 QArray<int> list = extractUids( res );
598 598
599 return list; 599 return list;
600} 600}
601 601
602QArray<int> OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const 602QArray<int> OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const
603{ 603{
604#if 1 604#if 0
605 QArray<int> nix(0); 605 QArray<int> nix(0);
606 return nix; 606 return nix;
607 607
608#else 608#else
609 QString qu = "SELECT uid FROM addressbook WHERE ("; 609 QString qu = "SELECT uid FROM addressbook WHERE (";
610 QString searchlist; 610 QString searchlist;
611 611
612 QStringList fieldList = OPimContactFields::untrfields( false ); 612 QStringList fieldList = OPimContactFields::untrfields( false );
613 // QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); 613 // QMap<QString, int> translate = OPimContactFields::untrFieldsToId();
614 for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ 614 for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
615 if ( !searchlist.isEmpty() ) 615 if ( !searchlist.isEmpty() )
616 searchlist += " OR "; 616 searchlist += " OR ";
617 searchlist += "\"" + *it + "\" rlike(\"" + r.pattern() + "\") "; 617 searchlist += " rlike(\""+ r.pattern() + "\",\"" + *it + "\") ";
618 } 618 }
619 619
620 qu = qu + searchlist + ")"; 620 qu = qu + searchlist + ")";
621 621
622 qDebug( "query: %s", qu.latin1() ); 622 qDebug( "query: %s", qu.latin1() );
623 623
624 OSQLRawQuery raw( qu ); 624 OSQLRawQuery raw( qu );
625 OSQLResult res = m_driver->query( &raw ); 625 OSQLResult res = m_driver->query( &raw );
626 626
627 return extractUids( res ); 627 return extractUids( res );
628 628
629 629
630#endif 630#endif
631} 631}
632 632
633const uint OPimContactAccessBackend_SQL::querySettings() 633const uint OPimContactAccessBackend_SQL::querySettings()
634{ 634{
635 return OPimContactAccess::IgnoreCase 635 return OPimContactAccess::IgnoreCase
636 | OPimContactAccess::WildCards 636 | OPimContactAccess::WildCards
637 | OPimContactAccess::DateDiff 637 | OPimContactAccess::DateDiff
638 | OPimContactAccess::DateYear 638 | OPimContactAccess::DateYear
639 | OPimContactAccess::DateMonth 639 | OPimContactAccess::DateMonth
640 | OPimContactAccess::DateDay 640 | OPimContactAccess::DateDay
641 ; 641 ;
642} 642}
643 643
644bool OPimContactAccessBackend_SQL::hasQuerySettings (uint querySettings) const 644bool OPimContactAccessBackend_SQL::hasQuerySettings (uint querySettings) const
645{ 645{
646 /* OPimContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay 646 /* OPimContactAccess::IgnoreCase, DateDiff, DateYear, DateMonth, DateDay
647 * may be added with any of the other settings. IgnoreCase should never used alone. 647 * may be added with any of the other settings. IgnoreCase should never used alone.
648 * Wildcards, RegExp, ExactMatch should never used at the same time... 648 * Wildcards, RegExp, ExactMatch should never used at the same time...
649 */ 649 */
650 650
651 // Step 1: Check whether the given settings are supported by this backend 651 // Step 1: Check whether the given settings are supported by this backend
652 if ( ( querySettings & ( 652 if ( ( querySettings & (
653 OPimContactAccess::IgnoreCase 653 OPimContactAccess::IgnoreCase
654 | OPimContactAccess::WildCards 654 | OPimContactAccess::WildCards
655 | OPimContactAccess::DateDiff 655 | OPimContactAccess::DateDiff
656 | OPimContactAccess::DateYear 656 | OPimContactAccess::DateYear
657 | OPimContactAccess::DateMonth 657 | OPimContactAccess::DateMonth
658 | OPimContactAccess::DateDay 658 | OPimContactAccess::DateDay
659 // | OPimContactAccess::RegExp 659 // | OPimContactAccess::RegExp
660 // | OPimContactAccess::ExactMatch 660 // | OPimContactAccess::ExactMatch
661 ) ) != querySettings ) 661 ) ) != querySettings )
662 return false; 662 return false;
663 663
664 // Step 2: Check whether the given combinations are ok.. 664 // Step 2: Check whether the given combinations are ok..
665 665
666 // IngoreCase alone is invalid 666 // IngoreCase alone is invalid
667 if ( querySettings == OPimContactAccess::IgnoreCase ) 667 if ( querySettings == OPimContactAccess::IgnoreCase )
668 return false; 668 return false;
669 669
670 // WildCards, RegExp and ExactMatch should never used at the same time 670 // WildCards, RegExp and ExactMatch should never used at the same time
671 switch ( querySettings & ~( OPimContactAccess::IgnoreCase 671 switch ( querySettings & ~( OPimContactAccess::IgnoreCase
672 | OPimContactAccess::DateDiff 672 | OPimContactAccess::DateDiff
673 | OPimContactAccess::DateYear 673 | OPimContactAccess::DateYear
674 | OPimContactAccess::DateMonth 674 | OPimContactAccess::DateMonth
675 | OPimContactAccess::DateDay 675 | OPimContactAccess::DateDay
676 ) 676 )
677 ){ 677 ){
678 case OPimContactAccess::RegExp: 678 case OPimContactAccess::RegExp:
679 return ( true ); 679 return ( true );
680 case OPimContactAccess::WildCards: 680 case OPimContactAccess::WildCards:
681 return ( true ); 681 return ( true );
682 case OPimContactAccess::ExactMatch: 682 case OPimContactAccess::ExactMatch:
683 return ( true ); 683 return ( true );
684 case 0: // one of the upper removed bits were set.. 684 case 0: // one of the upper removed bits were set..
685 return ( true ); 685 return ( true );
686 default: 686 default:
687 return ( false ); 687 return ( false );
688 } 688 }
689 689
690} 690}
691 691
692QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int ) 692QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int )
693{ 693{
694 QTime t; 694 QTime t;
695 t.start(); 695 t.start();
696 696
697 QString query = "SELECT uid FROM addressbook "; 697 QString query = "SELECT uid FROM addressbook ";
698 query += "ORDER BY \"Last Name\" "; 698 query += "ORDER BY \"Last Name\" ";
699 699
700 if ( !asc ) 700 if ( !asc )
701 query += "DESC"; 701 query += "DESC";
702 702
703 // qDebug("sorted query is: %s", query.latin1() ); 703 // qDebug("sorted query is: %s", query.latin1() );
704 704
705 OSQLRawQuery raw( query ); 705 OSQLRawQuery raw( query );
706 OSQLResult res = m_driver->query( &raw ); 706 OSQLResult res = m_driver->query( &raw );
707 if ( res.state() != OSQLResult::Success ){ 707 if ( res.state() != OSQLResult::Success ){
708 QArray<int> empty; 708 QArray<int> empty;
709 return empty; 709 return empty;
710 } 710 }
711 711
712 QArray<int> list = extractUids( res ); 712 QArray<int> list = extractUids( res );
713 713
714 qDebug("sorted needed %d ms!", t.elapsed() ); 714 qDebug("sorted needed %d ms!", t.elapsed() );
715 return list; 715 return list;
716} 716}
717 717
718 718
719void OPimContactAccessBackend_SQL::update() 719void OPimContactAccessBackend_SQL::update()
720{ 720{
721 qDebug("Update starts"); 721 qDebug("Update starts");
722 QTime t; 722 QTime t;
723 t.start(); 723 t.start();
724 724
725 // Now load the database set and extract the uid's 725 // Now load the database set and extract the uid's
726 // which will be held locally 726 // which will be held locally
727 727
728 LoadQuery lo; 728 LoadQuery lo;
729 OSQLResult res = m_driver->query(&lo); 729 OSQLResult res = m_driver->query(&lo);
730 if ( res.state() != OSQLResult::Success ) 730 if ( res.state() != OSQLResult::Success )
731 return; 731 return;
732 732
733 m_uids = extractUids( res ); 733 m_uids = extractUids( res );
734 734
735 m_changed = false; 735 m_changed = false;
736 736
737 qDebug("Update ends %d ms", t.elapsed() ); 737 qDebug("Update ends %d ms", t.elapsed() );
738} 738}
739 739
740QArray<int> OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const 740QArray<int> OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const
741{ 741{
742 qDebug("extractUids"); 742 qDebug("extractUids");
743 QTime t; 743 QTime t;
744 t.start(); 744 t.start();
745 OSQLResultItem::ValueList list = res.results(); 745 OSQLResultItem::ValueList list = res.results();
746 OSQLResultItem::ValueList::Iterator it; 746 OSQLResultItem::ValueList::Iterator it;
747 QArray<int> ints(list.count() ); 747 QArray<int> ints(list.count() );
748 qDebug(" count = %d", list.count() ); 748 qDebug(" count = %d", list.count() );
749 749
750 int i = 0; 750 int i = 0;
751 for (it = list.begin(); it != list.end(); ++it ) { 751 for (it = list.begin(); it != list.end(); ++it ) {
752 ints[i] = (*it).data("uid").toInt(); 752 ints[i] = (*it).data("uid").toInt();
753 i++; 753 i++;
754 } 754 }
755 qDebug("extractUids ready: count2 = %d needs %d ms", i, t.elapsed() ); 755 qDebug("extractUids ready: count2 = %d needs %d ms", i, t.elapsed() );
756 756
757 return ints; 757 return ints;
758 758
759} 759}
760 760
761QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) const 761QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) const
762{ 762{
763 QTime t; 763 QTime t;
764 t.start(); 764 t.start();
765 765
766 QMap<int, QString> nonCustomMap; 766 QMap<int, QString> nonCustomMap;
767 767
768 int t2needed = 0; 768 int t2needed = 0;
769 int t3needed = 0; 769 int t3needed = 0;
770 QTime t2; 770 QTime t2;
771 t2.start(); 771 t2.start();
772 FindQuery query( uid ); 772 FindQuery query( uid );
773 OSQLResult res_noncustom = m_driver->query( &query ); 773 OSQLResult res_noncustom = m_driver->query( &query );
774 t2needed = t2.elapsed(); 774 t2needed = t2.elapsed();
775 775
776 OSQLResultItem resItem = res_noncustom.first(); 776 OSQLResultItem resItem = res_noncustom.first();
777 777
778 QTime t3; 778 QTime t3;
779 t3.start(); 779 t3.start();
780 // Now loop through all columns 780 // Now loop through all columns
781 QStringList fieldList = OPimContactFields::untrfields( false ); 781 QStringList fieldList = OPimContactFields::untrfields( false );
782 QMap<QString, int> translate = OPimContactFields::untrFieldsToId(); 782 QMap<QString, int> translate = OPimContactFields::untrFieldsToId();
783 for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){ 783 for ( QStringList::Iterator it = ++fieldList.begin(); it != fieldList.end(); ++it ){
784 // Get data for the selected column and store it with the 784 // Get data for the selected column and store it with the
785 // corresponding id into the map.. 785 // corresponding id into the map..
786 786
787 int id = translate[*it]; 787 int id = translate[*it];
788 QString value = resItem.data( (*it) ); 788 QString value = resItem.data( (*it) );
789 789
790 // qDebug("Reading %s... found: %s", (*it).latin1(), value.latin1() ); 790 // qDebug("Reading %s... found: %s", (*it).latin1(), value.latin1() );
791 791
792 switch( id ){ 792 switch( id ){
793 case Qtopia::Birthday: 793 case Qtopia::Birthday:
794 case Qtopia::Anniversary:{ 794 case Qtopia::Anniversary:{
795 // Birthday and Anniversary are encoded special ( yyyy-mm-dd ) 795 // Birthday and Anniversary are encoded special ( yyyy-mm-dd )
796 QStringList list = QStringList::split( '-', value ); 796 QStringList list = QStringList::split( '-', value );
797 QStringList::Iterator lit = list.begin(); 797 QStringList::Iterator lit = list.begin();
798 int year = (*lit).toInt(); 798 int year = (*lit).toInt();
799 int month = (*(++lit)).toInt(); 799 int month = (*(++lit)).toInt();
800 int day = (*(++lit)).toInt(); 800 int day = (*(++lit)).toInt();
801 if ( ( day != 0 ) && ( month != 0 ) && ( year != 0 ) ){ 801 if ( ( day != 0 ) && ( month != 0 ) && ( year != 0 ) ){
802 QDate date( year, month, day ); 802 QDate date( year, month, day );
803 nonCustomMap.insert( id, OPimDateConversion::dateToString( date ) ); 803 nonCustomMap.insert( id, OPimDateConversion::dateToString( date ) );
804 } 804 }
805 } 805 }
806 break; 806 break;
807 case Qtopia::AddressCategory: 807 case Qtopia::AddressCategory:
808 qDebug("Category is: %s", value.latin1() ); 808 qDebug("Category is: %s", value.latin1() );
809 default: 809 default:
810 nonCustomMap.insert( id, value ); 810 nonCustomMap.insert( id, value );
811 } 811 }
812 } 812 }
813 813
814 // First insert uid 814 // First insert uid
815 nonCustomMap.insert( Qtopia::AddressUid, resItem.data( "uid" ) ); 815 nonCustomMap.insert( Qtopia::AddressUid, resItem.data( "uid" ) );
816 t3needed = t3.elapsed(); 816 t3needed = t3.elapsed();
817 817
818 // qDebug("Adding UID: %s", resItem.data( "uid" ).latin1() ); 818 // qDebug("Adding UID: %s", resItem.data( "uid" ).latin1() );
819 qDebug("RequestNonCustom needed: insg.:%d ms, query: %d ms, mapping: %d ms", 819 qDebug("RequestNonCustom needed: insg.:%d ms, query: %d ms, mapping: %d ms",
820 t.elapsed(), t2needed, t3needed ); 820 t.elapsed(), t2needed, t3needed );
821 821
822 return nonCustomMap; 822 return nonCustomMap;
823} 823}
824 824
825QMap<QString, QString> OPimContactAccessBackend_SQL::requestCustom( int uid ) const 825QMap<QString, QString> OPimContactAccessBackend_SQL::requestCustom( int uid ) const
826{ 826{
827 QTime t; 827 QTime t;
828 t.start(); 828 t.start();
829 829
830 QMap<QString, QString> customMap; 830 QMap<QString, QString> customMap;
831 831
832 FindCustomQuery query( uid ); 832 FindCustomQuery query( uid );
833 OSQLResult res_custom = m_driver->query( &query ); 833 OSQLResult res_custom = m_driver->query( &query );
834 834
835 if ( res_custom.state() == OSQLResult::Failure ) { 835 if ( res_custom.state() == OSQLResult::Failure ) {
836 qWarning("OSQLResult::Failure in find query !!"); 836 qWarning("OSQLResult::Failure in find query !!");
837 QMap<QString, QString> empty; 837 QMap<QString, QString> empty;
838 return empty; 838 return empty;
839 } 839 }
840 840
841 OSQLResultItem::ValueList list = res_custom.results(); 841 OSQLResultItem::ValueList list = res_custom.results();
842 OSQLResultItem::ValueList::Iterator it = list.begin(); 842 OSQLResultItem::ValueList::Iterator it = list.begin();
843 for ( ; it != list.end(); ++it ) { 843 for ( ; it != list.end(); ++it ) {
844 customMap.insert( (*it).data( "type" ), (*it).data( "value" ) ); 844 customMap.insert( (*it).data( "type" ), (*it).data( "value" ) );
845 } 845 }
846 846
847 qDebug("RequestCustom needed: %d ms", t.elapsed() ); 847 qDebug("RequestCustom needed: %d ms", t.elapsed() );
848 return customMap; 848 return customMap;
849} 849}
850 850
851} 851}