From b2f235b56f9a98ec06d8901b2193c926b92e95bc Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Tue, 25 Sep 2012 10:46:30 -0700 Subject: [PATCH] Catch the no such column error in one other place, refactor --- .../actfm/sync/ActFmSyncV2Provider.java | 17 ++++++++++++++-- .../astrid/backup/TasksXmlExporter.java | 18 +++-------------- .../src/com/todoroo/astrid/dao/Database.java | 20 +++++++++++++++++++ 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java index 92c970a16..cb727143c 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/ActFmSyncV2Provider.java @@ -14,6 +14,8 @@ import java.util.concurrent.atomic.AtomicInteger; import org.json.JSONException; import org.json.JSONObject; +import android.database.sqlite.SQLiteException; + import com.timsu.astrid.C2DMReceiver; import com.timsu.astrid.R; import com.todoroo.andlib.data.AbstractModel; @@ -26,6 +28,7 @@ import com.todoroo.andlib.sql.Join; import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.billing.BillingConstants; +import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.TaskDao.TaskCriteria; import com.todoroo.astrid.data.Metadata; @@ -59,6 +62,8 @@ public class ActFmSyncV2Provider extends SyncV2Provider { @Autowired MetadataService metadataService; + @Autowired Database database; + private final PushQueuedArgs taskPusher = new PushQueuedArgs() { @Override public Task getRemoteModelInstance(TodorooCursor cursor) { @@ -349,12 +354,20 @@ public class ActFmSyncV2Provider extends SyncV2Provider { private void pushQueuedTasks(final SyncResultCallback callback, final AtomicInteger finisher) { - TodorooCursor taskCursor = taskService.query(Query.select(Task.PROPERTIES). + TodorooCursor taskCursor; + Query query = Query.select(Task.PROPERTIES). where(Criterion.or( Criterion.and(TaskCriteria.isActive(), Task.REMOTE_ID.isNull()), Criterion.and(Task.REMOTE_ID.isNotNull(), - Task.MODIFICATION_DATE.gt(Task.LAST_SYNC))))); + Task.MODIFICATION_DATE.gt(Task.LAST_SYNC)))); + try { + taskCursor = taskService.query(query); + } catch (SQLiteException e) { + database.handleNoCommentsColumn(e); + taskCursor = taskService.query(query); + } + try { pushQueued(callback, finisher, taskCursor, true, taskPusher); } finally { diff --git a/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlExporter.java b/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlExporter.java index 3b7e33e6c..e90ea77d7 100644 --- a/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlExporter.java +++ b/astrid/plugin-src/com/todoroo/astrid/backup/TasksXmlExporter.java @@ -21,7 +21,6 @@ import android.util.Xml; import android.widget.Toast; import com.timsu.astrid.R; -import com.todoroo.andlib.data.AbstractDatabase; import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.Property; import com.todoroo.andlib.data.Property.PropertyVisitor; @@ -179,26 +178,15 @@ public class TasksXmlExporter { fos.close(); } - @SuppressWarnings("nls") private void serializeTasks() throws IOException { TodorooCursor cursor; try { cursor = taskService.query(Query.select( Task.PROPERTIES).orderBy(Order.asc(Task.ID))); } catch (SQLiteException e) { - String message = e.getMessage().toLowerCase(); - if (message.contains("no such column") && message.contains("tasks.commentCount")) { - try { - database.getDatabase().execSQL("ALTER TABLE " + Task.TABLE.name + " ADD " + - Task.COMMENT_COUNT.accept(new AbstractDatabase.SqlConstructorVisitor(), null) + " DEFAULT 0"); - } catch (SQLiteException e2) { - // Suppress, column creation failed. Just try the query again - } - cursor = taskService.query(Query.select( - Task.PROPERTIES).orderBy(Order.asc(Task.ID))); - } else { - throw e; - } + PluginServices.getDatabase().handleNoCommentsColumn(e); + cursor = taskService.query(Query.select( + Task.PROPERTIES).orderBy(Order.asc(Task.ID))); } try { Task task = new Task(); diff --git a/astrid/src/com/todoroo/astrid/dao/Database.java b/astrid/src/com/todoroo/astrid/dao/Database.java index f54d2068c..840c31e7f 100644 --- a/astrid/src/com/todoroo/astrid/dao/Database.java +++ b/astrid/src/com/todoroo/astrid/dao/Database.java @@ -335,6 +335,26 @@ public class Database extends AbstractDatabase { return false; } + /** + * Try to recover from an error that was getting thrown in several places. + * Seems a bad migration may have left some users without a comment count + * column in the tasks table + */ + public void handleNoCommentsColumn(SQLiteException e) { + String message = e.getMessage().toLowerCase(); + if (message.contains("no such column") && message.contains("tasks.commentCount")) { + try { + database.execSQL("ALTER TABLE " + Task.TABLE.name + " ADD " + + Task.COMMENT_COUNT.accept(new SqlConstructorVisitor(), null) + " DEFAULT 0"); + } catch (SQLiteException e2) { + // Rethrow the original exception so we know that some other unexpected error occurred + throw e; + } + } else { + throw e; + } + } + /** * Create table generation SQL * @param sql