142
QVariant getCategoryAttribute(QLandmarkCategory *category, const QString &key)
144
if (key.compare("name",Qt::CaseSensitive) == 0) {
145
return category->name();
146
} else if (key.compare("iconUrl",Qt::CaseSensitive) ==0) {
147
return category->iconUrl();
150
Q_ASSERT(false);//This should not be reachable
154
void setCategoryAttribute(QLandmarkCategory *category, const QString &key, const QVariant &value)
156
if (key.compare("name",Qt::CaseInsensitive) == 0) {
157
category->setName(value.toString());
159
} else if (key.compare("iconUrl",Qt::CaseInsensitive) ==0) {
160
category->setIconUrl(QUrl(value.toUrl()));
164
Q_ASSERT(false);//This should not be reachable
168
QVariant getLandmarkAttribute(QLandmark *landmark, const QString &key) {
169
if (key.compare("name",Qt::CaseSensitive) == 0) {
170
return landmark->name();
171
} else if (key.compare("description", Qt::CaseSensitive) == 0) {
172
return landmark->description();
173
} else if (key.compare("iconUrl",Qt::CaseSensitive) ==0) {
174
return landmark->iconUrl();
175
} else if (key.compare("radius", Qt::CaseSensitive) == 0) {
176
return landmark->radius();
177
} else if (key.compare("phoneNumber", Qt::CaseSensitive) == 0) {
178
return landmark->phoneNumber();
179
} else if (key.compare("url", Qt::CaseSensitive) ==0 ) {
180
return landmark->url();
181
} else if (key.compare("latitude", Qt::CaseSensitive)== 0) {
182
return landmark->coordinate().latitude();
183
} else if (key.compare("longitude", Qt::CaseSensitive) ==0) {
184
return landmark->coordinate().longitude();
185
} else if (key.compare("altitude", Qt::CaseSensitive) ==0) {
186
return landmark->coordinate().altitude();
187
} else if (key.compare("country", Qt::CaseSensitive) ==0 ){
188
return landmark->address().country();
189
} else if (key.compare("countryCode", Qt::CaseSensitive) ==0 ){
190
return landmark->address().countryCode();
191
} else if (key.compare("state", Qt::CaseSensitive) ==0 ){
192
return landmark->address().state();
193
} else if (key.compare("county", Qt::CaseSensitive) ==0 ){
194
return landmark->address().county();
195
} else if (key.compare("city", Qt::CaseSensitive) ==0 ){
196
return landmark->address().city();
197
} else if (key.compare("district", Qt::CaseSensitive) ==0 ){
198
return landmark->address().district();
199
} else if (key.compare("street", Qt::CaseSensitive) ==0 ){
200
return landmark->address().street();
201
} else if (key.compare("postcode", Qt::CaseSensitive) ==0 ){
202
return landmark->address().postcode();
204
Q_ASSERT(false);//It shouldn't be possible to get here
208
void setLandmarkAttribute(QLandmark *landmark, const QString &key, const QVariant &value)
210
if (key.compare("name",Qt::CaseSensitive) == 0) {
211
landmark->setName(value.toString());
213
} else if (key.compare("description", Qt::CaseSensitive) == 0) {
214
landmark->setDescription(value.toString());
216
} else if (key.compare("iconUrl",Qt::CaseSensitive) ==0) {
217
landmark->setIconUrl(QUrl(value.toUrl()));
219
} else if (key.compare("radius", Qt::CaseSensitive) == 0) {
220
landmark->setRadius(value.toReal());
222
} else if (key.compare("phoneNumber", Qt::CaseSensitive) == 0) {
223
landmark->setPhoneNumber(value.toString());
225
} else if (key.compare("url", Qt::CaseSensitive) ==0 ) {
226
landmark->setUrl(QUrl(value.toUrl()));
228
} else if (key.compare("latitude", Qt::CaseSensitive)== 0) {
229
QGeoCoordinate coord = landmark->coordinate();
230
coord.setLatitude(value.toDouble());
231
landmark->setCoordinate(coord);
233
} else if (key.compare("longitude", Qt::CaseSensitive) ==0) {
234
QGeoCoordinate coord = landmark->coordinate();
235
coord.setLongitude(value.toDouble());
236
landmark->setCoordinate(coord);
238
} else if (key.compare("altitude", Qt::CaseSensitive) ==0) {
239
QGeoCoordinate coord = landmark->coordinate();
240
coord.setAltitude(value.toDouble());
241
landmark->setCoordinate(coord);
243
} else if (key.compare("country", Qt::CaseSensitive) ==0 ){
244
QGeoAddress address = landmark->address();
245
address.setCountry(value.toString());
246
landmark->setAddress(address);
248
} else if (key.compare("countryCode", Qt::CaseSensitive) ==0 ){
249
QGeoAddress address = landmark->address();
250
address.setCountryCode(value.toString());
251
landmark->setAddress(address);
253
} else if (key.compare("state", Qt::CaseSensitive) ==0 ){
254
QGeoAddress address = landmark->address();
255
address.setState(value.toString());
256
landmark->setAddress(address);
258
} else if (key.compare("county", Qt::CaseSensitive) ==0 ){
259
QGeoAddress address = landmark->address();
260
address.setCounty(value.toString());
261
landmark->setAddress(address);
263
} else if (key.compare("city", Qt::CaseSensitive) == 0 ){
264
QGeoAddress address = landmark->address();
265
address.setCity(value.toString());
266
landmark->setAddress(address);
268
} else if (key.compare("district", Qt::CaseSensitive) ==0 ){
269
QGeoAddress address = landmark->address();
270
address.setDistrict(value.toString());
271
landmark->setAddress(address);
273
} else if (key.compare("street", Qt::CaseSensitive) ==0 ){
274
QGeoAddress address = landmark->address();
275
address.setStreet(value.toString());
276
landmark->setAddress(address);
278
} else if (key.compare("postcode", Qt::CaseSensitive) ==0 ){
279
QGeoAddress address = landmark->address();
280
address.setPostcode(value.toString());
281
landmark->setAddress(address);
284
Q_ASSERT(false);//it shouldn't be possible to get here
140
289
Returns true if value is in between min and max(inclusive of min and max)
743
885
QList<QLandmarkId> lmIds;
745
887
bool selectAll =false;
746
if (attributeFilter.attributeType() == QLandmarkAttributeFilter::ManagerAttributes) {
747
foreach(const QString key, filterKeys) {
748
if (!supportedSearchableAttributes.contains(key)) {
749
*error = QLandmarkManager::NotSupportedError;
750
*errorString = QString("Attribute key not searchable: ").arg(key);
751
return QList<QLandmarkId>();
889
foreach(const QString key, filterKeys) {
890
if (!supportedSearchableAttributes.contains(key)) {
891
*error = QLandmarkManager::NotSupportedError;
892
*errorString = QString("Attribute key not searchable: ").arg(key);
893
return QList<QLandmarkId>();
754
QVariant attributeValue;
896
QVariant attributeValue;
756
//try to see if we need to select all landmarks
757
//ie OR operation with a single invalid QVariant parameter
758
//AND operation with all invalid QVariant parameter
759
for ( int i = 0; i < filterKeys.count(); ++i) {
760
key = filterKeys.at(i);
761
attributeValue = attributeFilter.attribute(key).toString();
762
if (!attributeFilter.attribute(key).isValid()) {
763
if( attributeFilter.operationType() == QLandmarkAttributeFilter::OrOperation) {
898
//try to see if we need to select all landmarks
899
//ie OR operation with a single invalid QVariant parameter
900
//AND operation with all invalid QVariant parameter
901
for ( int i = 0; i < filterKeys.count(); ++i) {
902
key = filterKeys.at(i);
903
attributeValue = attributeFilter.attribute(key).toString();
904
if (!attributeFilter.attribute(key).isValid()) {
905
if( attributeFilter.operationType() == QLandmarkAttributeFilter::OrOperation) {
771
if (attributeFilter.operationType() == QLandmarkAttributeFilter::OrOperation)
913
if (attributeFilter.operationType() == QLandmarkAttributeFilter::OrOperation)
1000
1135
case QLandmarkFilter::LandmarkIdFilter: {
1001
1136
QLandmarkIdFilter idFilter = filter;
1002
if (sortOrders.length() == 1
1003
&& sortOrders.at(0).type() == QLandmarkSortOrder::NameSort) {
1004
1137
//provide a query string exeecute so to that sqlite can handle sorting by name
1005
1138
queryString = landmarkIdsQueryString(idFilter.landmarkIds());
1007
result = idFilter.landmarkIds();
1012
1141
case QLandmarkFilter::CategoryFilter: {
1142
QSqlQuery query(db);
1143
QMap<QString, QVariant> bindValues;
1013
1144
QLandmarkCategoryFilter categoryFilter = filter;
1145
QLandmarkCategoryId categoryId = categoryFilter.categoryId();
1147
if (categoryId.managerUri() != managerUri) {
1148
*error = QLandmarkManager::NoError;
1151
} else if (categoryId.localId().isEmpty()) {
1152
*error = QLandmarkManager::NoError;
1157
bindValues.insert("catId",categoryId.localId());
1158
if (!executeQuery(&query,"SELECT * from category WHERE id = :catId", bindValues, error, errorString)){
1162
if (!query.next()) {
1163
*error = QLandmarkManager::NoError;
1014
1168
queryString = landmarkIdsCategoryQueryString(categoryFilter);
1017
1171
case QLandmarkFilter::ProximityFilter: {
1018
1172
QLandmarkProximityFilter proximityFilter = filter;
1173
QGeoCoordinate center = proximityFilter.center();
1174
if ( (qIsNaN(center.latitude()) || qIsNaN(center.longitude())
1175
|| !isValidLat(center.latitude()) || !isValidLong(center.longitude()))
1177
*error = QLandmarkManager::BadArgumentError;
1178
*errorString = "Center coordinate of proximity filter is invalid";
1019
1182
if (proximityFilter.radius() < 0) {
1020
if (proximityFilter.selection() == QLandmarkProximityFilter::SelectNearestOnly) {
1021
queryString = ::landmarkIdsNearestQueryString(proximityFilter);
1023
queryString = ::landmarkIdsDefaultQueryString();
1183
queryString = ::landmarkIdsDefaultQueryString();
1027
1186
//fall through if we have a radius, we can use a box filter
1637
1781
query.bindValue(":lmId", landmark->landmarkId().localId());
1638
1782
query.bindValue(":key", key);
1639
query.bindValue(":value", landmark->attribute(key));
1641
if (!query.exec()) {
1642
*error = QLandmarkManager::UnknownError;
1643
*errorString = QString("Unable to execute statement: %1\nReason:%2")
1644
.arg(query.lastQuery()).arg(query.lastError().text());
1649
attributeKeys= landmark->customAttributeKeys();
1651
if( !query.prepare("DELETE FROM landmark_custom_attribute WHERE landmarkId= :lmId"))
1653
*error = QLandmarkManager::UnknownError;
1654
*errorString = QString("Unable to prepare statement: %1 \nReason: %2")
1655
.arg(query.lastQuery()).arg(query.lastError().text());
1659
query.bindValue(":lmId", landmark->landmarkId().localId());
1661
if (!query.exec()) {
1662
*error = QLandmarkManager::UnknownError;
1663
*errorString = QString("Unable to execute statement: %1\nReason:%2")
1664
.arg(query.lastQuery()).arg(query.lastError().text());
1668
for (int i =0; i < attributeKeys.count(); ++i) {
1669
if (!query.prepare("INSERT INTO landmark_custom_attribute (landmarkId,key,value) VALUES(:lmId,:key,:value)")) {
1670
*error = QLandmarkManager::UnknownError;
1671
*errorString = QString("Unable to prepare statement: %1 \nReason: %2")
1672
.arg(query.lastQuery()).arg(query.lastError().text());
1676
query.bindValue(":lmId", landmark->landmarkId().localId());
1677
query.bindValue(":key", attributeKeys[i]);
1678
query.bindValue(":value", landmark->customAttribute(attributeKeys.at(i)));
1680
if (!query.exec()) {
1681
*error = QLandmarkManager::UnknownError;
1682
*errorString = QString("Unable to execute statement: %1\nReason:%2")
1683
.arg(query.lastQuery()).arg(query.lastError().text());
1689
// grab keys from attributes tables for current id
1690
// delete those we no longer have
1691
// use replace for the rest
1693
// loop through attributes
1783
query.bindValue(":value", getLandmarkAttribute(landmark, key));
1785
if (!query.exec()) {
1786
*error = QLandmarkManager::UnknownError;
1787
*errorString = QString("Unable to execute statement: %1\nReason:%2")
1788
.arg(query.lastQuery()).arg(query.lastError().text());
1793
*error = QLandmarkManager::NoError;
2234
2321
bindValues.clear();
2235
2322
bindValues.insert("catId",category->categoryId().localId());
2236
2323
QStringList attributeKeys = coreGenericCategoryAttributes;
2237
if (this->isExtendedAttributesEnabled)
2238
attributeKeys << extendedGenericCategoryAttributes;
2240
2325
foreach(const QString &key, attributeKeys) {
2241
if (!category->attributeKeys().contains(key))
2243
2326
bindValues.clear();
2244
2327
bindValues.insert(":catId", category->categoryId().localId());
2245
2328
bindValues.insert(":key", key);
2246
bindValues.insert(":value", category->attribute(key));
2329
bindValues.insert(":value", getCategoryAttribute(category,key));
2247
2330
if (!executeQuery(&query, "REPLACE INTO category_attribute(categoryId,key,value) VALUES(:catId,:key,:value)", bindValues,error,errorString)) {
2252
attributeKeys = category->customAttributeKeys();
2254
bindValues.insert("catId", category->categoryId().localId());
2255
if (!executeQuery(&query,"DELETE FROM category_custom_attribute WHERE categoryId= :catId", bindValues, error, errorString)) {
2259
for (int i =0; i < attributeKeys.count(); ++i) {
2261
bindValues.insert("catId",category->categoryId().localId());
2262
bindValues.insert("key",attributeKeys[i]);
2263
bindValues.insert("value",category->customAttribute(attributeKeys.at(i)));
2265
if (!executeQuery(&query,"INSERT INTO category_custom_attribute (categoryId,key,value) VALUES(:catId,:key,:value)", bindValues,
2266
error, errorString)) {
2272
*error = QLandmarkManager::NoError;
2336
*error = QLandmarkManager::NoError;
2300
2363
QLandmarkManager::Error *error,
2301
2364
QString *errorString)
2303
QList<QLandmarkCategoryId> addedIds;
2304
QList<QLandmarkCategoryId> changedIds;
2367
Q_ASSERT(errorString);
2372
QSqlDatabase db = QSqlDatabase::database(connectionName);
2373
if (!db.transaction()) {
2374
*error = QLandmarkManager::UnknownError;
2375
*errorString = QString("Save Categories: unable to begin transaction, reason: %1").arg(db.lastError().text());
2378
for (int i=0; i < categories->size(); ++i)
2379
errorMap->insert(i, *error);
2305
2384
bool noErrors = true;
2306
2385
QLandmarkManager::Error lastError = QLandmarkManager::NoError;
2307
2386
QString lastErrorString;
2308
2387
QLandmarkManager::Error loopError;
2309
2388
QString loopErrorString;
2310
2390
for (int i = 0; i < categories->size(); ++i) {
2311
2391
loopError = QLandmarkManager::NoError;
2312
2392
loopErrorString = "";
2314
bool changed = false;
2316
bool result = saveCategory(&(categories->operator [](i)), &loopError, &loopErrorString);
2319
errorMap->insert(i, loopError);
2394
if (queryRun && queryRun->isCanceled) {
2395
lastError = QLandmarkManager::CancelError;
2396
lastErrorString = "Category save was canceled";
2398
for (i; i < categories->size(); ++i)
2399
errorMap->insert(i, lastError);
2404
QSqlQuery query(db);
2405
if (!query.exec("SAVEPOINT save")) {
2406
loopError = QLandmarkManager::UnknownError;
2407
loopErrorString = QString("Save categories: could not execute statement: %1\nReason:%2").arg(query.lastQuery()).arg(query.lastError().text());
2410
result = saveCategoryHelper(&(categories->operator [](i)), &loopError, &loopErrorString);
2322
2414
noErrors = false;
2323
2415
lastError = loopError;
2324
2416
lastErrorString = loopErrorString;
2419
errorMap->insert(i, loopError);
2420
query.exec("ROLLBACK TO SAVEPOINT save");
2422
query.exec("RELEASE SAVEPOINT save");
2328
addedIds << categories->at(i).categoryId();
2330
changedIds << categories->at(i).categoryId();
2333
2428
if (noErrors) {
2335
2430
*error = QLandmarkManager::NoError;
2418
2511
QLandmarkManager::Error *error,
2419
2512
QString *errorString)
2421
QList<QLandmarkCategoryId> removedIds;
2515
Q_ASSERT(errorString);
2519
QSqlDatabase db = QSqlDatabase::database(connectionName);
2520
if (!db.transaction()) {
2521
*error = QLandmarkManager::UnknownError;
2522
*errorString = QString("Remove category: unable to begin transaction, reason: %1").arg(db.lastError().text());
2525
for (int i=0; i < categoryIds.size(); ++i)
2526
errorMap->insert(i, *error);
2423
2531
bool noErrors = true;
2424
2532
QLandmarkManager::Error lastError = QLandmarkManager::NoError;
2425
2533
QString lastErrorString;
2426
2534
QLandmarkManager::Error loopError;
2427
2535
QString loopErrorString;
2428
2537
for (int i = 0; i < categoryIds.size(); ++i) {
2429
2538
loopError = QLandmarkManager::NoError;
2430
2539
loopErrorString.clear();
2432
bool result = removeCategory(categoryIds.at(i), &loopError, &loopErrorString);
2541
if (queryRun && queryRun->isCanceled) {
2542
lastError = QLandmarkManager::CancelError;
2543
lastErrorString = "Category remove was canceled";
2545
for (i; i < categoryIds.size(); ++i)
2546
errorMap->insert(i, lastError);
2435
errorMap->insert(i, loopError);
2552
QSqlQuery query(db);
2553
if (!query.exec("SAVEPOINT save")) {
2554
loopError = QLandmarkManager::UnknownError;
2555
loopErrorString = QString("Remove category: could not execute statement: %1\nReason:%2").arg(query.lastQuery()).arg(query.lastError().text());
2558
result = removeCategoryHelper(categoryIds.at(i), &loopError, &loopErrorString);
2563
errorMap->insert(i, loopError);
2438
2565
noErrors = false;
2439
2566
lastError = loopError;
2440
2567
lastErrorString = loopErrorString;
2568
query.exec("ROLLBACK TO SAVEPOINT save");
2570
query.exec("RELEASE SAVEPOINT save");
2444
removedIds << categoryIds.at(i);
2447
2576
if (noErrors) {
2449
2578
*error = QLandmarkManager::NoError;
2873
2994
switch(filter.type()) {
2874
2995
case QLandmarkFilter::DefaultFilter:
2875
return QLandmarkManager::Native;
2996
return QLandmarkManager::NativeSupport;
2876
2997
case QLandmarkFilter::AttributeFilter:
2878
2999
const QLandmarkAttributeFilter attribFilter(filter);
2879
3000
QStringList filterKeys = attribFilter.attributeKeys();
2881
3002
QStringList landmarkKeys;
2882
if (attribFilter.attributeType() == QLandmarkAttributeFilter::ManagerAttributes) {
2883
foreach(const QString key, filterKeys) {
2884
if (!supportedSearchableAttributes.contains(key))
2885
return QLandmarkManager::None;
3004
foreach(const QString key, filterKeys) {
3005
if (!supportedSearchableAttributes.contains(key))
3006
return QLandmarkManager::NoSupport;
2888
3009
foreach (const QString &key, filterKeys) {
2889
3010
if (attribFilter.matchFlags(key) & QLandmarkFilter::MatchCaseSensitive)
2890
return QLandmarkManager::None;
3011
return QLandmarkManager::NoSupport;
2893
3014
case QLandmarkFilter::BoxFilter:
2895
return QLandmarkManager::Native;
3016
return QLandmarkManager::NativeSupport;
2897
3018
case QLandmarkFilter::CategoryFilter:
2899
return QLandmarkManager::Native;
3020
return QLandmarkManager::NativeSupport;
2901
3022
case QLandmarkFilter::IntersectionFilter:
2903
3024
const QLandmarkIntersectionFilter andFilter(filter);
2904
3025
const QList<QLandmarkFilter>& terms = andFilter.filters();
2905
QLandmarkManager::SupportLevel currentLevel = QLandmarkManager::Native;
3026
QLandmarkManager::SupportLevel currentLevel = QLandmarkManager::NativeSupport;
2906
3027
if (terms.count() ==0)
2907
3028
return currentLevel;
2909
3030
for(int i=0; i < terms.count();i++) {
2910
if (filterSupportLevel(terms.at(i)) == QLandmarkManager::None)
2911
return QLandmarkManager::None;
2912
else if (filterSupportLevel(terms.at(i)) == QLandmarkManager::Emulated)
2913
currentLevel = QLandmarkManager::Emulated;
3031
if (filterSupportLevel(terms.at(i)) == QLandmarkManager::NoSupport)
3032
return QLandmarkManager::NoSupport;
3033
else if (filterSupportLevel(terms.at(i)) == QLandmarkManager::EmulatedSupport)
3034
currentLevel = QLandmarkManager::EmulatedSupport;
2915
3036
return currentLevel;
2917
3038
case QLandmarkFilter::LandmarkIdFilter:
2919
return QLandmarkManager::Native;
3040
return QLandmarkManager::NativeSupport;
2921
3042
case QLandmarkFilter::InvalidFilter:
2923
return QLandmarkManager::Native;
3044
return QLandmarkManager::NativeSupport;
2925
3046
case QLandmarkFilter::NameFilter:
2927
3048
const QLandmarkNameFilter nameFilter(filter);
2928
3049
if (nameFilter.matchFlags() & QLandmarkFilter::MatchCaseSensitive)
2929
return QLandmarkManager::None;
3050
return QLandmarkManager::NoSupport;
2931
return QLandmarkManager::Native;
3052
return QLandmarkManager::NativeSupport;
2933
3054
case QLandmarkFilter::ProximityFilter:
2935
return QLandmarkManager::Native;
3056
return QLandmarkManager::NativeSupport;
2937
3058
case QLandmarkFilter::UnionFilter:
2939
3060
const QLandmarkUnionFilter orFilter(filter);
2940
3061
const QList<QLandmarkFilter>& terms = orFilter.filters();
2941
QLandmarkManager::SupportLevel currentLevel = QLandmarkManager::Native;
3062
QLandmarkManager::SupportLevel currentLevel = QLandmarkManager::NativeSupport;
2942
3063
if (terms.count() == 0)
2943
3064
return currentLevel;
2945
3066
for (int i=0; i < terms.count(); i++) {
2946
if (filterSupportLevel(terms.at(i)) == QLandmarkManager::None)
2947
return QLandmarkManager::None;
2948
else if (filterSupportLevel(terms.at(i)) == QLandmarkManager::Emulated)
2949
currentLevel = QLandmarkManager::Emulated;
3067
if (filterSupportLevel(terms.at(i)) == QLandmarkManager::NoSupport)
3068
return QLandmarkManager::NoSupport;
3069
else if (filterSupportLevel(terms.at(i)) == QLandmarkManager::EmulatedSupport)
3070
currentLevel = QLandmarkManager::EmulatedSupport;
2952
3073
return currentLevel;
2955
return QLandmarkManager::None;
3076
return QLandmarkManager::NoSupport;
2958
return QLandmarkManager::None;
3079
return QLandmarkManager::NoSupport;
2961
QLandmarkManager::SupportLevel DatabaseOperations::sortOrderSupportLevel(const QList<QLandmarkSortOrder> &sortOrders) const
3082
QLandmarkManager::SupportLevel DatabaseOperations::sortOrderSupportLevel(const QLandmarkSortOrder &sortOrder) const
2963
QLandmarkManager::SupportLevel currentLevel = QLandmarkManager::Native;
2964
foreach(const QLandmarkSortOrder &sortOrder, sortOrders){
2965
switch(sortOrder.type()) {
2966
case (QLandmarkSortOrder::DefaultSort):
2968
case (QLandmarkSortOrder::NameSort):
2971
currentLevel = QLandmarkManager::None;
3084
QLandmarkManager::SupportLevel currentLevel = QLandmarkManager::NativeSupport;
3086
switch(sortOrder.type()) {
3087
case (QLandmarkSortOrder::NoSort):
3089
case (QLandmarkSortOrder::NameSort): {
3090
QLandmarkNameSort nameSort = sortOrder;
3091
if (nameSort.caseSensitivity() == Qt::CaseSensitive)
3092
currentLevel = QLandmarkManager::NoSupport;
3096
currentLevel = QLandmarkManager::NoSupport;
2974
3099
return currentLevel;