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 | |||
@@ -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 | ||
50 | using namespace Opie; | 50 | using namespace Opie; |
51 | using namespace Opie::DB; | 51 | using 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 | */ |
61 | namespace { | 61 | namespace { |
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 | ||
347 | namespace Opie { | 347 | namespace Opie { |
348 | 348 | ||
349 | OPimContactAccessBackend_SQL::OPimContactAccessBackend_SQL ( const QString& /* appname */, | 349 | OPimContactAccessBackend_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 | ||
373 | OPimContactAccessBackend_SQL::~OPimContactAccessBackend_SQL () | 373 | OPimContactAccessBackend_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 | ||
379 | bool OPimContactAccessBackend_SQL::load () | 379 | bool 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 | ||
396 | bool OPimContactAccessBackend_SQL::reload() | 396 | bool OPimContactAccessBackend_SQL::reload() |
397 | { | 397 | { |
398 | return load(); | 398 | return load(); |
399 | } | 399 | } |
400 | 400 | ||
401 | bool OPimContactAccessBackend_SQL::save() | 401 | bool 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 | ||
407 | void OPimContactAccessBackend_SQL::clear () | 407 | void 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 | ||
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: |
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 | ||
825 | QMap<QString, QString> OPimContactAccessBackend_SQL::requestCustom( int uid ) const | 825 | QMap<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 | } |