Catch the no such column error in one other place, refactor

pull/14/head
Sam Bosley 13 years ago
parent da6dda9181
commit b2f235b56f

@ -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<Task> taskPusher = new PushQueuedArgs<Task>() {
@Override
public Task getRemoteModelInstance(TodorooCursor<Task> cursor) {
@ -349,12 +354,20 @@ public class ActFmSyncV2Provider extends SyncV2Provider {
private void pushQueuedTasks(final SyncResultCallback callback,
final AtomicInteger finisher) {
TodorooCursor<Task> taskCursor = taskService.query(Query.select(Task.PROPERTIES).
TodorooCursor<Task> 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 {

@ -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<Task> 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();

@ -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

Loading…
Cancel
Save