aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/cgData.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/cgData.java')
-rw-r--r--main/src/cgeo/geocaching/cgData.java98
1 files changed, 45 insertions, 53 deletions
diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java
index 4831524..53ac334 100644
--- a/main/src/cgeo/geocaching/cgData.java
+++ b/main/src/cgeo/geocaching/cgData.java
@@ -22,6 +22,7 @@ import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Resources;
import android.database.Cursor;
+import android.database.DatabaseUtils;
import android.database.DatabaseUtils.InsertHelper;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
@@ -1003,8 +1004,8 @@ public class cgData {
values.put("type", cache.getType().id);
values.put("name", cache.getName());
values.put("own", cache.isOwn() ? 1 : 0);
- values.put("owner", cache.getOwner());
- values.put("owner_real", cache.getOwnerReal());
+ values.put("owner", cache.getOwnerDisplayName());
+ values.put("owner_real", cache.getOwnerUserId());
if (cache.getHiddenDate() == null) {
values.put("hidden", 0);
} else {
@@ -1467,22 +1468,28 @@ public class cgData {
init();
- final Cursor cursor = database.query(
- dbTableCaches,
- CACHE_COLUMNS,
- cgData.whereGeocodeIn(geocodes),
- null,
- null,
- null,
- null,
- null);
+ final StringBuilder query = new StringBuilder("SELECT ");
+ for (int i = 0; i < CACHE_COLUMNS.length; i++) {
+ query.append(i > 0 ? ", " : "").append(dbTableCaches).append('.').append(CACHE_COLUMNS[i]).append(' ');
+ }
+ query.append(',').append(dbTableLogsOffline).append(".log");
+ query.append(" FROM ").append(dbTableCaches);
+ if (loadFlags.contains(LoadFlag.LOAD_OFFLINE_LOG)) {
+ query.append(" LEFT OUTER JOIN ").append(dbTableLogsOffline).append(" ON ( ").append(dbTableCaches).append(".geocode == ").append(dbTableLogsOffline).append(".geocode) ");
+ }
+
+ query.append(" WHERE ").append(dbTableCaches).append('.');
+ query.append(cgData.whereGeocodeIn(geocodes));
+
+ Cursor cursor = database.rawQuery(query.toString(), null);
try {
if (!cursor.moveToFirst()) {
return Collections.emptySet();
}
final Set<cgCache> caches = new HashSet<cgCache>();
+ int logIndex = -1;
do {
//Extracted Method = LOADDBMINIMAL
cgCache cache = cgData.createCacheFromDatabaseContent(cursor);
@@ -1532,7 +1539,10 @@ public class cgData {
}
if (loadFlags.contains(LoadFlag.LOAD_OFFLINE_LOG)) {
- cache.setLogOffline(hasLogOffline(cache.getGeocode()));
+ if (logIndex < 0) {
+ logIndex = cursor.getColumnIndex("log");
+ }
+ cache.setLogOffline(!cursor.isNull(logIndex));
}
cache.addStorageLocation(StorageLocation.DATABASE);
cacheCache.putCacheInCache(cache);
@@ -1545,6 +1555,7 @@ public class cgData {
}
}
+
/**
* Builds a where for a viewport with the size enhanced by 50%.
*
@@ -1624,8 +1635,8 @@ public class cgData {
cache.setType(CacheType.getById(cursor.getString(cacheColumnIndex[8])));
cache.setName(cursor.getString(cacheColumnIndex[9]));
cache.setOwn(cursor.getInt(cacheColumnIndex[10]) == 1);
- cache.setOwner(cursor.getString(cacheColumnIndex[11]));
- cache.setOwnerReal(cursor.getString(cacheColumnIndex[12]));
+ cache.setOwnerDisplayName(cursor.getString(cacheColumnIndex[11]));
+ cache.setOwnerUserId(cursor.getString(cacheColumnIndex[12]));
long dateValue = cursor.getLong(cacheColumnIndex[13]);
if (dateValue != 0) {
cache.setHidden(new Date(dateValue));
@@ -2116,13 +2127,13 @@ public class cgData {
if (cacheType == CacheType.ALL) {
sql = "select count(_id) from " + dbTableCaches + listSql;
} else {
- sql = "select count(_id) from " + dbTableCaches + " where type = \"" + cacheType.id + "\"" + listSqlW;
+ sql = "select count(_id) from " + dbTableCaches + " where type = " + DatabaseUtils.sqlEscapeString(cacheType.id) + listSqlW;
}
} else {
if (cacheType == CacheType.ALL) {
sql = "select count(_id) from " + dbTableCaches + " where detailed = 1" + listSqlW;
} else {
- sql = "select count(_id) from " + dbTableCaches + " where detailed = 1 and type = \"" + cacheType.id + "\"" + listSqlW;
+ sql = "select count(_id) from " + dbTableCaches + " where detailed = 1 and type = " + DatabaseUtils.sqlEscapeString(cacheType.id) + listSqlW;
}
}
SQLiteStatement compiledStmnt = database.compileStatement(sql);
@@ -2179,9 +2190,8 @@ public class cgData {
}
if (cacheType != CacheType.ALL) {
- specifySql.append(" and type = \"");
- specifySql.append(cacheType.id);
- specifySql.append('"');
+ specifySql.append(" and type = ");
+ specifySql.append(DatabaseUtils.sqlEscapeString(cacheType.id));
}
try {
@@ -2237,9 +2247,8 @@ public class cgData {
specifySql.append(" and detailed = 1");
}
if (cacheType != CacheType.ALL) {
- specifySql.append(" and type = \"");
- specifySql.append(cacheType.id);
- specifySql.append('"');
+ specifySql.append(" and type = ");
+ specifySql.append(DatabaseUtils.sqlEscapeString(cacheType.id));
}
try {
@@ -2312,9 +2321,8 @@ public class cgData {
// cacheType limitation
if (cacheType != CacheType.ALL) {
- where.append(" and type = \"");
- where.append(cacheType.id);
- where.append('"');
+ where.append(" and type = ");
+ where.append(DatabaseUtils.sqlEscapeString(cacheType.id));
}
// offline caches only
@@ -2458,7 +2466,7 @@ public class cgData {
// Drop caches from the database
final ArrayList<String> quotedGeocodes = new ArrayList<String>(geocodes.size());
for (final String geocode : geocodes) {
- quotedGeocodes.add('"' + geocode + '"');
+ quotedGeocodes.add(DatabaseUtils.sqlEscapeString(geocode));
}
final String geocodeList = StringUtils.join(quotedGeocodes.toArray(), ',');
final String baseWhereClause = "geocode in (" + geocodeList + ")";
@@ -2470,7 +2478,7 @@ public class cgData {
database.delete(dbTableLogs, baseWhereClause, null);
database.delete(dbTableLogCount, baseWhereClause, null);
database.delete(dbTableLogsOffline, baseWhereClause, null);
- database.delete(dbTableWaypoints, baseWhereClause + " and type <> \"own\"", null);
+ database.delete(dbTableWaypoints, baseWhereClause + " and type <> 'own'", null);
database.delete(dbTableTrackables, baseWhereClause, null);
database.setTransactionSuccessful();
} finally {
@@ -2486,41 +2494,29 @@ public class cgData {
public boolean saveLogOffline(String geocode, Date date, LogType type, String log) {
if (StringUtils.isBlank(geocode)) {
+ Log.e("cgData.saveLogOffline: cannot log a blank geocode");
return false;
}
if (LogType.UNKNOWN == type && StringUtils.isBlank(log)) {
+ Log.e("cgData.saveLogOffline: cannot log an unknown log type and no message");
return false;
}
init();
- boolean status = false;
- ContentValues values = new ContentValues();
+ final ContentValues values = new ContentValues();
values.put("geocode", geocode);
values.put("updated", System.currentTimeMillis());
values.put("type", type.id);
values.put("log", log);
values.put("date", date.getTime());
- try {
- if (hasLogOffline(geocode)) {
- final int rows = database.update(dbTableLogsOffline, values, "geocode = ?", new String[] { geocode });
-
- if (rows > 0) {
- status = true;
- }
- } else {
- final long id = database.insert(dbTableLogsOffline, null, values);
-
- if (id > 0) {
- status = true;
- }
- }
- } catch (Exception e) {
- Log.e("cgData.saveLogOffline: " + e.toString());
+ if (hasLogOffline(geocode)) {
+ final int rows = database.update(dbTableLogsOffline, values, "geocode = ?", new String[] { geocode });
+ return rows > 0;
}
-
- return status;
+ final long id = database.insert(dbTableLogsOffline, null, values);
+ return id != -1;
}
public LogEntry loadLogOffline(String geocode) {
@@ -2917,14 +2913,10 @@ public class cgData {
if (all.length() > 0) {
all.append(", ");
}
- all.append('"');
- all.append(geocode);
- all.append('"');
+ all.append(DatabaseUtils.sqlEscapeString(geocode));
}
- where.append("geocode in (");
- where.append(all);
- where.append(')');
+ where.append("geocode in (").append(all).append(')');
}
return where.toString();