diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2011-09-16 14:36:28 +0200 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2011-09-16 14:36:28 +0200 |
| commit | 579ef7a535489d4aa632db11667a3b01deb6cafd (patch) | |
| tree | 55810021c02ac7d80d3a9702ef0b59e4af154b9c /src/cgeo/geocaching/cgData.java | |
| parent | 96ea21fd50334479c262da692038965d0e4d596a (diff) | |
| download | cgeo-579ef7a535489d4aa632db11667a3b01deb6cafd.zip cgeo-579ef7a535489d4aa632db11667a3b01deb6cafd.tar.gz cgeo-579ef7a535489d4aa632db11667a3b01deb6cafd.tar.bz2 | |
Move sources into the main directory
This prepares the inclusion of tests into the same repository.
Diffstat (limited to 'src/cgeo/geocaching/cgData.java')
| -rw-r--r-- | src/cgeo/geocaching/cgData.java | 3272 |
1 files changed, 0 insertions, 3272 deletions
diff --git a/src/cgeo/geocaching/cgData.java b/src/cgeo/geocaching/cgData.java deleted file mode 100644 index c24d0ff..0000000 --- a/src/cgeo/geocaching/cgData.java +++ /dev/null @@ -1,3272 +0,0 @@ -package cgeo.geocaching; - -import cgeo.geocaching.enumerations.CacheSize; -import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.geopoint.Geopoint.MalformedCoordinateException; -import cgeo.geocaching.utils.CollectionUtils; - -import org.apache.commons.lang3.StringUtils; - -import android.content.ContentValues; -import android.content.Context; -import android.content.res.Resources; -import android.database.Cursor; -import android.database.DatabaseUtils.InsertHelper; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.database.sqlite.SQLiteStatement; -import android.os.Environment; -import android.util.Log; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -public class cgData { - - /** The list of fields needed for mapping. */ - private static final String[] CACHE_COLUMNS = new String[] { - "_id", "updated", "reason", "detailed", "detailedupdate", "visiteddate", "geocode", "cacheid", "guid", "type", "name", "own", "owner", "owner_real", "hidden", "hint", "size", - "difficulty", "distance", "direction", "terrain", "latlon", "latitude_string", "longitude_string", "location", "latitude", "longitude", "elevation", "shortdesc", - "description", "favourite_cnt", "rating", "votes", "myvote", "disabled", "archived", "members", "found", "favourite", "inventorycoins", "inventorytags", - "inventoryunknown", "onWatchlist", "personal_note", "reliable_latlon" - }; - public cgCacheWrap caches; - private Context context = null; - private String path = null; - private cgDbHelper dbHelper = null; - private SQLiteDatabase databaseRO = null; - private SQLiteDatabase databaseRW = null; - private static final int dbVersion = 57; - private static final String dbName = "data"; - private static final String dbTableCaches = "cg_caches"; - private static final String dbTableLists = "cg_lists"; - private static final String dbTableAttributes = "cg_attributes"; - private static final String dbTableWaypoints = "cg_waypoints"; - private static final String dbTableSpoilers = "cg_spoilers"; - private static final String dbTableLogs = "cg_logs"; - private static final String dbTableLogCount = "cg_logCount"; - private static final String dbTableLogImages = "cg_logImages"; - private static final String dbTableLogsOffline = "cg_logs_offline"; - private static final String dbTableTrackables = "cg_trackables"; - private static final String dbTableSearchDestionationHistory = "cg_search_destination_history"; - private static final String dbCreateCaches = "" - + "create table " + dbTableCaches + " (" - + "_id integer primary key autoincrement, " - + "updated long not null, " - + "detailed integer not null default 0, " - + "detailedupdate long, " - + "visiteddate long, " - + "geocode text unique not null, " - + "reason integer not null default 0, " // cached, favourite... - + "cacheid text, " - + "guid text, " - + "type text, " - + "name text, " - + "own integer not null default 0, " - + "owner text, " - + "owner_real text, " - + "hidden long, " - + "hint text, " - + "size text, " - + "difficulty float, " - + "terrain float, " - + "latlon text, " - + "latitude_string text, " - + "longitude_string text, " - + "location text, " - + "direction double, " - + "distance double, " - + "latitude double, " - + "longitude double, " - + "reliable_latlon integer, " - + "elevation double, " - + "personal_note text, " - + "shortdesc text, " - + "description text, " - + "favourite_cnt integer, " - + "rating float, " - + "votes integer, " - + "myvote float, " - + "disabled integer not null default 0, " - + "archived integer not null default 0, " - + "members integer not null default 0, " - + "found integer not null default 0, " - + "favourite integer not null default 0, " - + "inventorycoins integer default 0, " - + "inventorytags integer default 0, " - + "inventoryunknown integer default 0, " - + "onWatchlist integer default 0 " - + "); "; - private static final String dbCreateLists = "" - + "create table " + dbTableLists + " (" - + "_id integer primary key autoincrement, " - + "title text not null, " - + "updated long not null, " - + "latitude double, " - + "longitude double " - + "); "; - private static final String dbCreateAttributes = "" - + "create table " + dbTableAttributes + " (" - + "_id integer primary key autoincrement, " - + "geocode text not null, " - + "updated long not null, " // date of save - + "attribute text " - + "); "; - private final static int ATTRIBUTES_GEOCODE = 2; - private final static int ATTRIBUTES_UPDATED = 3; - private final static int ATTRIBUTES_ATTRIBUTE = 4; - - private static final String dbCreateWaypoints = "" - + "create table " + dbTableWaypoints + " (" - + "_id integer primary key autoincrement, " - + "geocode text not null, " - + "updated long not null, " // date of save - + "type text not null default 'waypoint', " - + "prefix text, " - + "lookup text, " - + "name text, " - + "latlon text, " - + "latitude_string text, " - + "longitude_string text, " - + "latitude double, " - + "longitude double, " - + "note text " - + "); "; - private static final String dbCreateSpoilers = "" - + "create table " + dbTableSpoilers + " (" - + "_id integer primary key autoincrement, " - + "geocode text not null, " - + "updated long not null, " // date of save - + "url text, " - + "title text, " - + "description text " - + "); "; - private static final String dbCreateLogs = "" - + "create table " + dbTableLogs + " (" - + "_id integer primary key autoincrement, " - + "geocode text not null, " - + "updated long not null, " // date of save - + "type integer not null default 4, " - + "author text, " - + "log text, " - + "date long, " - + "found integer not null default 0 " - + "); "; - private final static int LOGS_GEOCODE = 2; - private final static int LOGS_UPDATED = 3; - private final static int LOGS_TYPE = 4; - private final static int LOGS_AUTHOR = 5; - private final static int LOGS_LOG = 6; - private final static int LOGS_DATE = 7; - private final static int LOGS_FOUND = 8; - - private static final String dbCreateLogCount = "" - + "create table " + dbTableLogCount + " (" - + "_id integer primary key autoincrement, " - + "geocode text not null, " - + "updated long not null, " // date of save - + "type integer not null default 4, " - + "count integer not null default 0 " - + "); "; - private static final String dbCreateLogImages = "" - + "create table " + dbTableLogImages + " (" - + "_id integer primary key autoincrement, " - + "log_id integer not null, " - + "title text not null, " - + "url text not null" - + "); "; - private static final String dbCreateLogsOffline = "" - + "create table " + dbTableLogsOffline + " (" - + "_id integer primary key autoincrement, " - + "geocode text not null, " - + "updated long not null, " // date of save - + "type integer not null default 4, " - + "log text, " - + "date long " - + "); "; - private static final String dbCreateTrackables = "" - + "create table " + dbTableTrackables + " (" - + "_id integer primary key autoincrement, " - + "updated long not null, " // date of save - + "tbcode text not null, " - + "guid text, " - + "title text, " - + "owner text, " - + "released long, " - + "goal text, " - + "description text, " - + "geocode text " - + "); "; - - private static final String dbCreateSearchDestinationHistory = "" - + "create table " + dbTableSearchDestionationHistory + " (" - + "_id integer primary key autoincrement, " - + "date long not null, " - + "latitude double, " - + "longitude double " - + "); "; - - public boolean initialized = false; - - public cgData(Context contextIn) { - context = contextIn; - } - - public synchronized void init() { - if (databaseRW == null || databaseRW.isOpen() == false) { - try { - if (dbHelper == null) { - dbHelper = new cgDbHelper(context); - } - databaseRW = dbHelper.getWritableDatabase(); - - if (databaseRW != null && databaseRW.isOpen()) { - Log.i(cgSettings.tag, "Connection to RW database established."); - } else { - Log.e(cgSettings.tag, "Failed to open connection to RW database."); - } - - if (databaseRW != null && databaseRW.inTransaction()) { - databaseRW.endTransaction(); - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.openDb.RW: " + e.toString()); - } - } - - if (databaseRO == null || !databaseRO.isOpen()) { - try { - if (dbHelper == null) { - dbHelper = new cgDbHelper(context); - } - databaseRO = dbHelper.getReadableDatabase(); - - if (databaseRO.needUpgrade(dbVersion)) { - databaseRO = null; - } - - if (databaseRO != null && databaseRO.isOpen()) { - Log.i(cgSettings.tag, "Connection to RO database established."); - } else { - Log.e(cgSettings.tag, "Failed to open connection to RO database."); - } - - if (databaseRO != null && databaseRO.inTransaction()) { - databaseRO.endTransaction(); - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.openDb.RO: " + e.toString()); - } - } - - initialized = true; - } - - public void closeDb() { - if (databaseRO != null) { - path = databaseRO.getPath(); - - if (databaseRO.inTransaction()) { - databaseRO.endTransaction(); - } - - databaseRO.close(); - databaseRO = null; - SQLiteDatabase.releaseMemory(); - - Log.d(cgSettings.tag, "Closing RO database"); - } - - if (databaseRW != null) { - path = databaseRW.getPath(); - - if (databaseRW.inTransaction()) { - databaseRW.endTransaction(); - } - - databaseRW.close(); - databaseRW = null; - SQLiteDatabase.releaseMemory(); - - Log.d(cgSettings.tag, "Closing RW database"); - } - - if (dbHelper != null) { - dbHelper.close(); - dbHelper = null; - } - } - - public String backupDatabase() { - if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) == false) { - Log.w(cgSettings.tag, "Database wasn't backed up: no external memory"); - - return null; - } - - closeDb(); - - boolean backupDone = false; - final String directoryImg = cgSettings.cache; - final String directoryTarget = Environment.getExternalStorageDirectory() + "/" + directoryImg + "/"; - final String fileTarget = directoryTarget + "cgeo.sqlite"; - final String fileSource = path; - - File directoryTargetFile = new File(directoryTarget); - if (directoryTargetFile.exists() == false) { - directoryTargetFile.mkdir(); - } - - InputStream input = null; - OutputStream output = null; - try { - input = new FileInputStream(fileSource); - output = new FileOutputStream(fileTarget); - } catch (FileNotFoundException e) { - Log.e(cgSettings.tag, "Database wasn't backed up, could not open file: " + e.toString()); - } - - byte[] buffer = new byte[1024]; - int length; - if ((input != null) && (output != null)) { - try { - while ((length = input.read(buffer)) > 0) { - output.write(buffer, 0, length); - } - output.flush(); - backupDone = true; - } catch (IOException e) { - Log.e(cgSettings.tag, "Database wasn't backed up, could not read/write file: " + e.toString()); - } - } - - try { - if (output != null) { - output.close(); - } - if (input != null) { - input.close(); - } - } catch (IOException e) { - Log.e(cgSettings.tag, "Database wasn't backed up, could not close file: " + e.toString()); - } - - if (backupDone) { - Log.i(cgSettings.tag, "Database was copied to " + fileTarget); - } - - init(); - - return backupDone ? fileTarget : null; - } - - public static File isRestoreFile() { - final String directoryImg = cgSettings.cache; - final String fileSource = Environment.getExternalStorageDirectory() + "/" + directoryImg + "/cgeo.sqlite"; - - File fileSourceFile = new File(fileSource); - if (fileSourceFile.exists()) { - return fileSourceFile; - } else { - return null; - } - } - - public boolean restoreDatabase() { - if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) == false) { - Log.w(cgSettings.tag, "Database wasn't restored: no external memory"); - - return false; - } - - closeDb(); - - boolean restoreDone = false; - - final String directoryImg = cgSettings.cache; - final String fileSource = Environment.getExternalStorageDirectory() + "/" + directoryImg + "/cgeo.sqlite"; - final String fileTarget = path; - - File fileSourceFile = new File(fileSource); - if (fileSourceFile.exists() == false) { - Log.w(cgSettings.tag, "Database backup was not found"); - - init(); - - return restoreDone; - } - - InputStream input = null; - OutputStream output = null; - try { - input = new FileInputStream(fileSource); - output = new FileOutputStream(fileTarget); - } catch (FileNotFoundException e) { - Log.e(cgSettings.tag, "Database wasn't restored, could not open file: " + e.toString()); - } - - byte[] buffer = new byte[1024]; - int length; - if ((input != null) && (output != null)) { - try { - while ((length = input.read(buffer)) > 0) { - output.write(buffer, 0, length); - } - output.flush(); - restoreDone = true; - } catch (IOException e) { - Log.e(cgSettings.tag, "Database wasn't restored, could not read/write file: " + e.toString()); - } - } - - try { - if (output != null) { - output.close(); - } - if (input != null) { - input.close(); - } - } catch (IOException e) { - Log.e(cgSettings.tag, "Database wasn't restored, could not close file: " + e.toString()); - } - - if (restoreDone) { - Log.i(cgSettings.tag, "Database was restored"); - } - - init(); - - return restoreDone; - } - - private static class cgDbHelper extends SQLiteOpenHelper { - - cgDbHelper(Context context) { - super(context, dbName, null, dbVersion); - } - - @Override - public void onCreate(SQLiteDatabase db) { - db.execSQL(dbCreateCaches); - db.execSQL(dbCreateLists); - db.execSQL(dbCreateAttributes); - db.execSQL(dbCreateWaypoints); - db.execSQL(dbCreateSpoilers); - db.execSQL(dbCreateLogs); - db.execSQL(dbCreateLogCount); - db.execSQL(dbCreateLogImages); - db.execSQL(dbCreateLogsOffline); - db.execSQL(dbCreateTrackables); - db.execSQL(dbCreateSearchDestinationHistory); - - db.execSQL("create index if not exists in_caches_geo on " + dbTableCaches + " (geocode)"); - db.execSQL("create index if not exists in_caches_guid on " + dbTableCaches + " (guid)"); - db.execSQL("create index if not exists in_caches_reason on " + dbTableCaches + " (reason)"); - db.execSQL("create index if not exists in_caches_detailed on " + dbTableCaches + " (detailed)"); - db.execSQL("create index if not exists in_caches_type on " + dbTableCaches + " (type)"); - db.execSQL("create index if not exists in_caches_visit_detail on " + dbTableCaches + " (visiteddate, detailedupdate)"); - db.execSQL("create index if not exists in_attr_geo on " + dbTableAttributes + " (geocode)"); - db.execSQL("create index if not exists in_wpts_geo on " + dbTableWaypoints + " (geocode)"); - db.execSQL("create index if not exists in_wpts_geo_type on " + dbTableWaypoints + " (geocode, type)"); - db.execSQL("create index if not exists in_spoil_geo on " + dbTableSpoilers + " (geocode)"); - db.execSQL("create index if not exists in_logs_geo on " + dbTableLogs + " (geocode)"); - db.execSQL("create index if not exists in_logcount_geo on " + dbTableLogCount + " (geocode)"); - db.execSQL("create index if not exists in_logsoff_geo on " + dbTableLogsOffline + " (geocode)"); - db.execSQL("create index if not exists in_trck_geo on " + dbTableTrackables + " (geocode)"); - } - - @Override - public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { - Log.i(cgSettings.tag, "Upgrade database from ver. " + oldVersion + " to ver. " + newVersion + ": start"); - - try { - if (db.isReadOnly()) { - return; - } - - db.beginTransaction(); - - if (oldVersion <= 0) { // new table - dropDatabase(db); - onCreate(db); - - Log.i(cgSettings.tag, "Database structure created."); - } - - if (oldVersion > 0) { - db.execSQL("delete from " + dbTableCaches + " where reason = 0"); - - if (oldVersion < 34) { // upgrade to 34 - try { - db.execSQL("create index if not exists in_a on " + dbTableCaches + " (geocode)"); - db.execSQL("create index if not exists in_b on " + dbTableCaches + " (guid)"); - db.execSQL("create index if not exists in_c on " + dbTableCaches + " (reason)"); - db.execSQL("create index if not exists in_d on " + dbTableCaches + " (detailed)"); - db.execSQL("create index if not exists in_e on " + dbTableCaches + " (type)"); - db.execSQL("create index if not exists in_a on " + dbTableAttributes + " (geocode)"); - db.execSQL("create index if not exists in_a on " + dbTableWaypoints + " (geocode)"); - db.execSQL("create index if not exists in_b on " + dbTableWaypoints + " (geocode, type)"); - db.execSQL("create index if not exists in_a on " + dbTableSpoilers + " (geocode)"); - db.execSQL("create index if not exists in_a on " + dbTableLogs + " (geocode)"); - db.execSQL("create index if not exists in_a on " + dbTableTrackables + " (geocode)"); - - Log.i(cgSettings.tag, "Indexes added."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 34: " + e.toString()); - } - } - - if (oldVersion < 37) { // upgrade to 37 - try { - db.execSQL("alter table " + dbTableCaches + " add column direction text"); - db.execSQL("alter table " + dbTableCaches + " add column distance double"); - - Log.i(cgSettings.tag, "Columns direction and distance added to " + dbTableCaches + "."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 37: " + e.toString()); - } - } - - if (oldVersion < 38) { // upgrade to 38 - try { - db.execSQL("drop table " + dbTableLogs); - db.execSQL(dbCreateLogs); - - Log.i(cgSettings.tag, "Changed type column in " + dbTableLogs + " to integer."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 38: " + e.toString()); - } - } - - if (oldVersion < 39) { // upgrade to 39 - try { - db.execSQL(dbCreateLists); - - Log.i(cgSettings.tag, "Created lists table."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 39: " + e.toString()); - } - } - - if (oldVersion < 40) { // upgrade to 40 - try { - db.execSQL("drop table " + dbTableTrackables); - db.execSQL(dbCreateTrackables); - - Log.i(cgSettings.tag, "Changed type of geocode column in trackables table."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 40: " + e.toString()); - } - } - - if (oldVersion < 41) { // upgrade to 41 - try { - db.execSQL("alter table " + dbTableCaches + " add column rating float"); - db.execSQL("alter table " + dbTableCaches + " add column votes integer"); - db.execSQL("alter table " + dbTableCaches + " add column vote integer"); - - Log.i(cgSettings.tag, "Added columns for GCvote."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 41: " + e.toString()); - } - } - - if (oldVersion < 42) { // upgrade to 42 - try { - db.execSQL(dbCreateLogsOffline); - - Log.i(cgSettings.tag, "Added table for offline logs"); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 42: " + e.toString()); - } - } - - if (oldVersion < 43) { // upgrade to 43 - try { - final String dbTableCachesTemp = dbTableCaches + "_temp"; - final String dbCreateCachesTemp = "" - + "create temporary table " + dbTableCachesTemp + " (" - + "_id integer primary key autoincrement, " - + "updated long not null, " - + "detailed integer not null default 0, " - + "detailedupdate long, " - + "geocode text unique not null, " - + "reason integer not null default 0, " // cached, favourite... - + "cacheid text, " - + "guid text, " - + "type text, " - + "name text, " - + "owner text, " - + "hidden long, " - + "hint text, " - + "size text, " - + "difficulty float, " - + "terrain float, " - + "latlon text, " - + "latitude_string text, " - + "longitude_string text, " - + "location text, " - + "distance double, " - + "latitude double, " - + "longitude double, " - + "shortdesc text, " - + "description text, " - + "rating float, " - + "votes integer, " - + "vote integer, " - + "disabled integer not null default 0, " - + "archived integer not null default 0, " - + "members integer not null default 0, " - + "found integer not null default 0, " - + "favourite integer not null default 0, " - + "inventorycoins integer default 0, " - + "inventorytags integer default 0, " - + "inventoryunknown integer default 0 " - + "); "; - final String dbCreateCachesNew = "" - + "create table " + dbTableCaches + " (" - + "_id integer primary key autoincrement, " - + "updated long not null, " - + "detailed integer not null default 0, " - + "detailedupdate long, " - + "geocode text unique not null, " - + "reason integer not null default 0, " // cached, favourite... - + "cacheid text, " - + "guid text, " - + "type text, " - + "name text, " - + "owner text, " - + "hidden long, " - + "hint text, " - + "size text, " - + "difficulty float, " - + "terrain float, " - + "latlon text, " - + "latitude_string text, " - + "longitude_string text, " - + "location text, " - + "direction double, " - + "distance double, " - + "latitude double, " - + "longitude double, " - + "shortdesc text, " - + "description text, " - + "rating float, " - + "votes integer, " - + "vote integer, " - + "disabled integer not null default 0, " - + "archived integer not null default 0, " - + "members integer not null default 0, " - + "found integer not null default 0, " - + "favourite integer not null default 0, " - + "inventorycoins integer default 0, " - + "inventorytags integer default 0, " - + "inventoryunknown integer default 0 " - + "); "; - - db.beginTransaction(); - db.execSQL(dbCreateCachesTemp); - db.execSQL("insert into " + dbTableCachesTemp + " select _id, updated, detailed, detailedupdate, geocode, reason, cacheid, guid, type, name, owner, hidden, hint, size, difficulty, terrain, latlon, latitude_string, longitude_string, location, distance, latitude, longitude, shortdesc, description, rating, votes, vote, disabled, archived, members, found, favourite, inventorycoins, inventorytags, inventoryunknown from " + dbTableCaches); - db.execSQL("drop table " + dbTableCaches); - db.execSQL(dbCreateCachesNew); - db.execSQL("insert into " + dbTableCaches + " select _id, updated, detailed, detailedupdate, geocode, reason, cacheid, guid, type, name, owner, hidden, hint, size, difficulty, terrain, latlon, latitude_string, longitude_string, location, null, distance, latitude, longitude, shortdesc, description, rating, votes, vote, disabled, archived, members, found, favourite, inventorycoins, inventorytags, inventoryunknown from " + dbTableCachesTemp); - db.execSQL("drop table " + dbTableCachesTemp); - db.setTransactionSuccessful(); - - Log.i(cgSettings.tag, "Changed direction column"); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 43: " + e.toString()); - } finally { - db.endTransaction(); - } - } - - if (oldVersion < 44) { // upgrade to 44 - try { - db.execSQL("alter table " + dbTableCaches + " add column favourite_cnt integer"); - - Log.i(cgSettings.tag, "Column favourite_cnt added to " + dbTableCaches + "."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 44: " + e.toString()); - } - } - - if (oldVersion < 45) { // upgrade to 45 - try { - db.execSQL("alter table " + dbTableCaches + " add column owner_real text"); - - Log.i(cgSettings.tag, "Column owner_real added to " + dbTableCaches + "."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 45: " + e.toString()); - } - } - - if (oldVersion < 46) { // upgrade to 46 - try { - db.execSQL("alter table " + dbTableCaches + " add column visiteddate long"); - db.execSQL("create index if not exists in_f on " + dbTableCaches + " (visiteddate, detailedupdate)"); - - Log.i(cgSettings.tag, "Added column for date of visit."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 46: " + e.toString()); - } - } - if (oldVersion < 47) { // upgrade to 47 - try { - db.execSQL("alter table " + dbTableCaches + " add column own integer not null default 0"); - - Log.i(cgSettings.tag, "Added column own."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 47: " + e.toString()); - } - } - - if (oldVersion < 48) { // upgrade to 48 - try { - db.execSQL("alter table " + dbTableCaches + " add column elevation double"); - - Log.i(cgSettings.tag, "Column elevation added to " + dbTableCaches + "."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 48: " + e.toString()); - } - } - - if (oldVersion < 49) { // upgrade to 49 - try { - db.execSQL(dbCreateLogCount); - - Log.i(cgSettings.tag, "Created table " + dbTableLogCount + "."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 49: " + e.toString()); - } - } - - if (oldVersion < 50) { // upgrade to 50 - try { - db.execSQL("alter table " + dbTableCaches + " add column myvote float"); - - Log.i(cgSettings.tag, "Added float column for votes to " + dbTableCaches + "."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 50: " + e.toString()); - } - } - - if (oldVersion < 51) { // upgrade to 51 - try { - db.execSQL("alter table " + dbTableCaches + " add column reliable_latlon integer"); - - Log.i(cgSettings.tag, "Column reliable_latlon added to " + dbTableCaches + "."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 51: " + e.toString()); - } - } - - if (oldVersion < 52) { // upgrade to 52 - try { - db.execSQL(dbCreateSearchDestinationHistory); - - Log.i(cgSettings.tag, "Added table " + dbTableSearchDestionationHistory + "."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 52", e); - } - } - - if (oldVersion < 53) { // upgrade to 53 - try { - db.execSQL("alter table " + dbTableCaches + " add column onWatchlist integer"); - - Log.i(cgSettings.tag, "Column onWatchlist added to " + dbTableCaches + "."); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 53", e); - } - } - - if (oldVersion < 54) { // update to 54 - try { - db.execSQL(dbCreateLogImages); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 54: " + e.toString()); - - } - } - - if (oldVersion < 55) { // update to 55 - try { - db.execSQL("alter table " + dbTableCaches + " add column personal_note text"); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 55: " + e.toString()); - - } - } - - // make all internal attribute names lowercase - // @see issue #299 - if (oldVersion < 56) { // update to 56 - try { - db.execSQL("update " + dbTableAttributes + " set attribute = " + - "lower(attribute) where attribute like \"%_yes\" " + - "or attribute like \"%_no\""); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 56: " + e.toString()); - } - } - - // Create missing indices. See issue #435 - if (oldVersion < 57) { // update to 57 - try { - db.execSQL("drop index in_a"); - db.execSQL("drop index in_b"); - db.execSQL("drop index in_c"); - db.execSQL("drop index in_d"); - db.execSQL("drop index in_e"); - db.execSQL("drop index in_f"); - db.execSQL("create index if not exists in_caches_geo on " + dbTableCaches + " (geocode)"); - db.execSQL("create index if not exists in_caches_guid on " + dbTableCaches + " (guid)"); - db.execSQL("create index if not exists in_caches_reason on " + dbTableCaches + " (reason)"); - db.execSQL("create index if not exists in_caches_detailed on " + dbTableCaches + " (detailed)"); - db.execSQL("create index if not exists in_caches_type on " + dbTableCaches + " (type)"); - db.execSQL("create index if not exists in_caches_visit_detail on " + dbTableCaches + " (visiteddate, detailedupdate)"); - db.execSQL("create index if not exists in_attr_geo on " + dbTableAttributes + " (geocode)"); - db.execSQL("create index if not exists in_wpts_geo on " + dbTableWaypoints + " (geocode)"); - db.execSQL("create index if not exists in_wpts_geo_type on " + dbTableWaypoints + " (geocode, type)"); - db.execSQL("create index if not exists in_spoil_geo on " + dbTableSpoilers + " (geocode)"); - db.execSQL("create index if not exists in_logs_geo on " + dbTableLogs + " (geocode)"); - db.execSQL("create index if not exists in_logcount_geo on " + dbTableLogCount + " (geocode)"); - db.execSQL("create index if not exists in_logsoff_geo on " + dbTableLogsOffline + " (geocode)"); - db.execSQL("create index if not exists in_trck_geo on " + dbTableTrackables + " (geocode)"); - } catch (Exception e) { - Log.e(cgSettings.tag, "Failed to upgrade to ver. 57: " + e.toString()); - } - } - } - - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - - Log.i(cgSettings.tag, "Upgrade database from ver. " + oldVersion + " to ver. " + newVersion + ": completed"); - } - } - - private static void dropDatabase(SQLiteDatabase db) { - db.execSQL("drop table if exists " + dbTableCaches); - db.execSQL("drop table if exists " + dbTableAttributes); - db.execSQL("drop table if exists " + dbTableWaypoints); - db.execSQL("drop table if exists " + dbTableSpoilers); - db.execSQL("drop table if exists " + dbTableLogs); - db.execSQL("drop table if exists " + dbTableLogCount); - db.execSQL("drop table if exists " + dbTableLogsOffline); - db.execSQL("drop table if exists " + dbTableTrackables); - } - - public String[] allDetailedThere() { - init(); - - Cursor cursor = null; - List<String> list = new ArrayList<String>(); - - try { - cursor = databaseRO.query( - dbTableCaches, - new String[] { "_id", "geocode" }, - "(detailed = 1 and detailedupdate > " + (System.currentTimeMillis() - (3 * 24 * 60 * 60 * 1000)) + ") or reason > 0", - null, - null, - null, - "detailedupdate desc", - "100"); - - if (cursor != null) { - int index = 0; - - if (cursor.getCount() > 0) { - cursor.moveToFirst(); - index = cursor.getColumnIndex("geocode"); - - do { - list.add((String) cursor.getString(index)); - } while (cursor.moveToNext()); - } else { - if (cursor != null) { - cursor.close(); - } - - return null; - } - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.allDetailedThere: " + e.toString()); - } - - if (cursor != null) { - cursor.close(); - } - - return list.toArray(new String[list.size()]); - } - - public boolean isThere(String geocode, String guid, boolean detailed, boolean checkTime) { - init(); - - Cursor cursor = null; - - int cnt = 0; - long dataUpdated = 0; - long dataDetailedUpdate = 0; - int dataDetailed = 0; - - try { - if (StringUtils.isNotBlank(geocode)) { - cursor = databaseRO.query( - dbTableCaches, - new String[] { "_id", "detailed", "detailedupdate", "updated" }, - "geocode = \"" + geocode + "\"", - null, - null, - null, - null, - "1"); - } else if (StringUtils.isNotBlank(guid)) { - cursor = databaseRO.query( - dbTableCaches, - new String[] { "_id", "detailed", "detailedupdate", "updated" }, - "guid = \"" + guid + "\"", - null, - null, - null, - null, - "1"); - } else { - return false; - } - - if (cursor != null) { - int index = 0; - cnt = cursor.getCount(); - - if (cnt > 0) { - cursor.moveToFirst(); - - index = cursor.getColumnIndex("updated"); - dataUpdated = (long) cursor.getLong(index); - index = cursor.getColumnIndex("detailedupdate"); - dataDetailedUpdate = (long) cursor.getLong(index); - index = cursor.getColumnIndex("detailed"); - dataDetailed = (int) cursor.getInt(index); - } - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.isThere: " + e.toString()); - } - - if (cursor != null) { - cursor.close(); - } - - if (cnt > 0) { - if (detailed && dataDetailed == 0) { - // we want details, but these are not stored - return false; - } - - if (checkTime && detailed && dataDetailedUpdate < (System.currentTimeMillis() - (3 * 24 * 60 * 60 * 1000))) { - // we want to check time for detailed cache, but data are older than 3 hours - return false; - } - - if (checkTime && detailed == false && dataUpdated < (System.currentTimeMillis() - (3 * 24 * 60 * 60 * 1000))) { - // we want to check time for short cache, but data are older than 3 hours - return false; - } - - // we have some cache - return true; - } - - // we have no such cache stored in cache - return false; - } - - public boolean isOffline(String geocode, String guid) { - init(); - - Cursor cursor = null; - long reason = 0; - - try { - if (StringUtils.isNotBlank(geocode)) { - cursor = databaseRO.query( - dbTableCaches, - new String[] { "reason" }, - "geocode = \"" + geocode + "\"", - null, - null, - null, - null, - "1"); - } else if (StringUtils.isNotBlank(guid)) { - cursor = databaseRO.query( - dbTableCaches, - new String[] { "reason" }, - "guid = \"" + guid + "\"", - null, - null, - null, - null, - "1"); - } else { - return false; - } - - if (cursor != null) { - final int cnt = cursor.getCount(); - int index = 0; - - if (cnt > 0) { - cursor.moveToFirst(); - - index = cursor.getColumnIndex("reason"); - reason = (long) cursor.getLong(index); - } - - cursor.close(); - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.isOffline: " + e.toString()); - } - - if (reason >= 1) { - return true; - } else { - return false; - } - } - - public String getGeocodeForGuid(String guid) { - if (StringUtils.isBlank(guid)) { - return null; - } - - init(); - - Cursor cursor = null; - String geocode = null; - - try { - cursor = databaseRO.query( - dbTableCaches, - new String[] { "_id", "geocode" }, - "guid = \"" + guid + "\"", - null, - null, - null, - null, - "1"); - - if (cursor != null) { - int index = 0; - - if (cursor.getCount() > 0) { - cursor.moveToFirst(); - - index = cursor.getColumnIndex("geocode"); - geocode = (String) cursor.getString(index); - } - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.getGeocodeForGuid: " + e.toString()); - } - - if (cursor != null) { - cursor.close(); - } - - return geocode; - } - - public String getCacheidForGeocode(String geocode) { - if (StringUtils.isBlank(geocode)) { - return null; - } - - init(); - - Cursor cursor = null; - String cacheid = null; - - try { - cursor = databaseRO.query( - dbTableCaches, - new String[] { "_id", "cacheid" }, - "geocode = \"" + geocode + "\"", - null, - null, - null, - null, - "1"); - - if (cursor != null) { - int index = 0; - - if (cursor.getCount() > 0) { - cursor.moveToFirst(); - - index = cursor.getColumnIndex("cacheid"); - cacheid = (String) cursor.getString(index); - } - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.getCacheidForGeocode: " + e.toString()); - } - - if (cursor != null) { - cursor.close(); - } - - return cacheid; - } - - public boolean saveCache(cgCache cache) { - //LeeB - writing to the DB is slow - if (cache == null) { - return false; - } - - ContentValues values = new ContentValues(); - - if (cache.updated == null) { - values.put("updated", System.currentTimeMillis()); - } else { - values.put("updated", cache.updated); - } - values.put("reason", cache.reason); - values.put("detailed", cache.detailed ? 1 : 0); - values.put("detailedupdate", cache.detailedUpdate); - values.put("visiteddate", cache.visitedDate); - values.put("geocode", cache.geocode); - values.put("cacheid", cache.cacheId); - values.put("guid", cache.guid); - values.put("type", cache.type); - values.put("name", cache.name); - values.put("own", cache.own ? 1 : 0); - values.put("owner", cache.owner); - values.put("owner_real", cache.ownerReal); - if (cache.hidden == null) { - values.put("hidden", 0); - } else { - values.put("hidden", cache.hidden.getTime()); - } - values.put("hint", cache.hint); - values.put("size", cache.size == null ? "" : cache.size.id); - values.put("difficulty", cache.difficulty); - values.put("terrain", cache.terrain); - values.put("latlon", cache.latlon); - values.put("latitude_string", cache.latitudeString); - values.put("longitude_string", cache.longitudeString); - values.put("location", cache.location); - values.put("distance", cache.distance); - values.put("direction", cache.direction); - putCoords(values, cache.coords); - values.put("reliable_latlon", cache.reliableLatLon ? 1 : 0); - values.put("elevation", cache.elevation); - values.put("shortdesc", cache.shortdesc); - values.put("personal_note", cache.personalNote); - values.put("description", cache.description); - values.put("favourite_cnt", cache.favouriteCnt); - values.put("rating", cache.rating); - values.put("votes", cache.votes); - values.put("myvote", cache.myVote); - values.put("disabled", cache.disabled ? 1 : 0); - values.put("archived", cache.archived ? 1 : 0); - values.put("members", cache.members ? 1 : 0); - values.put("found", cache.found ? 1 : 0); - values.put("favourite", cache.favourite ? 1 : 0); - values.put("inventoryunknown", cache.inventoryItems); - values.put("onWatchlist", cache.onWatchlist ? 1 : 0); - - boolean statusOk = true; - - if (cache.attributes != null) { - if (!saveAttributes(cache.geocode, cache.attributes)) { - statusOk = false; - } - } - - if (cache.waypoints != null) { - if (!saveWaypoints(cache.geocode, cache.waypoints, true)) { - statusOk = false; - } - } - - if (cache.spoilers != null) { - if (!saveSpoilers(cache.geocode, cache.spoilers)) { - statusOk = false; - } - } - - if (cache.logs != null) { - if (!saveLogs(cache.geocode, cache.logs)) { - statusOk = false; - } - } - - if (cache.logCounts != null && cache.logCounts.isEmpty() == false) { - if (!saveLogCount(cache.geocode, cache.logCounts)) { - statusOk = false; - } - } - - if (cache.inventory != null) { - if (!saveInventory(cache.geocode, cache.inventory)) { - statusOk = false; - } - } - - if (statusOk == false) { - cache.detailed = false; - cache.detailedUpdate = 0L; - } - - init(); - - //try to update record else insert fresh.. - try { - int rows = databaseRW.update(dbTableCaches, values, "geocode = ?", new String[] { cache.geocode }); - if (rows > 0) { - values = null; - return true; - } - } catch (Exception e) { - // nothing - } - - try { - long id = databaseRW.insert(dbTableCaches, null, values); - if (id > 0) { - values = null; - return true; - } - } catch (Exception e) { - // nothing - } - - values = null; - - return false; - } - - public boolean saveAttributes(String geocode, List<String> attributes) { - init(); - - if (StringUtils.isBlank(geocode) || attributes == null) { - return false; - } - - databaseRW.beginTransaction(); - try { - databaseRW.delete(dbTableAttributes, "geocode = ?", new String[] { geocode }); - - if (!attributes.isEmpty()) { - - InsertHelper helper = new InsertHelper(databaseRW, dbTableAttributes); - long timeStamp = System.currentTimeMillis(); - - for (String attribute : attributes) { - helper.prepareForInsert(); - - helper.bind(ATTRIBUTES_GEOCODE, geocode); - helper.bind(ATTRIBUTES_UPDATED, timeStamp); - helper.bind(ATTRIBUTES_ATTRIBUTE, attribute); - - helper.execute(); - } - helper.close(); - } - databaseRW.setTransactionSuccessful(); - } finally { - databaseRW.endTransaction(); - } - - return true; - } - - /** - * Persists the given <code>destination</code> into the database. - * - * @param destinations - * @return <code>true</code> if the given destination was successfully - * persisted <code>false</code> otherwise. - */ - public boolean saveSearchedDestination(cgDestination destination) { - boolean success = true; - - if (destination == null) { - success = false; - } else { - init(); - - databaseRW.beginTransaction(); - - try { - ContentValues values = new ContentValues(); - values.put("date", destination.getDate()); - putCoords(values, destination.getCoords()); - - long id = databaseRW.insert(dbTableSearchDestionationHistory, null, values); - destination.setId(id); - databaseRW.setTransactionSuccessful(); - } catch (Exception e) { - success = false; - Log.e(cgSettings.tag, "Updating searchedDestinations db failed", e); - } finally { - databaseRW.endTransaction(); - } - } - - return success; - } - - public boolean saveWaypoints(String geocode, List<cgWaypoint> waypoints, boolean drop) { - init(); - - if (StringUtils.isBlank(geocode) || waypoints == null) { - return false; - } - - boolean ok = false; - databaseRW.beginTransaction(); - try { - if (drop) { - databaseRW.delete(dbTableWaypoints, "geocode = ? and type <> ?", new String[] { geocode, "own" }); - } - - if (!waypoints.isEmpty()) { - ContentValues values = new ContentValues(); - long timeStamp = System.currentTimeMillis(); - for (cgWaypoint oneWaypoint : waypoints) { - if (oneWaypoint.isUserDefined()) { - continue; - } - - values.clear(); - values.put("geocode", geocode); - values.put("updated", timeStamp); - values.put("type", oneWaypoint.type); - values.put("prefix", oneWaypoint.prefix); - values.put("lookup", oneWaypoint.lookup); - values.put("name", oneWaypoint.name); - values.put("latlon", oneWaypoint.latlon); - values.put("latitude_string", oneWaypoint.latitudeString); - values.put("longitude_string", oneWaypoint.longitudeString); - putCoords(values, oneWaypoint.coords); - values.put("note", oneWaypoint.note); - - databaseRW.insert(dbTableWaypoints, null, values); - } - } - - databaseRW.setTransactionSuccessful(); - ok = true; - } finally { - databaseRW.endTransaction(); - } - - return ok; - } - - /** - * Save coordinates into a ContentValues - * - * @param values - * a ContentValues to save coordinates in - * @param oneWaypoint - * coordinates to save, or null to save empty coordinates - */ - private static void putCoords(final ContentValues values, final Geopoint coords) { - values.put("latitude", coords == null ? null : coords.getLatitude()); - values.put("longitude", coords == null ? null : coords.getLongitude()); - } - - /** - * Retrieve coordinates from a Cursor - * - * @param cursor - * a Cursor representing a row in the database - * @param indexLat - * index of the latitude column - * @param indexLon - * index of the longitude column - * @return the coordinates, or null if latitude or longitude is null or the coordinates are invalid - */ - private static Geopoint getCoords(final Cursor cursor, final int indexLat, final int indexLon) { - if (cursor.isNull(indexLat) || cursor.isNull(indexLon)) { - return null; - } - - try { - return new Geopoint(cursor.getDouble(indexLat), cursor.getDouble(indexLon)); - } catch (MalformedCoordinateException e) { - // TODO: check whether the exception should be returned to the caller instead, - // as it might want to remove an invalid geopoint from the database. - Log.e(cgSettings.tag, "cannot parse geopoint from database: " + e.getMessage()); - return null; - } - } - - /** - * Retrieve coordinates from a Cursor - * - * @param cursor - * a Cursor representing a row in the database - * @return the coordinates, or null if latitude or longitude is null or the coordinates are invalid - */ - private static Geopoint getCoords(final Cursor cursor) { - final int indexLat = cursor.getColumnIndex("latitude"); - final int indexLon = cursor.getColumnIndex("longitude"); - return getCoords(cursor, indexLat, indexLon); - } - - public boolean saveOwnWaypoint(int id, String geocode, cgWaypoint waypoint) { - init(); - - if ((StringUtils.isBlank(geocode) && id <= 0) || waypoint == null) { - return false; - } - - boolean ok = false; - databaseRW.beginTransaction(); - try { - ContentValues values = new ContentValues(); - values.put("geocode", geocode); - values.put("updated", System.currentTimeMillis()); - values.put("type", waypoint.type); - values.put("prefix", waypoint.prefix); - values.put("lookup", waypoint.lookup); - values.put("name", waypoint.name); - values.put("latlon", waypoint.latlon); - values.put("latitude_string", waypoint.latitudeString); - values.put("longitude_string", waypoint.longitudeString); - putCoords(values, waypoint.coords); - values.put("note", waypoint.note); - - if (id <= 0) { - databaseRW.insert(dbTableWaypoints, null, values); - ok = true; - } else { - final int rows = databaseRW.update(dbTableWaypoints, values, "_id = " + id, null); - if (rows > 0) { - ok = true; - } else { - ok = false; - } - } - databaseRW.setTransactionSuccessful(); - } finally { - databaseRW.endTransaction(); - } - - return ok; - } - - public boolean deleteWaypoint(int id) { - init(); - - if (id == 0) { - return false; - } - - int deleted = databaseRW.delete(dbTableWaypoints, "_id = " + id, null); - - if (deleted > 0) { - return true; - } - - return false; - } - - public boolean saveSpoilers(String geocode, List<cgImage> spoilers) { - init(); - - if (StringUtils.isBlank(geocode) || spoilers == null) { - return false; - } - - databaseRW.beginTransaction(); - try { - databaseRW.delete(dbTableSpoilers, "geocode = ?", new String[] { geocode }); - - if (!spoilers.isEmpty()) { - ContentValues values = new ContentValues(); - long timeStamp = System.currentTimeMillis(); - for (cgImage oneSpoiler : spoilers) { - values.clear(); - values.put("geocode", geocode); - values.put("updated", timeStamp); - values.put("url", oneSpoiler.url); - values.put("title", oneSpoiler.title); - values.put("description", oneSpoiler.description); - - databaseRW.insert(dbTableSpoilers, null, values); - } - } - databaseRW.setTransactionSuccessful(); - } finally { - databaseRW.endTransaction(); - } - - return true; - } - - public boolean saveLogs(String geocode, List<cgLog> logs) { - return saveLogs(geocode, logs, true); - } - - public boolean saveLogs(String geocode, List<cgLog> logs, boolean drop) { - init(); - - if (StringUtils.isBlank(geocode) || logs == null) { - return false; - } - - databaseRW.beginTransaction(); - try { - if (drop) { - // TODO delete logimages referring these logs - databaseRW.delete(dbTableLogs, "geocode = ?", new String[] { geocode }); - } - - if (!logs.isEmpty()) { - InsertHelper helper = new InsertHelper(databaseRW, dbTableLogs); - long timeStamp = System.currentTimeMillis(); - for (cgLog log : logs) { - helper.prepareForInsert(); - - helper.bind(LOGS_GEOCODE, geocode); - helper.bind(LOGS_UPDATED, timeStamp); - helper.bind(LOGS_TYPE, log.type); - helper.bind(LOGS_AUTHOR, log.author); - helper.bind(LOGS_LOG, log.log); - helper.bind(LOGS_DATE, log.date); - helper.bind(LOGS_FOUND, log.found); - - long log_id = helper.execute(); - - if (CollectionUtils.isNotEmpty(log.logImages)) { - ContentValues values = new ContentValues(); - for (cgImage img : log.logImages) { - values.clear(); - values.put("log_id", log_id); - values.put("title", img.title); - values.put("url", img.url); - databaseRW.insert(dbTableLogImages, null, values); - } - } - } - helper.close(); - } - databaseRW.setTransactionSuccessful(); - } finally { - databaseRW.endTransaction(); - } - - return true; - } - - public boolean saveLogCount(String geocode, Map<Integer, Integer> logCounts) { - return saveLogCount(geocode, logCounts, true); - } - - public boolean saveLogCount(String geocode, Map<Integer, Integer> logCounts, boolean drop) { - init(); - - if (StringUtils.isBlank(geocode) || CollectionUtils.isEmpty(logCounts)) { - return false; - } - - databaseRW.beginTransaction(); - try { - if (drop) { - databaseRW.delete(dbTableLogCount, "geocode = ?", new String[] { geocode }); - } - - ContentValues values = new ContentValues(); - - Set<Entry<Integer, Integer>> logCountsItems = logCounts.entrySet(); - long timeStamp = System.currentTimeMillis(); - for (Entry<Integer, Integer> pair : logCountsItems) { - values.clear(); - values.put("geocode", geocode); - values.put("updated", timeStamp); - values.put("type", pair.getKey().intValue()); - values.put("count", pair.getValue().intValue()); - - databaseRW.insert(dbTableLogCount, null, values); - } - databaseRW.setTransactionSuccessful(); - } finally { - databaseRW.endTransaction(); - } - - return true; - } - - public boolean saveInventory(String geocode, List<cgTrackable> trackables) { - init(); - - if (trackables == null) { - return false; - } - - databaseRW.beginTransaction(); - try { - if (geocode != null) { - databaseRW.delete(dbTableTrackables, "geocode = ?", new String[] { geocode }); - } - - if (!trackables.isEmpty()) { - ContentValues values = new ContentValues(); - long timeStamp = System.currentTimeMillis(); - for (cgTrackable oneTrackable : trackables) { - values.clear(); - if (geocode != null) { - values.put("geocode", geocode); - } - values.put("updated", timeStamp); - values.put("tbcode", oneTrackable.geocode); - values.put("guid", oneTrackable.guid); - values.put("title", oneTrackable.name); - values.put("owner", oneTrackable.owner); - if (oneTrackable.released != null) { - values.put("released", oneTrackable.released.getTime()); - } else { - values.put("released", 0L); - } - values.put("goal", oneTrackable.goal); - values.put("description", oneTrackable.details); - - databaseRW.insert(dbTableTrackables, null, values); - - saveLogs(oneTrackable.geocode, oneTrackable.logs); - } - } - databaseRW.setTransactionSuccessful(); - } finally { - databaseRW.endTransaction(); - } - - return true; - } - - public List<Object> getBounds(Object[] geocodes) { - init(); - - Cursor cursor = null; - - final List<Object> viewport = new ArrayList<Object>(); - - try { - final StringBuilder where = new StringBuilder(); - - if (geocodes != null && geocodes.length > 0) { - StringBuilder all = new StringBuilder(); - for (Object one : geocodes) { - if (all.length() > 0) { - all.append(", "); - } - all.append('"'); - all.append((String) one); - all.append('"'); - } - - if (where.length() > 0) { - where.append(" and "); - } - where.append("geocode in ("); - where.append(all); - where.append(')'); - } - - cursor = databaseRO.query( - dbTableCaches, - new String[] { "count(_id) as cnt", "min(latitude) as latMin", "max(latitude) as latMax", "min(longitude) as lonMin", "max(longitude) as lonMax" }, - where.toString(), - null, - null, - null, - null, - null); - - if (cursor != null) { - int cnt = cursor.getCount(); - - if (cnt > 0) { - cursor.moveToFirst(); - - viewport.add((Integer) cursor.getInt(cursor.getColumnIndex("cnt"))); - viewport.add((Double) cursor.getDouble(cursor.getColumnIndex("latMin"))); - viewport.add((Double) cursor.getDouble(cursor.getColumnIndex("latMax"))); - viewport.add((Double) cursor.getDouble(cursor.getColumnIndex("lonMin"))); - viewport.add((Double) cursor.getDouble(cursor.getColumnIndex("lonMax"))); - } - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.getBounds: " + e.toString()); - } - - if (cursor != null) { - cursor.close(); - } - - return viewport; - } - - public cgCache loadCache(String geocode, String guid) { - return loadCache(geocode, guid, false, true, false, false, false, false); - } - - /** - * Loads a single Cache. - * - * @param geocode - * The Geocode GCXXXX - * @param guid - * @param loadA - * @param loadW - * @param loadS - * @param loadL - * @param loadI - * @param loadO - * @return the loaded cache - */ - - public cgCache loadCache(String geocode, String guid, boolean loadA, boolean loadW, boolean loadS, boolean loadL, boolean loadI, boolean loadO) { - Object[] geocodes = new Object[1]; - Object[] guids = new Object[1]; - - if (StringUtils.isNotBlank(geocode)) { - geocodes[0] = geocode; - } else { - geocodes = null; - } - - if (StringUtils.isNotBlank(guid)) { - guids[0] = guid; - } else { - guids = null; - } - - List<cgCache> caches = loadCaches(geocodes, null, null, null, null, null, loadA, loadW, loadS, loadL, loadI, loadO); - if (caches != null && caches.isEmpty() == false) { - return caches.get(0); - } - - return null; - } - - public List<cgCache> loadCaches(Object[] geocodes, Object[] guids) { - return loadCaches(geocodes, guids, null, null, null, null, false, true, false, false, false, false); - } - - public List<cgCache> loadCaches(Object[] geocodes, Object[] guids, boolean lite) { - if (lite) { - return loadCaches(geocodes, guids, null, null, null, null, false, true, false, false, false, false); - } else { - return loadCaches(geocodes, guids, null, null, null, null, true, true, true, true, true, true); - } - } - - public List<cgCache> loadCaches(Object[] geocodes, Object[] guids, Long centerLat, Long centerLon, Long spanLat, Long spanLon, boolean loadA, boolean loadW, boolean loadS, boolean loadL, boolean loadI, boolean loadO) { - init(); - // Using more than one of the parametersets results in overly comlex wheres - if (((geocodes != null && geocodes.length > 0) && (guids != null && guids.length > 0))) { - throw new IllegalArgumentException("Please use only one parameter"); - } - if (((geocodes != null && geocodes.length > 0) || (guids != null && guids.length > 0)) - && centerLat != null - && centerLon != null - && spanLat != null - && spanLon != null) { - throw new IllegalArgumentException("Please use only one parameter"); - } - StringBuilder where = new StringBuilder(); - Cursor cursor = null; - List<cgCache> caches = new ArrayList<cgCache>(); - - try { - if (geocodes != null && geocodes.length > 0) { - StringBuilder all = new StringBuilder(); - for (Object one : geocodes) { - if (all.length() > 0) { - all.append(", "); - } - all.append('"'); - all.append((String) one); - all.append('"'); - } - - if (where.length() > 0) { - where.append(" and "); - } - where.append("geocode in ("); - where.append(all); - where.append(')'); - } else if (guids != null && guids.length > 0) { - StringBuilder all = new StringBuilder(); - for (Object one : guids) { - if (all.length() > 0) { - all.append(", "); - } - all.append('"'); - all.append((String) one); - all.append('"'); - } - - if (where.length() > 0) { - where.append(" and "); - } - where.append("guid in ("); - where.append(all); - where.append(')'); - } else { - return caches; - } - - // viewport limitation - if (centerLat != null && centerLon != null && spanLat != null && spanLon != null) { - double latMin = (centerLat / 1e6) - ((spanLat / 1e6) / 2) - ((spanLat / 1e6) / 4); - double latMax = (centerLat / 1e6) + ((spanLat / 1e6) / 2) + ((spanLat / 1e6) / 4); - double lonMin = (centerLon / 1e6) - ((spanLon / 1e6) / 2) - ((spanLon / 1e6) / 4); - double lonMax = (centerLon / 1e6) + ((spanLon / 1e6) / 2) + ((spanLon / 1e6) / 4); - double llCache; - - if (latMin > latMax) { - llCache = latMax; - latMax = latMin; - latMin = llCache; - } - if (lonMin > lonMax) { - llCache = lonMax; - lonMax = lonMin; - lonMin = llCache; - } - - if (where.length() > 0) { - where.append(" and "); - } - where.append("(latitude >= "); - where.append(String.format((Locale) null, "%.6f", latMin)); - where.append(" and latitude <= "); - where.append(String.format((Locale) null, "%.6f", latMax)); - where.append(" and longitude >= "); - where.append(String.format((Locale) null, "%.6f", lonMin)); - where.append(" and longitude <= "); - where.append(String.format((Locale) null, "%.6f", lonMax)); - where.append(')'); - } - cursor = databaseRO.query( - dbTableCaches, - CACHE_COLUMNS, - where.toString(), - null, - null, - null, - null, - null); - - if (cursor != null) { - if (cursor.getCount() > 0) { - cursor.moveToFirst(); - - do { - //Extracted Method - cgCache cache = createCacheFromDatabaseContent(cursor); - - if (loadA) { - List<String> attributes = loadAttributes(cache.geocode); - if (attributes != null && attributes.isEmpty() == false) { - if (cache.attributes == null) { - cache.attributes = new ArrayList<String>(); - } else { - cache.attributes.clear(); - } - cache.attributes.addAll(attributes); - } - } - - if (loadW) { - List<cgWaypoint> waypoints = loadWaypoints(cache.geocode); - if (waypoints != null && waypoints.isEmpty() == false) { - if (cache.waypoints == null) { - cache.waypoints = new ArrayList<cgWaypoint>(); - } else { - cache.waypoints.clear(); - } - cache.waypoints.addAll(waypoints); - } - } - - if (loadS) { - List<cgImage> spoilers = loadSpoilers(cache.geocode); - if (spoilers != null && spoilers.isEmpty() == false) { - if (cache.spoilers == null) { - cache.spoilers = new ArrayList<cgImage>(); - } else { - cache.spoilers.clear(); - } - cache.spoilers.addAll(spoilers); - } - } - - if (loadL) { - List<cgLog> logs = loadLogs(cache.geocode); - if (logs != null && logs.isEmpty() == false) { - if (cache.logs == null) { - cache.logs = new ArrayList<cgLog>(); - } else { - cache.logs.clear(); - } - cache.logs.addAll(logs); - } - Map<Integer, Integer> logCounts = loadLogCounts(cache.geocode); - if (logCounts != null && logCounts.isEmpty() == false) { - cache.logCounts.clear(); - cache.logCounts.putAll(logCounts); - } - } - - if (loadI) { - List<cgTrackable> inventory = loadInventory(cache.geocode); - if (inventory != null && inventory.isEmpty() == false) { - if (cache.inventory == null) { - cache.inventory = new ArrayList<cgTrackable>(); - } else { - cache.inventory.clear(); - } - cache.inventory.addAll(inventory); - } - } - - if (loadO) { - cache.logOffline = hasLogOffline(cache.geocode); - } - - caches.add(cache); - } while (cursor.moveToNext()); - } else { - if (cursor != null) { - cursor.close(); - } - - return null; - } - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.loadCaches: " + e.toString()); - } - - if (cursor != null) { - cursor.close(); - } - - return caches; - } - - /** - * maps a Cache from the cursor. Doesn't next. - * - * @param cursor - * @return - */ - - private static cgCache createCacheFromDatabaseContent(Cursor cursor) { - int index; - cgCache cache = new cgCache(); - - cache.updated = (long) cursor.getLong(cursor.getColumnIndex("updated")); - cache.reason = (int) cursor.getInt(cursor.getColumnIndex("reason")); - cache.detailed = cursor.getInt(cursor.getColumnIndex("detailed")) == 1; - cache.detailedUpdate = (Long) cursor.getLong(cursor.getColumnIndex("detailedupdate")); - cache.visitedDate = (Long) cursor.getLong(cursor.getColumnIndex("visiteddate")); - cache.geocode = (String) cursor.getString(cursor.getColumnIndex("geocode")); - cache.cacheId = (String) cursor.getString(cursor.getColumnIndex("cacheid")); - cache.guid = (String) cursor.getString(cursor.getColumnIndex("guid")); - cache.type = (String) cursor.getString(cursor.getColumnIndex("type")); - cache.name = (String) cursor.getString(cursor.getColumnIndex("name")); - cache.own = cursor.getInt(cursor.getColumnIndex("own")) == 1; - cache.owner = (String) cursor.getString(cursor.getColumnIndex("owner")); - cache.ownerReal = (String) cursor.getString(cursor.getColumnIndex("owner_real")); - cache.hidden = new Date((long) cursor.getLong(cursor.getColumnIndex("hidden"))); - cache.hint = (String) cursor.getString(cursor.getColumnIndex("hint")); - cache.size = CacheSize.FIND_BY_ID.get((String) cursor.getString(cursor.getColumnIndex("size"))); - cache.difficulty = (Float) cursor.getFloat(cursor.getColumnIndex("difficulty")); - index = cursor.getColumnIndex("direction"); - if (cursor.isNull(index)) { - cache.direction = null; - } else { - cache.direction = cursor.getFloat(index); - } - index = cursor.getColumnIndex("distance"); - if (cursor.isNull(index)) { - cache.distance = null; - } else { - cache.distance = cursor.getFloat(index); - } - cache.terrain = (Float) cursor.getFloat(cursor.getColumnIndex("terrain")); - cache.latlon = (String) cursor.getString(cursor.getColumnIndex("latlon")); - cache.latitudeString = (String) cursor.getString(cursor.getColumnIndex("latitude_string")); - cache.longitudeString = (String) cursor.getString(cursor.getColumnIndex("longitude_string")); - cache.location = (String) cursor.getString(cursor.getColumnIndex("location")); - cache.coords = getCoords(cursor); - index = cursor.getColumnIndex("elevation"); - if (cursor.isNull(index)) { - cache.elevation = null; - } else { - cache.elevation = (Double) cursor.getDouble(index); - } - cache.personalNote = (String) cursor.getString(cursor.getColumnIndex("personal_note")); - cache.shortdesc = (String) cursor.getString(cursor.getColumnIndex("shortdesc")); - cache.description = (String) cursor.getString(cursor.getColumnIndex("description")); - cache.favouriteCnt = (Integer) cursor.getInt(cursor.getColumnIndex("favourite_cnt")); - cache.rating = (Float) cursor.getFloat(cursor.getColumnIndex("rating")); - cache.votes = (Integer) cursor.getInt(cursor.getColumnIndex("votes")); - cache.myVote = (Float) cursor.getFloat(cursor.getColumnIndex("myvote")); - cache.disabled = cursor.getLong(cursor.getColumnIndex("disabled")) == 1l; - cache.archived = cursor.getLong(cursor.getColumnIndex("archived")) == 1l; - cache.members = cursor.getLong(cursor.getColumnIndex("members")) == 1l; - cache.found = cursor.getLong(cursor.getColumnIndex("found")) == 1l; - cache.favourite = cursor.getLong(cursor.getColumnIndex("favourite")) == 1l; - cache.inventoryItems = (Integer) cursor.getInt(cursor.getColumnIndex("inventoryunknown")); - cache.onWatchlist = cursor.getLong(cursor.getColumnIndex("onWatchlist")) == 1l; - cache.reliableLatLon = cursor.getInt(cursor.getColumnIndex("reliable_latlon")) > 0; - return cache; - } - - public List<String> loadAttributes(String geocode) { - if (StringUtils.isBlank(geocode)) { - return null; - } - - init(); - - ArrayList<String> attributes = new ArrayList<String>(); - - Cursor cursor = databaseRO.query( - dbTableAttributes, - new String[] { "_id", "attribute" }, - "geocode = \"" + geocode + "\"", - null, - null, - null, - null, - "100"); - - if (cursor != null && cursor.getCount() > 0) { - cursor.moveToFirst(); - int index = cursor.getColumnIndex("attribute"); - - do { - attributes.add((String) cursor.getString(index)); - } while (cursor.moveToNext()); - } - - if (cursor != null) { - cursor.close(); - } - - return attributes; - } - - public cgWaypoint loadWaypoint(Integer id) { - if (id == null || id == 0) { - return null; - } - - init(); - - cgWaypoint waypoint = new cgWaypoint(); - - Cursor cursor = databaseRO.query( - dbTableWaypoints, - new String[] { "_id", "geocode", "updated", "type", "prefix", "lookup", "name", "latlon", "latitude_string", "longitude_string", "latitude", "longitude", "note" }, - "_id = " + id, - null, - null, - null, - null, - "1"); - - if (cursor != null && cursor.getCount() > 0) { - cursor.moveToFirst(); - - waypoint = createWaypointFromDatabaseContent(cursor); - } - - if (cursor != null) { - cursor.close(); - } - - return waypoint; - } - - public List<cgWaypoint> loadWaypoints(String geocode) { - if (StringUtils.isBlank(geocode)) { - return null; - } - - init(); - - List<cgWaypoint> waypoints = new ArrayList<cgWaypoint>(); - - Cursor cursor = databaseRO.query( - dbTableWaypoints, - new String[] { "_id", "geocode", "updated", "type", "prefix", "lookup", "name", "latlon", "latitude_string", "longitude_string", "latitude", "longitude", "note" }, - "geocode = \"" + geocode + "\"", - null, - null, - null, - null, - "100"); - - if (cursor != null && cursor.getCount() > 0) { - cursor.moveToFirst(); - - do { - - cgWaypoint waypoint = createWaypointFromDatabaseContent(cursor); - - waypoints.add(waypoint); - } while (cursor.moveToNext()); - } - - if (cursor != null) { - cursor.close(); - } - - return waypoints; - } - - private static cgWaypoint createWaypointFromDatabaseContent(Cursor cursor) { - cgWaypoint waypoint = new cgWaypoint(); - waypoint.id = (int) cursor.getInt(cursor.getColumnIndex("_id")); - waypoint.geocode = (String) cursor.getString(cursor.getColumnIndex("geocode")); - waypoint.type = (String) cursor.getString(cursor.getColumnIndex("type")); - waypoint.prefix = (String) cursor.getString(cursor.getColumnIndex("prefix")); - waypoint.lookup = (String) cursor.getString(cursor.getColumnIndex("lookup")); - waypoint.name = (String) cursor.getString(cursor.getColumnIndex("name")); - waypoint.latlon = (String) cursor.getString(cursor.getColumnIndex("latlon")); - waypoint.latitudeString = (String) cursor.getString(cursor.getColumnIndex("latitude_string")); - waypoint.longitudeString = (String) cursor.getString(cursor.getColumnIndex("longitude_string")); - waypoint.coords = getCoords(cursor); - waypoint.note = (String) cursor.getString(cursor.getColumnIndex("note")); - - return waypoint; - } - - public List<cgImage> loadSpoilers(String geocode) { - if (StringUtils.isBlank(geocode)) { - return null; - } - - init(); - - List<cgImage> spoilers = new ArrayList<cgImage>(); - - Cursor cursor = databaseRO.query( - dbTableSpoilers, - new String[] { "_id", "url", "title", "description" }, - "geocode = \"" + geocode + "\"", - null, - null, - null, - null, - "100"); - - if (cursor != null && cursor.getCount() > 0) { - cursor.moveToFirst(); - int indexUrl = cursor.getColumnIndex("url"); - int indexTitle = cursor.getColumnIndex("title"); - int indexDescription = cursor.getColumnIndex("description"); - - do { - cgImage spoiler = new cgImage(); - spoiler.url = (String) cursor.getString(indexUrl); - spoiler.title = (String) cursor.getString(indexTitle); - spoiler.description = (String) cursor.getString(indexDescription); - - spoilers.add(spoiler); - } while (cursor.moveToNext()); - } - - if (cursor != null) { - cursor.close(); - } - - return spoilers; - } - - /** - * Loads the history of previously entered destinations from - * the database. If no destinations exist, an {@link Collections#emptyList()} will be returned. - * - * @return A list of previously entered destinations or an empty list. - */ - public List<cgDestination> loadHistoryOfSearchedLocations() { - init(); - - Cursor cursor = databaseRO.query(dbTableSearchDestionationHistory, - new String[] { "_id", "date", "latitude", "longitude" }, null, - null, null, null, "date desc", "100"); - - final List<cgDestination> destinations = new LinkedList<cgDestination>(); - - if (cursor != null && cursor.getCount() > 0) { - cursor.moveToFirst(); - int indexId = cursor.getColumnIndex("_id"); - int indexDate = cursor.getColumnIndex("date"); - int indexLatitude = cursor.getColumnIndex("latitude"); - int indexLongitude = cursor.getColumnIndex("longitude"); - - do { - final cgDestination dest = new cgDestination(); - dest.setId((long) cursor.getLong(indexId)); - dest.setDate((long) cursor.getLong(indexDate)); - dest.setCoords(getCoords(cursor, indexLatitude, indexLongitude)); - - // If coordinates are non-existent or invalid, do not consider - // this point. - if (dest.getCoords() != null) { - destinations.add(dest); - } - } while (cursor.moveToNext()); - } - - if (cursor != null) { - cursor.close(); - } - - return destinations; - } - - public boolean clearSearchedDestinations() { - boolean success = true; - init(); - databaseRW.beginTransaction(); - - try { - databaseRW.delete(dbTableSearchDestionationHistory, null, null); - databaseRW.setTransactionSuccessful(); - } catch (Exception e) { - success = false; - Log.e(cgSettings.tag, "Unable to clear searched destinations", e); - } finally { - databaseRW.endTransaction(); - } - - return success; - } - - public List<cgLog> loadLogs(String geocode) { - if (StringUtils.isBlank(geocode)) { - return null; - } - - init(); - - List<cgLog> logs = new ArrayList<cgLog>(); - - Cursor cursor = databaseRO.rawQuery( - "SELECT cg_logs._id as cg_logs_id, type, author, log, date, found, " + dbTableLogImages + "._id as cg_logImages_id, log_id, title, url FROM " - + dbTableLogs + " LEFT OUTER JOIN " + dbTableLogImages - + " ON ( cg_logs._id = log_id ) WHERE geocode = ? ORDER BY date desc, cg_logs._id asc", new String[] { geocode }); - - if (cursor != null && cursor.getCount() > 0) { - cgLog log = null; - int indexLogsId = cursor.getColumnIndex("cg_logs_id"); - int indexType = cursor.getColumnIndex("type"); - int indexAuthor = cursor.getColumnIndex("author"); - int indexLog = cursor.getColumnIndex("log"); - int indexDate = cursor.getColumnIndex("date"); - int indexFound = cursor.getColumnIndex("found"); - int indexLogImagesId = cursor.getColumnIndex("cg_logImages_id"); - int indexTitle = cursor.getColumnIndex("title"); - int indexUrl = cursor.getColumnIndex("url"); - while (cursor.moveToNext() && logs.size() < 100) { - if (log == null || log.id != cursor.getInt(indexLogsId)) { - log = new cgLog(); - log.id = (int) cursor.getInt(indexLogsId); - log.type = (int) cursor.getInt(indexType); - log.author = (String) cursor.getString(indexAuthor); - log.log = (String) cursor.getString(indexLog); - log.date = (long) cursor.getLong(indexDate); - log.found = (int) cursor.getInt(indexFound); - logs.add(log); - } - if (!cursor.isNull(indexLogImagesId)) { - final cgImage log_img = new cgImage(); - log_img.title = (String) cursor.getString(indexTitle); - if (log_img.title == null) { - log_img.title = ""; - } - log_img.url = (String) cursor.getString(indexUrl); - if (log_img.url == null) { - log_img.url = ""; - } - if (log.logImages == null) { - log.logImages = new ArrayList<cgImage>(); - } - log.logImages.add(log_img); - } - } - } - - if (cursor != null) { - cursor.close(); - } - - return logs; - } - - public Map<Integer, Integer> loadLogCounts(String geocode) { - if (StringUtils.isBlank(geocode)) { - return null; - } - - init(); - - Map<Integer, Integer> logCounts = new HashMap<Integer, Integer>(); - - Cursor cursor = databaseRO.query( - dbTableLogCount, - new String[] { "_id", "type", "count" }, - "geocode = \"" + geocode + "\"", - null, - null, - null, - null, - "100"); - - if (cursor != null && cursor.getCount() > 0) { - cursor.moveToFirst(); - int indexType = cursor.getColumnIndex("type"); - int indexCount = cursor.getColumnIndex("count"); - - do { - Integer type = cursor.getInt(indexType); - Integer count = cursor.getInt(indexCount); - - logCounts.put(type, count); - } while (cursor.moveToNext()); - } - - if (cursor != null) { - cursor.close(); - } - - return logCounts; - } - - public List<cgTrackable> loadInventory(String geocode) { - if (StringUtils.isBlank(geocode)) { - return null; - } - - init(); - - List<cgTrackable> trackables = new ArrayList<cgTrackable>(); - - Cursor cursor = databaseRO.query( - dbTableTrackables, - new String[] { "_id", "updated", "tbcode", "guid", "title", "owner", "released", "goal", "description" }, - "geocode = \"" + geocode + "\"", - null, - null, - null, - "title COLLATE NOCASE ASC", - "100"); - - if (cursor != null && cursor.getCount() > 0) { - cursor.moveToFirst(); - - do { - cgTrackable trackable = createTrackableFromDatabaseContent(cursor); - - trackables.add(trackable); - } while (cursor.moveToNext()); - } - - if (cursor != null) { - cursor.close(); - } - - return trackables; - } - - public cgTrackable loadTrackable(String geocode) { - if (StringUtils.isBlank(geocode)) { - return null; - } - - init(); - - cgTrackable trackable = new cgTrackable(); - - Cursor cursor = databaseRO.query( - dbTableTrackables, - new String[] { "_id", "updated", "tbcode", "guid", "title", "owner", "released", "goal", "description" }, - "tbcode = \"" + geocode + "\"", - null, - null, - null, - null, - "1"); - - if (cursor != null && cursor.getCount() > 0) { - cursor.moveToFirst(); - trackable = createTrackableFromDatabaseContent(cursor); - } - - if (cursor != null) { - cursor.close(); - } - - return trackable; - } - - private cgTrackable createTrackableFromDatabaseContent(Cursor cursor) { - cgTrackable trackable = new cgTrackable(); - trackable.geocode = (String) cursor.getString(cursor.getColumnIndex("tbcode")); - trackable.guid = (String) cursor.getString(cursor.getColumnIndex("guid")); - trackable.name = (String) cursor.getString(cursor.getColumnIndex("title")); - trackable.owner = (String) cursor.getString(cursor.getColumnIndex("owner")); - String releasedPre = cursor.getString(cursor.getColumnIndex("released")); - if (releasedPre != null && Long.getLong(releasedPre) != null) { - trackable.released = new Date(Long.getLong(releasedPre)); - } else { - trackable.released = null; - } - trackable.goal = (String) cursor.getString(cursor.getColumnIndex("goal")); - trackable.details = (String) cursor.getString(cursor.getColumnIndex("description")); - trackable.logs = loadLogs(trackable.geocode); - return trackable; - } - - public int getAllStoredCachesCount(boolean detailedOnly, String cachetype, Integer list) { - String listSql = null; - String listSqlW = null; - if (list == null) { - listSql = " where reason >= 1"; - listSqlW = " and reason >= 1"; - } else if (list >= 1) { - listSql = " where reason = " + list; - listSqlW = " and reason = " + list; - } else { - return 0; - } - - int count = 0; - try { - String sql = "select count(_id) from " + dbTableCaches; // this default is not used, but we like to have variables initialized - if (detailedOnly == false) { - if (cachetype == null) { - sql = "select count(_id) from " + dbTableCaches + listSql; - } else { - sql = "select count(_id) from " + dbTableCaches + " where type = \"" + cachetype + "\"" + listSqlW; - } - } else { - if (cachetype == null) { - sql = "select count(_id) from " + dbTableCaches + " where detailed = 1" + listSqlW; - } else { - sql = "select count(_id) from " + dbTableCaches + " where detailed = 1 and type = \"" + cachetype + "\"" + listSqlW; - } - } - SQLiteStatement compiledStmnt = databaseRO.compileStatement(sql); - count = (int) compiledStmnt.simpleQueryForLong(); - compiledStmnt.close(); - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.loadAllStoredCachesCount: " + e.toString()); - } - - return count; - } - - public int getAllHistoricCachesCount(boolean detailedOnly, String cachetype) { - init(); - - int count = 0; - - try { - SQLiteStatement sqlCount = databaseRO.compileStatement("select count(_id) from " + dbTableCaches + " where visiteddate > 0"); - count = (int) sqlCount.simpleQueryForLong(); - sqlCount.close(); - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.getAllHistoricCachesCount: " + e.toString()); - } - - return count; - } - - public List<String> loadBatchOfStoredGeocodes(boolean detailedOnly, final Geopoint coords, String cachetype, int list) { - init(); - - if (list < 1) { - list = 1; - } - - List<String> geocodes = new ArrayList<String>(); - - StringBuilder specifySql = new StringBuilder(); - - specifySql.append("reason = "); - specifySql.append(list); - - if (detailedOnly) { - specifySql.append(" and detailed = 1 "); - } - - if (cachetype != null) { - specifySql.append(" and type = \""); - specifySql.append(cachetype); - specifySql.append('"'); - } - - try { - Cursor cursor = databaseRO.query( - dbTableCaches, - new String[] { "_id", "geocode", "(abs(latitude-" + String.format((Locale) null, "%.6f", coords.getLatitude()) + - ") + abs(longitude-" + String.format((Locale) null, "%.6f", coords.getLongitude()) + ")) as dif" }, - specifySql.toString(), - null, - null, - null, - "dif", - null); - - if (cursor != null) { - if (cursor.getCount() > 0) { - cursor.moveToFirst(); - int index = cursor.getColumnIndex("geocode"); - - do { - geocodes.add((String) cursor.getString(index)); - } while (cursor.moveToNext()); - } else { - cursor.close(); - return null; - } - - cursor.close(); - } - - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.loadBatchOfStoredGeocodes: " + e.toString()); - } - - return geocodes; - } - - public List<String> loadBatchOfHistoricGeocodes(boolean detailedOnly, String cachetype) { - init(); - - List<String> geocodes = new ArrayList<String>(); - - StringBuilder specifySql = new StringBuilder(); - specifySql.append("visiteddate > 0"); - - if (detailedOnly) { - specifySql.append(" and detailed = 1"); - } - if (cachetype != null) { - specifySql.append(" and type = \""); - specifySql.append(cachetype); - specifySql.append('"'); - } - - try { - Cursor cursor = databaseRO.query( - dbTableCaches, - new String[] { "_id", "geocode" }, - specifySql.toString(), - null, - null, - null, - "visiteddate", - null); - - if (cursor != null) { - if (cursor.getCount() > 0) { - cursor.moveToFirst(); - int index = cursor.getColumnIndex("geocode"); - - do { - geocodes.add((String) cursor.getString(index)); - } while (cursor.moveToNext()); - } else { - cursor.close(); - return null; - } - - cursor.close(); - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.loadBatchOfHistoricGeocodes: " + e.toString()); - } - - return geocodes; - } - - public List<String> getCachedInViewport(Long centerLat, Long centerLon, Long spanLat, Long spanLon, String cachetype) { - return getInViewport(false, centerLat, centerLon, spanLat, spanLon, cachetype); - } - - public List<String> getStoredInViewport(Long centerLat, Long centerLon, Long spanLat, Long spanLon, String cachetype) { - return getInViewport(true, centerLat, centerLon, spanLat, spanLon, cachetype); - } - - public List<String> getInViewport(boolean stored, Long centerLat, Long centerLon, Long spanLat, Long spanLon, String cachetype) { - if (centerLat == null || centerLon == null || spanLat == null || spanLon == null) { - return null; - } - - init(); - - List<String> geocodes = new ArrayList<String>(); - - // viewport limitation - double latMin = (centerLat / 1e6) - ((spanLat / 1e6) / 2) - ((spanLat / 1e6) / 4); - double latMax = (centerLat / 1e6) + ((spanLat / 1e6) / 2) + ((spanLat / 1e6) / 4); - double lonMin = (centerLon / 1e6) - ((spanLon / 1e6) / 2) - ((spanLon / 1e6) / 4); - double lonMax = (centerLon / 1e6) + ((spanLon / 1e6) / 2) + ((spanLon / 1e6) / 4); - double llCache; - - if (latMin > latMax) { - llCache = latMax; - latMax = latMin; - latMin = llCache; - } - if (lonMin > lonMax) { - llCache = lonMax; - lonMax = lonMin; - lonMin = llCache; - } - - StringBuilder where = new StringBuilder(); - where.append("latitude >= "); - where.append(String.format((Locale) null, "%.6f", latMin)); - where.append(" and latitude <= "); - where.append(String.format((Locale) null, "%.6f", latMax)); - where.append(" and longitude >= "); - where.append(String.format((Locale) null, "%.6f", lonMin)); - where.append(" and longitude <= "); - where.append(String.format((Locale) null, "%.6f", lonMax)); - - // cachetype limitation - if (cachetype != null) { - where.append(" and type = \""); - where.append(cachetype); - where.append('"'); - } - - // offline caches only - if (stored) { - where.append(" and reason >= 1"); - } - - try { - Cursor cursor = databaseRO.query( - dbTableCaches, - new String[] { "_id", "geocode" }, - where.toString(), - null, - null, - null, - null, - "500"); - - if (cursor != null) { - if (cursor.getCount() > 0) { - cursor.moveToFirst(); - int index = cursor.getColumnIndex("geocode"); - - do { - geocodes.add((String) cursor.getString(index)); - } while (cursor.moveToNext()); - } else { - cursor.close(); - return null; - } - - cursor.close(); - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.getOfflineInViewport: " + e.toString()); - } - - return geocodes; - } - - public List<String> getOfflineAll(String cachetype) { - init(); - - List<String> geocodes = new ArrayList<String>(); - - StringBuilder where = new StringBuilder(); - - // cachetype limitation - if (cachetype != null) { - where.append(cachetype); - where.append('"'); - } - - // offline caches only - if (where.length() > 0) { - where.append(" and "); - } - where.append("reason >= 1"); - - try { - Cursor cursor = databaseRO.query( - dbTableCaches, - new String[] { "_id", "geocode" }, - where.toString(), - null, - null, - null, - null, - "5000"); - - if (cursor != null) { - if (cursor.getCount() > 0) { - cursor.moveToFirst(); - int index = cursor.getColumnIndex("geocode"); - - do { - geocodes.add((String) cursor.getString(index)); - } while (cursor.moveToNext()); - } else { - cursor.close(); - return null; - } - - cursor.close(); - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.getOfflineAll: " + e.toString()); - } - - return geocodes; - } - - public void markStored(String geocode, int listId) { - if (StringUtils.isBlank(geocode)) { - return; - } - - init(); - - if (listId <= 0) { - listId = 1; - } - - ContentValues values = new ContentValues(); - values.put("reason", listId); - databaseRW.update(dbTableCaches, values, "geocode = ? and reason < 1", new String[] { geocode }); - } - - public boolean markDropped(String geocode) { - if (StringUtils.isBlank(geocode)) { - return false; - } - - init(); - - try { - ContentValues values = new ContentValues(); - values.put("reason", 0); - int rows = databaseRW.update(dbTableCaches, values, "geocode = ?", new String[] { geocode }); - - if (rows > 0) { - return true; - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.markDropped: " + e.toString()); - } - - return false; - } - - public boolean markFound(String geocode) { - if (StringUtils.isBlank(geocode)) { - return false; - } - - init(); - - try { - ContentValues values = new ContentValues(); - values.put("found", 1); - int rows = databaseRW.update(dbTableCaches, values, "geocode = ?", new String[] { geocode }); - - if (rows > 0) { - return true; - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.markFound: " + e.toString()); - } - - return false; - } - - public void clean() { - clean(false); - } - - public void clean(boolean more) { - init(); - - Log.d(cgSettings.tag, "Database clean: started"); - - Cursor cursor = null; - List<String> geocodes = new ArrayList<String>(); - - try { - if (more) { - cursor = databaseRO.query( - dbTableCaches, - new String[] { "_id", "geocode" }, - "reason = 0", - null, - null, - null, - null, - null); - } else { - cursor = databaseRO.query( - dbTableCaches, - new String[] { "_id", "geocode" }, - "reason = 0 and detailed < " + (System.currentTimeMillis() - (3 * 24 * 60 * 60 * 1000)) + " and detailedupdate < " + (System.currentTimeMillis() - (3 * 24 * 60 * 60 * 1000)) + " and visiteddate < " + (System.currentTimeMillis() - (3 * 24 * 60 * 60 * 1000)), - null, - null, - null, - null, - null); - } - - if (cursor != null) { - if (cursor.getCount() > 0) { - cursor.moveToFirst(); - int index = cursor.getColumnIndex("geocode"); - - do { - geocodes.add("\"" + (String) cursor.getString(index) + "\""); - } while (cursor.moveToNext()); - } - - cursor.close(); - } - - final int size = geocodes.size(); - if (size > 0) { - Log.d(cgSettings.tag, "Database clean: removing " + size + " geocaches"); - - String geocodeList = cgBase.implode(", ", geocodes.toArray()); - databaseRW.execSQL("delete from " + dbTableCaches + " where geocode in (" + geocodeList + ")"); - databaseRW.execSQL("delete from " + dbTableAttributes + " where geocode in (" + geocodeList + ")"); - databaseRW.execSQL("delete from " + dbTableSpoilers + " where geocode in (" + geocodeList + ")"); - databaseRW.execSQL("delete from " + dbTableLogs + " where geocode in (" + geocodeList + ")"); - databaseRW.execSQL("delete from " + dbTableLogCount + " where geocode in (" + geocodeList + ")"); - databaseRW.execSQL("delete from " + dbTableLogsOffline + " where geocode in (" + geocodeList + ")"); - databaseRW.execSQL("delete from " + dbTableWaypoints + " where geocode in (" + geocodeList + ") and type <> \"own\""); - databaseRW.execSQL("delete from " + dbTableTrackables + " where geocode in (" + geocodeList + ")"); - - geocodes.clear(); - } - - databaseRW.execSQL("delete from " + dbTableCaches + " where geocode = \"\""); - - if (Log.isLoggable(cgSettings.tag, Log.DEBUG)) { - final SQLiteStatement countSql = databaseRO.compileStatement("select count(_id) from " + dbTableCaches + " where reason = 0"); - final int count = (int) countSql.simpleQueryForLong(); - countSql.close(); - Log.d(cgSettings.tag, "Database clean: " + count + " cached geocaches remaining"); - } - } catch (Exception e) { - Log.w(cgSettings.tag, "cgData.clean: " + e.toString()); - } - - Log.d(cgSettings.tag, "Database clean: finished"); - } - - public void dropStored(int listId) { - init(); - - List<String> geocodes = new ArrayList<String>(); - - try { - Cursor cursor = databaseRO.query( - dbTableCaches, - new String[] { "_id", "geocode" }, - "reason = " + listId, - null, - null, - null, - null, - null); - - if (cursor != null) { - if (cursor.getCount() > 0) { - cursor.moveToFirst(); - int index = cursor.getColumnIndex("geocode"); - - do { - geocodes.add("\"" + (String) cursor.getString(index) + "\""); - } while (cursor.moveToNext()); - } else { - cursor.close(); - return; - } - - cursor.close(); - } - - if (CollectionUtils.isNotEmpty(geocodes)) { - String geocodeList = cgBase.implode(", ", geocodes.toArray()); - databaseRW.execSQL("delete from " + dbTableCaches + " where geocode in (" + geocodeList + ")"); - databaseRW.execSQL("delete from " + dbTableAttributes + " where geocode in (" + geocodeList + ")"); - databaseRW.execSQL("delete from " + dbTableSpoilers + " where geocode in (" + geocodeList + ")"); - databaseRW.execSQL("delete from " + dbTableLogs + " where geocode in (" + geocodeList + ")"); - databaseRW.execSQL("delete from " + dbTableLogCount + " where geocode in (" + geocodeList + ")"); - databaseRW.execSQL("delete from " + dbTableLogsOffline + " where geocode in (" + geocodeList + ")"); - databaseRW.execSQL("delete from " + dbTableWaypoints + " where geocode in (" + geocodeList + ") and type <> \"own\""); - databaseRW.execSQL("delete from " + dbTableTrackables + " where geocode in (" + geocodeList + ")"); - - geocodes.clear(); - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.dropStored: " + e.toString()); - } - } - - public boolean saveLogOffline(String geocode, Date date, int type, String log) { - if (StringUtils.isBlank(geocode)) { - return false; - } - if (type <= 0 && StringUtils.isBlank(log)) { - return false; - } - - boolean status = false; - - ContentValues values = new ContentValues(); - values.put("geocode", geocode); - values.put("updated", System.currentTimeMillis()); - values.put("type", type); - values.put("log", log); - values.put("date", date.getTime()); - - try { - if (hasLogOffline(geocode)) { - final int rows = databaseRW.update(dbTableLogsOffline, values, "geocode = ?", new String[] { geocode }); - - if (rows > 0) { - status = true; - } - } else { - final long id = databaseRW.insert(dbTableLogsOffline, null, values); - - if (id > 0) { - status = true; - } - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.saveLogOffline: " + e.toString()); - } - - return status; - } - - public cgLog loadLogOffline(String geocode) { - if (StringUtils.isBlank(geocode)) { - return null; - } - - init(); - - cgLog log = null; - - Cursor cursor = databaseRO.query( - dbTableLogsOffline, - new String[] { "_id", "type", "log", "date" }, - "geocode = \"" + geocode + "\"", - null, - null, - null, - "_id desc", - "1"); - - if (cursor != null && cursor.getCount() > 0) { - cursor.moveToFirst(); - - log = new cgLog(); - log.id = (int) cursor.getInt(cursor.getColumnIndex("_id")); - log.type = (int) cursor.getInt(cursor.getColumnIndex("type")); - log.log = (String) cursor.getString(cursor.getColumnIndex("log")); - log.date = (long) cursor.getLong(cursor.getColumnIndex("date")); - } - - if (cursor != null) { - cursor.close(); - } - - return log; - } - - public void clearLogOffline(String geocode) { - if (StringUtils.isBlank(geocode)) { - return; - } - - init(); - - databaseRW.delete(dbTableLogsOffline, "geocode = ?", new String[] { geocode }); - } - - public boolean hasLogOffline(String geocode) { - if (StringUtils.isBlank(geocode)) { - return false; - } - - int count = 0; - init(); - try { - final SQLiteStatement countSql = databaseRO.compileStatement("select count(_id) from " + dbTableLogsOffline + " where geocode = \"" + geocode.toUpperCase() + "\""); - count = (int) countSql.simpleQueryForLong(); - - countSql.close(); - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.hasLogOffline: " + e.toString()); - } - - return count > 0; - } - - public void saveVisitDate(String geocode) { - if (StringUtils.isBlank(geocode)) { - return; - } - - ContentValues values = new ContentValues(); - values.put("visiteddate", System.currentTimeMillis()); - - try { - databaseRW.update(dbTableCaches, values, "geocode = ?", new String[] { geocode }); - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.saveVisitDate: " + e.toString()); - } - } - - public void clearVisitDate(String geocode) { - if (StringUtils.isBlank(geocode)) { - return; - } - - ContentValues values = new ContentValues(); - values.put("visiteddate", 0); - - try { - databaseRW.update(dbTableCaches, values, "geocode = ?", new String[] { geocode }); - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.clearVisitDate: " + e.toString()); - } - } - - public List<cgList> getLists(Resources res) { - init(); - - List<cgList> lists = new ArrayList<cgList>(); - - lists.add(new cgList(true, 1, res.getString(R.string.list_inbox))); - // lists.add(new cgList(true, 2, res.getString(R.string.list_wpt))); - - ArrayList<cgList> storedLists = readLists(null, "title COLLATE NOCASE ASC"); - lists.addAll(storedLists); - - return lists; - } - - private ArrayList<cgList> readLists(String selection, String sorting) { - ArrayList<cgList> result = new ArrayList<cgList>(); - try { - Cursor cursor = databaseRO.query( - dbTableLists, - new String[] { "_id", "title", "updated", "latitude", "longitude" }, - selection, - null, - null, - null, - sorting); - - if (cursor != null) { - if (cursor.getCount() > 0) { - cursor.moveToFirst(); - int indexId = cursor.getColumnIndex("_id"); - int indexTitle = cursor.getColumnIndex("title"); - int indexUpdated = cursor.getColumnIndex("updated"); - int indexLatitude = cursor.getColumnIndex("latitude"); - int indexLongitude = cursor.getColumnIndex("longitude"); - - do { - cgList list = new cgList(false); - - list.id = ((int) cursor.getInt(indexId)) + 10; - list.title = (String) cursor.getString(indexTitle); - list.updated = (Long) cursor.getLong(indexUpdated); - list.coords = getCoords(cursor, indexLatitude, indexLongitude); - - result.add(list); - } while (cursor.moveToNext()); - } - - cursor.close(); - } - } catch (Exception e) { - Log.e(cgSettings.tag, "cgData.readLists: " + e.toString()); - } - return result; - } - - public cgList getList(int id, Resources res) { - if (id == 1) { - return new cgList(true, 1, res.getString(R.string.list_inbox)); - } else if (id == 2) { - return new cgList(true, 2, res.getString(R.string.list_wpt)); - } else if (id >= 10) { - init(); - - ArrayList<cgList> lists = readLists("_id = " + (id - 10), null); - if (!lists.isEmpty()) { - return lists.get(0); - } - } - - return null; - } - - public int createList(String name) { - int id = -1; - if (StringUtils.isBlank(name)) { - return id; - } - - init(); - - databaseRW.beginTransaction(); - try { - ContentValues values = new ContentValues(); - values.put("title", name); - values.put("updated", System.currentTimeMillis()); - - id = (int) databaseRW.insert(dbTableLists, null, values); - databaseRW.setTransactionSuccessful(); - } finally { - databaseRW.endTransaction(); - } - - if (id < 0) { - return -1; - } else { - return (id + 10); - } - } - - public boolean removeList(int id) { - boolean status = false; - if (id < 10) { - return status; - } - - init(); - - databaseRW.beginTransaction(); - try { - int cnt = databaseRW.delete(dbTableLists, "_id = " + (id - 10), null); - - if (cnt > 0) { - ContentValues values = new ContentValues(); - values.put("reason", 1); - databaseRW.update(dbTableCaches, values, "reason = " + id, null); - - status = true; - } - - databaseRW.setTransactionSuccessful(); - } finally { - databaseRW.endTransaction(); - } - - return status; - } - - public void moveToList(String geocode, int listId) { - if (StringUtils.isBlank(geocode) || listId <= 0) { - return; - } - - databaseRW.beginTransaction(); - try { - ContentValues values = new ContentValues(); - values.put("reason", listId); - databaseRW.update(dbTableCaches, values, "geocode = ?", new String[] { geocode }); - - databaseRW.setTransactionSuccessful(); - } finally { - databaseRW.endTransaction(); - } - } - - public synchronized boolean status() { - if (databaseRO == null || databaseRW == null || initialized == false) { - return false; - } - - return true; - } - - public boolean removeSearchedDestination(cgDestination destination) { - boolean success = true; - if (destination == null) { - success = false; - } else { - init(); - - databaseRW.beginTransaction(); - - try { - databaseRW.delete(dbTableSearchDestionationHistory, "_id = " + destination.getId(), null); - databaseRW.setTransactionSuccessful(); - } catch (Exception e) { - Log.e(cgSettings.tag, "Unable to remove searched destination", e); - success = false; - } finally { - databaseRW.endTransaction(); - } - } - - return success; - } -} |
