From c8a0ca505a8ce9c862ecc6050b7d7d2871b3f350 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Wed, 3 Oct 2012 10:40:17 -0700 Subject: [PATCH] Try to create columns that crittercism claims are missing at startup time --- .../astrid/notes/EditNoteActivity.java | 2 +- .../src/com/todoroo/astrid/dao/Database.java | 14 ++++++++ .../astrid/service/StartupService.java | 33 +++++++++++++++---- .../ABTestEventReportingService.java | 4 ++- 4 files changed, 45 insertions(+), 8 deletions(-) diff --git a/astrid/plugin-src/com/todoroo/astrid/notes/EditNoteActivity.java b/astrid/plugin-src/com/todoroo/astrid/notes/EditNoteActivity.java index d34f814a3..1c6f17bff 100644 --- a/astrid/plugin-src/com/todoroo/astrid/notes/EditNoteActivity.java +++ b/astrid/plugin-src/com/todoroo/astrid/notes/EditNoteActivity.java @@ -139,7 +139,7 @@ public class EditNoteActivity extends LinearLayout implements TimerActionListene try { task = PluginServices.getTaskService().fetchById(t, Task.NOTES, Task.ID, Task.REMOTE_ID, Task.TITLE); } catch (SQLiteException e) { - StartupService.handleSQLiteColumnMissing(ContextManager.getContext(), e); + StartupService.handleSQLiteError(ContextManager.getContext(), e); } if(task == null) { return; diff --git a/astrid/src/com/todoroo/astrid/dao/Database.java b/astrid/src/com/todoroo/astrid/dao/Database.java index ca72d5758..95f431b11 100644 --- a/astrid/src/com/todoroo/astrid/dao/Database.java +++ b/astrid/src/com/todoroo/astrid/dao/Database.java @@ -6,6 +6,7 @@ package com.todoroo.astrid.dao; import android.database.sqlite.SQLiteException; +import android.text.TextUtils; import android.util.Log; import com.todoroo.andlib.data.AbstractDatabase; @@ -335,6 +336,19 @@ public class Database extends AbstractDatabase { return false; } + public void tryAddColumn(Table table, Property column, String defaultValue) { + try { + SqlConstructorVisitor visitor = new SqlConstructorVisitor(); + String sql = "ALTER TABLE " + table.name + " ADD " + //$NON-NLS-1$//$NON-NLS-2$ + column.accept(visitor, null); + if (!TextUtils.isEmpty(defaultValue)) + sql += " DEFAULT " + defaultValue; + database.execSQL(sql); + } catch (SQLiteException e) { + // ignored, column already exists + } + } + /** * Create table generation SQL * @param sql diff --git a/astrid/src/com/todoroo/astrid/service/StartupService.java b/astrid/src/com/todoroo/astrid/service/StartupService.java index 8b3c6732c..7b974ef1d 100644 --- a/astrid/src/com/todoroo/astrid/service/StartupService.java +++ b/astrid/src/com/todoroo/astrid/service/StartupService.java @@ -28,10 +28,12 @@ import android.widget.Toast; import com.crittercism.app.Crittercism; import com.timsu.astrid.R; +import com.todoroo.andlib.data.TodorooCursor; import com.todoroo.andlib.service.Autowired; import com.todoroo.andlib.service.ContextManager; import com.todoroo.andlib.service.DependencyInjectionService; import com.todoroo.andlib.service.ExceptionService; +import com.todoroo.andlib.sql.Query; import com.todoroo.andlib.utility.AndroidUtilities; import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.Preferences; @@ -42,6 +44,7 @@ import com.todoroo.astrid.backup.BackupConstants; import com.todoroo.astrid.backup.BackupService; import com.todoroo.astrid.backup.TasksXmlImporter; import com.todoroo.astrid.dao.Database; +import com.todoroo.astrid.data.Task; import com.todoroo.astrid.gtasks.GtasksPreferenceService; import com.todoroo.astrid.gtasks.sync.GtasksSyncService; import com.todoroo.astrid.opencrx.OpencrxCoreUtils; @@ -127,8 +130,9 @@ public class StartupService { try { database.openForWriting(); + checkForMissingColumns(); } catch (SQLiteException e) { - handleSQLiteColumnMissing(context, e); + handleSQLiteError(context, e); return; } @@ -251,15 +255,32 @@ public class StartupService { * @param context * @param e error that was raised */ - public static void handleSQLiteColumnMissing(Context context, final SQLiteException e) { + public static void handleSQLiteError(Context context, final SQLiteException e) { new AlertDialog.Builder(context) - .setTitle(R.string.DB_corrupted_title) - .setMessage(R.string.DB_corrupted_body) - .setPositiveButton(R.string.DLG_ok, null) - .create().show(); + .setTitle(R.string.DB_corrupted_title) + .setMessage(R.string.DB_corrupted_body) + .setPositiveButton(R.string.DLG_ok, null) + .create().show(); e.printStackTrace(); } + private void checkForMissingColumns() { + // For some reason these properties are missing for some users. + // Make them exist! + try { + TodorooCursor tasks = taskService.query(Query.select(Task.REMOTE_ID, Task.USER_ID, Task.USER).limit(1)); + try { + System.err.println(tasks.getCount()); + } finally { + tasks.close(); + } + } catch (SQLiteException e) { + database.tryAddColumn(Task.TABLE, Task.REMOTE_ID, "0"); //$NON-NLS-1$ + database.tryAddColumn(Task.TABLE, Task.USER_ID, "0"); //$NON-NLS-1$ + database.tryAddColumn(Task.TABLE, Task.USER, null); + } + } + /** * If database exists, no tasks but metadata, and a backup file exists, restore it */ diff --git a/astrid/src/com/todoroo/astrid/service/abtesting/ABTestEventReportingService.java b/astrid/src/com/todoroo/astrid/service/abtesting/ABTestEventReportingService.java index 19418fa1b..c59145fb4 100644 --- a/astrid/src/com/todoroo/astrid/service/abtesting/ABTestEventReportingService.java +++ b/astrid/src/com/todoroo/astrid/service/abtesting/ABTestEventReportingService.java @@ -14,6 +14,7 @@ import org.json.JSONObject; import android.content.Context; import android.database.sqlite.SQLiteException; +import android.os.Looper; import android.util.Log; import com.todoroo.andlib.data.TodorooCursor; @@ -66,11 +67,12 @@ public final class ABTestEventReportingService { new Thread(new Runnable() { @Override public void run() { + Looper.prepare(); // In case something goes wrong try { abTestEventDao.createRelativeDateEvents(); pushAllUnreportedABTestEvents(); } catch (SQLiteException e) { - StartupService.handleSQLiteColumnMissing(context, e); + StartupService.handleSQLiteError(context, e); } } }).start();