author | brad <brad> | 2004-04-11 12:43:55 (UTC) |
---|---|---|
committer | brad <brad> | 2004-04-11 12:43:55 (UTC) |
commit | 9716f8c5672a8596306a9b432d9fabc4361baea5 (patch) (unidiff) | |
tree | 2b4f23f7e1291ff9f3ff7788068918e31ed63bef | |
parent | 40c0415fe7afeeb03de7441e2f667495e81edfa7 (diff) | |
download | opie-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.
-rw-r--r-- | libopie2/opiedb/osqlitedriver.cpp | 19 | ||||
-rw-r--r-- | libopie2/opiepim/backend/ocontactaccessbackend_sql.cpp | 4 |
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 | ||
43 | namespace Opie { | 43 | namespace Opie { |
44 | namespace DB { | 44 | namespace DB { |
45 | namespace Internal { | 45 | namespace Internal { |
46 | 46 | ||
47 | namespace { | 47 | namespace { |
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 | ||
56 | OSQLiteDriver::OSQLiteDriver( QLibrary *lib ) | 56 | OSQLiteDriver::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 | ||
63 | OSQLiteDriver::~OSQLiteDriver() { | 63 | OSQLiteDriver::~OSQLiteDriver() { |
64 | close(); | 64 | close(); |
65 | } | 65 | } |
66 | 66 | ||
67 | 67 | ||
68 | QString OSQLiteDriver::id()const { | 68 | QString OSQLiteDriver::id()const { |
69 | return QString::fromLatin1("SQLite"); | 69 | return QString::fromLatin1("SQLite"); |
70 | } | 70 | } |
71 | 71 | ||
72 | void OSQLiteDriver::setUserName( const QString& ) {} | 72 | void OSQLiteDriver::setUserName( const QString& ) {} |
73 | 73 | ||
74 | 74 | ||
75 | void OSQLiteDriver::setPassword( const QString& ) {} | 75 | void OSQLiteDriver::setPassword( const QString& ) {} |
76 | 76 | ||
77 | 77 | ||
78 | void OSQLiteDriver::setUrl( const QString& url ) { | 78 | void OSQLiteDriver::setUrl( const QString& url ) { |
79 | m_url = url; | 79 | m_url = url; |
80 | } | 80 | } |
81 | 81 | ||
82 | 82 | ||
83 | void OSQLiteDriver::setOptions( const QStringList& ) { | 83 | void 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 | */ |
89 | int sqliteRlikeCompare(const char *zPattern, const char *zString, sqregex *reg){ | 89 | int 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(®->regex_c); | 94 | regfree(®->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(®->regex_c, zPattern, REG_EXTENDED); | 98 | res = regcomp(®->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(®->regex_c, zString, 0, NULL, 0)==0); | 106 | res = (regexec(®->regex_c, zString, 0, NULL, 0)==0); |
108 | return res; | 107 | return res; |
109 | } | 108 | } |
110 | 109 | ||
111 | void rlikeFunc(sqlite_func *context, int arg, const char **argv){ | 110 | void 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 | */ |
125 | bool OSQLiteDriver::open() { | 124 | bool 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 | */ |
148 | bool OSQLiteDriver::close() { | 152 | bool 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 */ |
161 | OSQLResult OSQLiteDriver::query( OSQLQuery* qu) { | 166 | OSQLResult 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 | ||
184 | OSQLTable::ValueList OSQLiteDriver::tables() const { | 189 | OSQLTable::ValueList OSQLiteDriver::tables() const { |
185 | 190 | ||
186 | } | 191 | } |
187 | 192 | ||
188 | 193 | ||
189 | OSQLError OSQLiteDriver::lastError() { | 194 | OSQLError 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 | */ |
198 | int OSQLiteDriver::handleCallBack( int, char**, char** ) { | 203 | int 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*/ |
204 | int OSQLiteDriver::call_back( void* voi, int argc, | 209 | int 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 | |||
@@ -412,398 +412,398 @@ void OPimContactAccessBackend_SQL::clear () | |||
412 | reload(); | 412 | reload(); |
413 | } | 413 | } |
414 | 414 | ||
415 | bool OPimContactAccessBackend_SQL::wasChangedExternally() | 415 | bool OPimContactAccessBackend_SQL::wasChangedExternally() |
416 | { | 416 | { |
417 | return false; | 417 | return false; |
418 | } | 418 | } |
419 | 419 | ||
420 | QArray<int> OPimContactAccessBackend_SQL::allRecords() const | 420 | QArray<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 | ||
431 | bool OPimContactAccessBackend_SQL::add ( const OPimContact &newcontact ) | 431 | bool 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 | ||
447 | bool OPimContactAccessBackend_SQL::remove ( int uid ) | 447 | bool 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 | ||
460 | bool OPimContactAccessBackend_SQL::replace ( const OPimContact &contact ) | 460 | bool 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 | ||
469 | OPimContact OPimContactAccessBackend_SQL::find ( int uid ) const | 469 | OPimContact 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 | ||
484 | QArray<int> OPimContactAccessBackend_SQL::queryByExample ( const OPimContact &query, int settings, const QDateTime& qd ) | 484 | QArray<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 | ||
602 | QArray<int> OPimContactAccessBackend_SQL::matchRegexp( const QRegExp &r ) const | 602 | QArray<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 | ||
633 | const uint OPimContactAccessBackend_SQL::querySettings() | 633 | const 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 | ||
644 | bool OPimContactAccessBackend_SQL::hasQuerySettings (uint querySettings) const | 644 | bool 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 | ||
692 | QArray<int> OPimContactAccessBackend_SQL::sorted( bool asc, int , int , int ) | 692 | QArray<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 | ||
719 | void OPimContactAccessBackend_SQL::update() | 719 | void 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 | ||
740 | QArray<int> OPimContactAccessBackend_SQL::extractUids( OSQLResult& res ) const | 740 | QArray<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 | ||
761 | QMap<int, QString> OPimContactAccessBackend_SQL::requestNonCustom( int uid ) const | 761 | QMap<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: |