Skip to content
This repository has been archived by the owner on May 14, 2022. It is now read-only.

Commit

Permalink
Fix for random crashes noted in issue #289 due to the way Realm was b…
Browse files Browse the repository at this point in the history
…een used.
  • Loading branch information
Pogman committed Nov 27, 2020
1 parent 3b43f3f commit 4b55e73
Show file tree
Hide file tree
Showing 8 changed files with 403 additions and 417 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ private class DBitem {
}

// records as requested for a sender and ready for uploading / processing
// use as part of a open history realm transaction
public List<PumpHistoryInterface> getSenderRecordsREQ(String senderID) {

PumpHistorySender.Sender sender = pumpHistorySender.getSender(senderID);
Expand Down Expand Up @@ -205,100 +206,85 @@ public int compare(PumpHistoryInterface record1, PumpHistoryInterface record2)
}

// post uploading / processing, clear the request and acknowledge
public void setSenderRecordsACK(final List<PumpHistoryInterface> records, final String senderID) {
historyRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(@NonNull Realm realm) {

for (PumpHistoryInterface record : records) {
record.setSenderREQ(record.getSenderREQ().replace(senderID, ""));
record.setSenderACK(record.getSenderACK().replace(senderID, "").concat(senderID));
}

}
});
// use as part of a open history realm transaction
public void setSenderRecordACK(List<PumpHistoryInterface> records, final String senderID) {
for (PumpHistoryInterface record : records) {
record.setSenderREQ(record.getSenderREQ().replace(senderID, ""));
record.setSenderACK(record.getSenderACK().replace(senderID, "").concat(senderID));
}
}

public void setSenderRecordACK(final PumpHistoryInterface record, final String senderID) {
historyRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(@NonNull Realm realm) {

record.setSenderREQ(record.getSenderREQ().replace(senderID, ""));
record.setSenderACK(record.getSenderACK().replace(senderID, "").concat(senderID));

}
});
public void setSenderRecordACK(PumpHistoryInterface record, final String senderID) {
record.setSenderREQ(record.getSenderREQ().replace(senderID, ""));
record.setSenderACK(record.getSenderACK().replace(senderID, "").concat(senderID));
}

public void processSenderTTL(final String senderID) {

long now = System.currentTimeMillis();

PumpHistorySender.Sender sender = pumpHistorySender.getSender(senderID);
historyRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(@NonNull Realm realm) {

List<Pair<String, Long>> ttl = sender.getTtl();
long now = System.currentTimeMillis();

final List<PumpHistoryInterface> recordsToDelete = new ArrayList<>();
final List<PumpHistoryInterface> recordsToUndelete = new ArrayList<>();
PumpHistorySender.Sender sender = pumpHistorySender.getSender(senderID);

RealmResults<PumpHistoryInterface> resultsToDelete;
RealmResults<PumpHistoryInterface> resultsToUndelete;
List<Pair<String, Long>> ttl = sender.getTtl();

for (DBitem dBitem : historyDB) {
final List<PumpHistoryInterface> recordsToDelete = new ArrayList<>();
final List<PumpHistoryInterface> recordsToUndelete = new ArrayList<>();

for (Pair<String, Long>ttlItem : ttl) {
RealmResults<PumpHistoryInterface> resultsToDelete;
RealmResults<PumpHistoryInterface> resultsToUndelete;

if (dBitem.historydb.equals(ttlItem.first)) {
for (DBitem dBitem : historyDB) {

Date ttlDate = new Date(now - ttlItem.second);
for (Pair<String, Long>ttlItem : ttl) {

// tag records for deletion (helps keep NS history clean)
resultsToDelete = dBitem.results.where()
.lessThan("eventDate", ttlDate)
.beginGroup()
.contains("senderREQ", senderID)
.or()
.contains("senderACK", senderID)
.endGroup()
.not()
.contains("senderDEL", senderID)
.findAll();
if (dBitem.historydb.equals(ttlItem.first)) {

recordsToDelete.addAll(resultsToDelete);
Date ttlDate = new Date(now - ttlItem.second);

// ttl date changed? recover already deleted records (resend to NS)
resultsToUndelete = dBitem.results.where()
.greaterThanOrEqualTo("eventDate", ttlDate)
.contains("senderDEL", senderID)
.findAll();
// tag records for deletion (helps keep NS history clean)
resultsToDelete = dBitem.results.where()
.lessThan("eventDate", ttlDate)
.beginGroup()
.contains("senderREQ", senderID)
.or()
.contains("senderACK", senderID)
.endGroup()
.not()
.contains("senderDEL", senderID)
.findAll();

recordsToUndelete.addAll(resultsToUndelete);
recordsToDelete.addAll(resultsToDelete);

Log.d(TAG, String.format("sender[%s] db: %s ttldate: %s delete: %s undelete: %s",
senderID, ttlItem.first, dateFormatter.format(ttlDate), resultsToDelete.size(), resultsToUndelete.size()));
}
}
}
// ttl date changed? recover already deleted records (resend to NS)
resultsToUndelete = dBitem.results.where()
.greaterThanOrEqualTo("eventDate", ttlDate)
.contains("senderDEL", senderID)
.findAll();

if (recordsToDelete.size() > 0 || recordsToUndelete.size() > 0) {
historyRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(@NonNull Realm realm) {
recordsToUndelete.addAll(resultsToUndelete);

for (PumpHistoryInterface record : recordsToDelete) {
record.setSenderREQ(record.getSenderREQ().replace(senderID, "").concat(senderID));
record.setSenderDEL(record.getSenderDEL().replace(senderID, "").concat(senderID));
Log.d(TAG, String.format("sender[%s] db: %s ttldate: %s delete: %s undelete: %s",
senderID, ttlItem.first, dateFormatter.format(ttlDate), resultsToDelete.size(), resultsToUndelete.size()));
}
}
}

for (PumpHistoryInterface record : recordsToUndelete) {
record.setSenderREQ(record.getSenderREQ().replace(senderID, "").concat(senderID));
record.setSenderDEL(record.getSenderDEL().replace(senderID, ""));
}
for (PumpHistoryInterface record : recordsToDelete) {
record.setSenderREQ(record.getSenderREQ().replace(senderID, "").concat(senderID));
record.setSenderDEL(record.getSenderDEL().replace(senderID, "").concat(senderID));
}

for (PumpHistoryInterface record : recordsToUndelete) {
record.setSenderREQ(record.getSenderREQ().replace(senderID, "").concat(senderID));
record.setSenderDEL(record.getSenderDEL().replace(senderID, ""));
}
});
}

}
});

}

