diff --git a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java index 47b8aa222f..17ee574678 100644 --- a/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java +++ b/app/src/main/java/info/nightscout/androidaps/db/DatabaseHelper.java @@ -39,6 +39,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { public static final String DATABASE_TEMPTARGETS = "TempTargets"; public static final String DATABASE_TREATMENTS = "Treatments"; public static final String DATABASE_DANARHISTORY = "DanaRHistory"; + public static final String DATABASE_DBREQUESTS = "DBRequests"; private static final int DATABASE_VERSION = 5; @@ -62,6 +63,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { TableUtils.createTableIfNotExists(connectionSource, Treatment.class); TableUtils.createTableIfNotExists(connectionSource, BgReading.class); TableUtils.createTableIfNotExists(connectionSource, DanaRHistoryRecord.class); + TableUtils.createTableIfNotExists(connectionSource, DbRequest.class); } catch (SQLException e) { log.error("Can't create database", e); throw new RuntimeException(e); @@ -77,6 +79,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { TableUtils.dropTable(connectionSource, Treatment.class, true); TableUtils.dropTable(connectionSource, BgReading.class, true); TableUtils.dropTable(connectionSource, DanaRHistoryRecord.class, true); + TableUtils.dropTable(connectionSource, DbRequest.class, true); onCreate(database, connectionSource); } catch (SQLException e) { log.error("Can't drop databases", e); @@ -122,6 +125,7 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { TableUtils.dropTable(connectionSource, Treatment.class, true); TableUtils.dropTable(connectionSource, BgReading.class, true); TableUtils.dropTable(connectionSource, DanaRHistoryRecord.class, true); + //DbRequests can be cleared from NSClient fragment TableUtils.createTableIfNotExists(connectionSource, TempBasal.class); TableUtils.createTableIfNotExists(connectionSource, TempTarget.class); TableUtils.createTableIfNotExists(connectionSource, Treatment.class); @@ -172,6 +176,14 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { return getDao(DanaRHistoryRecord.class); } + public Dao getDaoDbRequest() throws SQLException { + return getDao(DbRequest.class); + } + + public long size(String database) { + return DatabaseUtils.queryNumEntries(getReadableDatabase(), database); + } + public List getBgreadingsDataFromTime(long mills, boolean ascending) { try { Dao daoBgreadings = getDaoBgReadings(); @@ -189,6 +201,62 @@ public class DatabaseHelper extends OrmLiteSqliteOpenHelper { return new ArrayList(); } + // DbRequests handling + + public void create(DbRequest dbr) { + try { + getDaoDbRequest().create(dbr); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public int delete(DbRequest dbr) { + try { + return getDaoDbRequest().delete(dbr); + } catch (SQLException e) { + e.printStackTrace(); + } + return 0; + } + + public int deleteDbRequest(String nsClientId) { + try { + return getDaoDbRequest().deleteById(nsClientId); + } catch (SQLException e) { + e.printStackTrace(); + } + return 0; + } + + public int deleteDbRequestbyMongoId(String action, String id) { + try { + QueryBuilder queryBuilder = getDaoDbRequest().queryBuilder(); + Where where = queryBuilder.where(); + where.eq("_id", id).and().eq("action", action); + queryBuilder.limit(10L); + PreparedQuery preparedQuery = queryBuilder.prepare(); + List dbList = getDaoDbRequest().query(preparedQuery); + if (dbList.size() != 1) { + log.error("deleteDbRequestbyMongoId query size: " + dbList.size()); + } else { + //log.debug("Treatment findTreatmentById found: " + trList.get(0).log()); + return delete(dbList.get(0)); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return 0; + } + + public void deleteAllDbRequests() { + try { + TableUtils.clearTable(connectionSource, DbRequest.class); + } catch (SQLException e) { + e.printStackTrace(); + } + } + // TREATMENT HANDLING public boolean isDataUnchanged(long time) { diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbRequest.java b/app/src/main/java/info/nightscout/androidaps/db/DbRequest.java similarity index 73% rename from app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbRequest.java rename to app/src/main/java/info/nightscout/androidaps/db/DbRequest.java index ed7de35f49..0ecc5d4f32 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/data/DbRequest.java +++ b/app/src/main/java/info/nightscout/androidaps/db/DbRequest.java @@ -1,23 +1,47 @@ -package info.nightscout.androidaps.plugins.NSClientInternal.data; +package info.nightscout.androidaps.db; import com.google.common.base.Charsets; import com.google.common.hash.Hashing; +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; import org.json.JSONException; import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Created by mike on 27.02.2016. *

* Allowed actions "dbAdd" || "dbUpdate" || "dbUpdateUnset" || "dbRemove" */ +@DatabaseTable(tableName = DatabaseHelper.DATABASE_DBREQUESTS) public class DbRequest { - public String action = null; - public String collection = null; - public JSONObject data = null; - public String _id = null; + private static Logger log = LoggerFactory.getLogger(DbRequest.class); + + public String getNsClientID() { + return nsClientID; + } + + public void setNsClientID(String nsClientID) { + this.nsClientID = nsClientID; + } + + @DatabaseField(id = true, useGetSet = true) public String nsClientID = null; + @DatabaseField + public String action = null; + + @DatabaseField + public String collection = null; + + @DatabaseField + public String data = null; + + @DatabaseField + public String _id = null; + public DbRequest() { } @@ -25,7 +49,7 @@ public class DbRequest { public DbRequest(String action, String collection, String nsClientID, JSONObject data) { this.action = action; this.collection = collection; - this.data = data; + this.data = data.toString(); this.nsClientID = nsClientID; this._id = ""; } @@ -34,7 +58,7 @@ public class DbRequest { public DbRequest(String action, String collection, String nsClientID, String _id, JSONObject data) { this.action = action; this.collection = collection; - this.data = data; + this.data = data.toString(); this.nsClientID = nsClientID; this._id = _id; } @@ -43,7 +67,7 @@ public class DbRequest { public DbRequest(String action, String collection, String nsClientID, String _id) { this.action = action; this.collection = collection; - this.data = new JSONObject(); + this.data = new JSONObject().toString(); this.nsClientID = nsClientID; this._id = _id; } @@ -57,7 +81,7 @@ public class DbRequest { try { object.put("action", action); object.put("collection", collection); - object.put("data", data); + object.put("data", new JSONObject(data)); if (_id != null) object.put("_id", _id); if (nsClientID != null) object.put("nsClientID", nsClientID); } catch (JSONException e) { @@ -74,7 +98,7 @@ public class DbRequest { if (jsonObject.has("collection")) result.collection = jsonObject.getString("collection"); if (jsonObject.has("data")) - result.data = jsonObject.getJSONObject("data"); + result.data = jsonObject.getJSONObject("data").toString(); if (jsonObject.has("_id")) result._id = jsonObject.getString("_id"); if (jsonObject.has("nsClientID")) diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalFragment.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalFragment.java index 42ddcc9ba8..65d095c75f 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalFragment.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/NSClientInternalFragment.java @@ -106,7 +106,7 @@ public class NSClientInternalFragment extends Fragment implements FragmentBase, getPlugin().clearLog(); break; case R.id.nsclientinternal_clearqueue: - getPlugin().queue().reset(); + getPlugin().queue().clearQueue(); break; case R.id.nsclientinternal_showqueue: MainApp.bus().post(new EventNSClientNewLog("QUEUE", getPlugin().queue().textList())); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/UploadQueue.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/UploadQueue.java index ded00ffb85..f6f44e7a5d 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/UploadQueue.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/UploadQueue.java @@ -1,7 +1,6 @@ package info.nightscout.androidaps.plugins.NSClientInternal; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; +import com.j256.ormlite.dao.CloseableIterator; import org.json.JSONArray; import org.json.JSONException; @@ -9,13 +8,14 @@ import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.sql.SQLException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import info.nightscout.androidaps.MainApp; -import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastQueueStatus; -import info.nightscout.androidaps.plugins.NSClientInternal.data.DbRequest; +import info.nightscout.androidaps.db.DatabaseHelper; +import info.nightscout.androidaps.db.DbRequest; import info.nightscout.androidaps.plugins.NSClientInternal.services.NSClientService; import info.nightscout.utils.SP; @@ -25,37 +25,30 @@ import info.nightscout.utils.SP; public class UploadQueue { private static Logger log = LoggerFactory.getLogger(UploadQueue.class); - public static HashMap queue = null; - - public UploadQueue() { - loadMap(); - } - public static String status() { - return "QUEUE: " + queue.size(); + return "QUEUE: " + MainApp.getDbHelper().size(DatabaseHelper.DATABASE_DBREQUESTS); } - public static int size() { - return queue.size(); + public static long size() { + return MainApp.getDbHelper().size(DatabaseHelper.DATABASE_DBREQUESTS); } public static void add(final DbRequest dbr) { NSClientService.handler.post(new Runnable() { @Override public void run() { - log.debug("QUEUE adding: " + dbr.data.toString()); - queue.put(dbr.hash(), dbr); - saveMap(); + log.debug("QUEUE adding: " + dbr.data); + MainApp.getDbHelper().create(dbr); } }); } - public static void reset() { + public static void clearQueue() { NSClientService.handler.post(new Runnable() { @Override public void run() { - log.debug("QUEUE Reset"); - queue.clear(); + log.debug("QUEUE ClearQueue"); + MainApp.getDbHelper().deleteAllDbRequests(); log.debug(status()); } }); @@ -66,31 +59,18 @@ public class UploadQueue { @Override public void run() { try { - long id = -1L; + String id; if (record.has("NSCLIENT_ID")) { - id = record.getLong("NSCLIENT_ID"); + id = record.getString("NSCLIENT_ID"); } else { return; } - Iterator> iter = queue.entrySet().iterator(); - while (iter.hasNext()) { - DbRequest dbr = iter.next().getValue(); - JSONObject data = dbr.data; - long nsclientId = -1; - if (data.has("NSCLIENT_ID")) { - nsclientId = data.getLong("NSCLIENT_ID"); - if (nsclientId == id) { - log.debug("Removing item from UploadQueue"); - iter.remove(); - log.debug(UploadQueue.status()); - return; - } - } + if (MainApp.getDbHelper().deleteDbRequest(id) == 1) { + log.debug("Removed item from UploadQueue. " + UploadQueue.status()); } } catch (JSONException e) { e.printStackTrace(); } - saveMap(); } }); } @@ -99,59 +79,29 @@ public class UploadQueue { NSClientService.handler.post(new Runnable() { @Override public void run() { - Iterator> iter = queue.entrySet().iterator(); - while (iter.hasNext()) { - DbRequest dbr = iter.next().getValue(); - if (dbr.action.equals(action) && dbr._id.equals(_id)) { - log.debug("Removing item from UploadQueue"); - iter.remove(); - return; - } else { - log.debug("Failed removing item from UploadQueue"); - } - } - saveMap(); + MainApp.getDbHelper().deleteDbRequestbyMongoId(action, _id); } }); } - final static String KEY = "UploadQueue"; - - private static void saveMap() { - JSONArray jsonArray = new JSONArray(); - Iterator> iter = queue.entrySet().iterator(); - while (iter.hasNext()) { - DbRequest dbr = iter.next().getValue(); - jsonArray.put(dbr.toJSON()); - } - SP.putString(KEY, jsonArray.toString()); - } - - private void loadMap() { - queue = new HashMap(); - try { - String jsonString = SP.getString(KEY, (new JSONArray()).toString()); - JSONArray jsonArray = new JSONArray(jsonString); - for (int i=0; i < jsonArray.length(); i++) { - JSONObject jsonObject = jsonArray.getJSONObject(i); - DbRequest dbr = DbRequest.fromJSON(jsonObject); - queue.put(dbr.hash(), dbr); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - public String textList() { - Iterator> iter = queue.entrySet().iterator(); String result = ""; - - while (iter.hasNext()) { - DbRequest dbr = iter.next().getValue(); - result += "
"; - result += dbr.action.toUpperCase() + " "; - result += dbr.collection + ": "; - result += dbr.data.toString(); + CloseableIterator iterator = null; + try { + iterator = MainApp.getDbHelper().getDaoDbRequest().closeableIterator(); + try { + while (iterator.hasNext()) { + DbRequest dbr = iterator.next(); + result += "
"; + result += dbr.action.toUpperCase() + " "; + result += dbr.collection + ": "; + result += dbr.data; + } + } finally { + iterator.close(); + } + } catch (SQLException e) { + e.printStackTrace(); } return result; } diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/receivers/DBAccessReceiver.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/receivers/DBAccessReceiver.java index 5f715ad78e..44c6587fb1 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/receivers/DBAccessReceiver.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/receivers/DBAccessReceiver.java @@ -17,7 +17,7 @@ import info.nightscout.androidaps.MainApp; import info.nightscout.androidaps.interfaces.PluginBase; import info.nightscout.androidaps.plugins.NSClientInternal.NSClientInternalPlugin; import info.nightscout.androidaps.plugins.NSClientInternal.UploadQueue; -import info.nightscout.androidaps.plugins.NSClientInternal.data.DbRequest; +import info.nightscout.androidaps.db.DbRequest; public class DBAccessReceiver extends BroadcastReceiver { private static Logger log = LoggerFactory.getLogger(DBAccessReceiver.class); diff --git a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java index 4b36061849..7cdab59fca 100644 --- a/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java +++ b/app/src/main/java/info/nightscout/androidaps/plugins/NSClientInternal/services/NSClientService.java @@ -13,6 +13,7 @@ import android.preference.PreferenceManager; import com.google.common.base.Charsets; import com.google.common.hash.Hashing; +import com.j256.ormlite.dao.CloseableIterator; import com.squareup.otto.Subscribe; import org.json.JSONArray; @@ -22,6 +23,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.URISyntaxException; +import java.sql.SQLException; import java.util.Date; import java.util.Iterator; import java.util.Map; @@ -47,7 +49,7 @@ import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastP import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastSgvs; import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastStatus; import info.nightscout.androidaps.plugins.NSClientInternal.broadcasts.BroadcastTreatment; -import info.nightscout.androidaps.plugins.NSClientInternal.data.DbRequest; +import info.nightscout.androidaps.db.DbRequest; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSCal; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSProfile; import info.nightscout.androidaps.plugins.NSClientInternal.data.NSSgv; @@ -518,7 +520,7 @@ public class NSClientService extends Service { JSONObject message = new JSONObject(); message.put("collection", dbr.collection); message.put("_id", dbr._id); - message.put("data", dbr.data); + message.put("data", new JSONObject(dbr.data)); mSocket.emit("dbUpdate", message, ack); MainApp.bus().post(new EventNSClientNewLog("DBUPDATE " + dbr.collection, "Sent " + dbr._id)); } catch (JSONException e) { @@ -532,7 +534,7 @@ public class NSClientService extends Service { JSONObject message = new JSONObject(); message.put("collection", dbr.collection); message.put("_id", dbr._id); - message.put("data", dbr.data); + message.put("data", new JSONObject(dbr.data)); mSocket.emit("dbUpdateUnset", message, ack); MainApp.bus().post(new EventNSClientNewLog("DBUPDATEUNSET " + dbr.collection, "Sent " + dbr._id)); } catch (JSONException e) { @@ -568,7 +570,7 @@ public class NSClientService extends Service { if (!isConnected || !hasWriteAuth) return; JSONObject message = new JSONObject(); message.put("collection", dbr.collection); - message.put("data", dbr.data); + message.put("data", new JSONObject(dbr.data)); mSocket.emit("dbAdd", message, ack); MainApp.bus().post(new EventNSClientNewLog("DBADD " + dbr.collection, "Sent " + dbr.nsClientID)); } catch (JSONException e) { @@ -632,7 +634,7 @@ public class NSClientService extends Service { } public void resend(final String reason) { - if (UploadQueue.queue.size() == 0) + if (UploadQueue.size() == 0) return; if (!isConnected || !hasWriteAuth) return; @@ -643,26 +645,35 @@ public class NSClientService extends Service { @Override public void run() { Logger log = LoggerFactory.getLogger(UploadQueue.class); - Iterator> iter = UploadQueue.queue.entrySet().iterator(); - if (mSocket == null || !mSocket.connected()) return; - while (iter.hasNext()) { - DbRequest dbr = iter.next().getValue(); - if (dbr.action.equals("dbAdd")) { - NSAddAck addAck = new NSAddAck(); - dbAdd(dbr, addAck); - } else if (dbr.action.equals("dbRemove")) { - NSUpdateAck removeAck = new NSUpdateAck(dbr.action, dbr._id); - dbRemove(dbr, removeAck); - } else if (dbr.action.equals("dbUpdate")) { - NSUpdateAck updateAck = new NSUpdateAck(dbr.action, dbr._id); - dbUpdate(dbr, updateAck); - } else if (dbr.action.equals("dbUpdateUnset")) { - NSUpdateAck updateUnsetAck = new NSUpdateAck(dbr.action, dbr._id); - dbUpdateUnset(dbr, updateUnsetAck); + CloseableIterator iterator = null; + try { + iterator = MainApp.getDbHelper().getDaoDbRequest().closeableIterator(); + try { + while (iterator.hasNext()) { + DbRequest dbr = iterator.next(); + if (dbr.action.equals("dbAdd")) { + NSAddAck addAck = new NSAddAck(); + dbAdd(dbr, addAck); + } else if (dbr.action.equals("dbRemove")) { + NSUpdateAck removeAck = new NSUpdateAck(dbr.action, dbr._id); + dbRemove(dbr, removeAck); + } else if (dbr.action.equals("dbUpdate")) { + NSUpdateAck updateAck = new NSUpdateAck(dbr.action, dbr._id); + dbUpdate(dbr, updateAck); + } else if (dbr.action.equals("dbUpdateUnset")) { + NSUpdateAck updateUnsetAck = new NSUpdateAck(dbr.action, dbr._id); + dbUpdateUnset(dbr, updateUnsetAck); + } + } + } finally { + iterator.close(); } + } catch (SQLException e) { + e.printStackTrace(); } + MainApp.bus().post(new EventNSClientNewLog("QUEUE", "Resend ended: " + reason)); } });