Prevent duplicate send operations

pull/185/head
M66B 5 years ago
parent 9100d086a5
commit 33581e907f

@ -113,6 +113,9 @@ public interface DaoOperation {
@Query("SELECT * FROM operation WHERE id = :id")
EntityOperation getOperation(long id);
@Query("SELECT * FROM operation WHERE message = :message AND name = :name")
EntityOperation getOperation(long message, String name);
@Query("SELECT * FROM operation WHERE error IS NOT NULL")
List<EntityOperation> getOperationsError();
@ -149,9 +152,4 @@ public interface DaoOperation {
@Query("DELETE FROM operation WHERE id = :id")
int deleteOperation(long id);
@Query("DELETE FROM operation" +
" WHERE folder = :folder" +
" AND state <> 'executing'")
int deletePendingOperations(long folder);
}

@ -436,27 +436,34 @@ public class ServiceSend extends ServiceBase implements SharedPreferences.OnShar
}
private void onSync(EntityFolder outbox) {
DB db = DB.getInstance(this);
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
DB db = DB.getInstance(this);
try {
db.beginTransaction();
db.folder().setFolderError(outbox.id, null);
// Delete pending operations
db.operation().deletePendingOperations(outbox.id);
// Requeue operations
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Requeue non executing operations
for (long id : db.message().getMessageByFolder(outbox.id)) {
EntityMessage message = db.message().getMessage(id);
if (message != null) {
nm.cancel("send:" + message.id, 1);
if (message.ui_snoozed == null)
EntityOperation.queue(this, message, EntityOperation.SEND);
else
EntityMessage.snooze(this, message.id, message.ui_snoozed);
if (message == null)
continue;
EntityOperation op = db.operation().getOperation(message.id, EntityOperation.SEND);
if (op != null) {
if ("executing".equals(op.state))
continue;
db.operation().deleteOperation(op.id);
}
db.message().setMessageError(message.id, null);
nm.cancel("send:" + message.id, 1);
if (message.ui_snoozed == null)
EntityOperation.queue(this, message, EntityOperation.SEND);
else
EntityMessage.snooze(this, message.id, message.ui_snoozed);
}
db.setTransactionSuccessful();

Loading…
Cancel
Save