Expand Down Expand Up @@ -962,7 +948,6 @@ public class Estimate {
private boolean optUserlog = false;

private List<PumpHistoryCGM> updateRecords = new ArrayList();
private List<Integer> updateSgv = new ArrayList();

private int processRTC;

Expand Down Expand Up @@ -1121,18 +1106,10 @@ else if (optErr)
historyRealm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(@NonNull Realm realm) {

for (int i = 0; i < updateRecords.size(); i++) {
PumpHistoryCGM record = updateRecords.get(i);
record.setSgv(updateSgv.get(i));
record.setEstimate(true);
pumpHistorySender.setSenderREQ(record);
}

realm.copyToRealmOrUpdate(updateRecords);
}
});
updateRecords.clear();
updateSgv.clear();
}
}
}
Expand Down Expand Up @@ -1247,8 +1224,11 @@ private boolean process(
Log.d(TAG, "record outside calibration period, no estimated sgv available");
}

updateRecords.add(unprocessedCgmRecords.first());
updateSgv.add(0);
PumpHistoryCGM record = historyRealm.copyFromRealm(unprocessedCgmRecords.first());
record.setSgv(0);
record.setEstimate(true);
pumpHistorySender.setSenderREQ(record);
updateRecords.add(record);

return false;
}
Expand Down Expand Up @@ -1393,8 +1373,11 @@ else if (PumpHistoryParser.CGM_EXCEPTION.SENSOR_END_OF_LIFE == ex)
if (!est && sgv == 0) {
int finalEstimate = (int) Math.round(estsgv);

updateRecords.add(calCgmRecords.get(i));
updateSgv.add(finalEstimate);
PumpHistoryCGM record = historyRealm.copyFromRealm(calCgmRecords.get(i));
record.setSgv(finalEstimate);
record.setEstimate(true);
pumpHistorySender.setSenderREQ(record);
updateRecords.add(record);

if (log >= 1) {
Log.d(TAG, String.format("Final Estimate %s(%s) isig=%s vctr=%s t+%s f=%s o=%s x=%s ex=%s",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import info.nightscout.android.history.HistoryUtils;
import info.nightscout.android.history.MessageItem;
Expand All @@ -15,6 +16,7 @@
import io.realm.RealmObject;
import io.realm.annotations.Ignore;
import io.realm.annotations.Index;
import io.realm.annotations.PrimaryKey;

/**
* Created by Pogman on 19.10.17.
Expand All @@ -24,6 +26,9 @@ public class PumpHistoryCGM extends RealmObject implements PumpHistoryInterface
@Ignore
private static final String TAG = PumpHistoryCGM.class.getSimpleName();

@PrimaryKey
private String uuid;

@Index
private String senderREQ = "";
@Index
Expand Down Expand Up @@ -155,7 +160,7 @@ public static void cgmFromHistory(

if (record == null) {
// create new entry
record = realm.createObject(PumpHistoryCGM.class);
record = realm.createObject(PumpHistoryCGM.class, UUID.randomUUID().toString());
record.pumpMAC = pumpMAC;
record.key = HistoryUtils.key("CGM", eventRTC);
record.history = true;
Expand Down Expand Up @@ -210,7 +215,7 @@ public static void cgmFromStatus(

if (record == null) {
// create new entry
record = realm.createObject(PumpHistoryCGM.class);
record = realm.createObject(PumpHistoryCGM.class, UUID.randomUUID().toString());
record.pumpMAC = pumpMAC;
record.key = HistoryUtils.key("CGM", eventRTC);
record.history = false;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
package info.nightscout.android.model.medtronicNg;

import java.util.Date;
import java.util.UUID;

import io.realm.RealmObject;
import io.realm.annotations.Index;
import io.realm.annotations.PrimaryKey;

/**
* Created by lgoedhart on 4/06/2016.
*/
public class PumpStatusEvent extends RealmObject {
@PrimaryKey
private String uuid;

@Index
private Date eventDate; // The actual time (uploader) of the this event (pumptime event date)
@Index
Expand Down Expand Up @@ -108,6 +113,7 @@ public class PumpStatusEvent extends RealmObject {
private boolean uploaded;

public PumpStatusEvent() {
this.uuid = UUID.randomUUID().toString();
this.eventDate = new Date();
}

Expand Down
Loading

0 comments on commit 4b55e73

Please sign in to comment.