diff --git a/api/src/com/todoroo/astrid/data/RemoteModel.java b/api/src/com/todoroo/astrid/data/RemoteModel.java index 7a2d3f8fc..4fe5f4b14 100644 --- a/api/src/com/todoroo/astrid/data/RemoteModel.java +++ b/api/src/com/todoroo/astrid/data/RemoteModel.java @@ -6,6 +6,7 @@ package com.todoroo.astrid.data; import com.todoroo.andlib.data.AbstractModel; +import com.todoroo.andlib.data.Property.BigIntegerProperty; import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.andlib.data.Property.StringProperty; @@ -46,4 +47,10 @@ abstract public class RemoteModel extends AbstractModel { /** pushed at date property name */ public static final LongProperty PUSHED_AT_PROPERTY = new LongProperty(null, PUSHED_AT_PROPERTY_NAME); + + /** new uuid property */ + public static final String UUID_PROPERTY_NAME = "uuid"; //$NON-NLS-1$ + + /** new uuid property */ + public static final BigIntegerProperty UUID_PROPERTY = new BigIntegerProperty(null, UUID_PROPERTY_NAME); } diff --git a/api/src/com/todoroo/astrid/data/TagData.java b/api/src/com/todoroo/astrid/data/TagData.java index 27f057907..237ab8624 100644 --- a/api/src/com/todoroo/astrid/data/TagData.java +++ b/api/src/com/todoroo/astrid/data/TagData.java @@ -11,6 +11,7 @@ import android.net.Uri; import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.Property; +import com.todoroo.andlib.data.Property.BigIntegerProperty; import com.todoroo.andlib.data.Property.IntegerProperty; import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.andlib.data.Property.StringProperty; @@ -125,6 +126,10 @@ public final class TagData extends RemoteModel { public static final LongProperty PUSHED_AT = new LongProperty( TABLE, PUSHED_AT_PROPERTY_NAME); + /** UUID */ + public static final BigIntegerProperty UUID = new BigIntegerProperty( + TABLE, UUID_PROPERTY_NAME); + /** List of all properties for this model */ public static final Property[] PROPERTIES = generateProperties(TagData.class); diff --git a/api/src/com/todoroo/astrid/data/Task.java b/api/src/com/todoroo/astrid/data/Task.java index 48745acea..e8d20e74b 100644 --- a/api/src/com/todoroo/astrid/data/Task.java +++ b/api/src/com/todoroo/astrid/data/Task.java @@ -14,6 +14,7 @@ import android.net.Uri; import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.Property; +import com.todoroo.andlib.data.Property.BigIntegerProperty; import com.todoroo.andlib.data.Property.IntegerProperty; import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.andlib.data.Property.StringProperty; @@ -170,6 +171,10 @@ public final class Task extends RemoteModel { public static final LongProperty PUSHED_AT = new LongProperty( TABLE, PUSHED_AT_PROPERTY_NAME); + /** UUID */ + public static final BigIntegerProperty UUID = new BigIntegerProperty( + TABLE, UUID_PROPERTY_NAME); + /** List of all properties for this model */ public static final Property[] PROPERTIES = generateProperties(Task.class); diff --git a/api/src/com/todoroo/astrid/data/Update.java b/api/src/com/todoroo/astrid/data/Update.java index 46fbd84ad..13b16f751 100644 --- a/api/src/com/todoroo/astrid/data/Update.java +++ b/api/src/com/todoroo/astrid/data/Update.java @@ -11,6 +11,7 @@ import android.net.Uri; import com.todoroo.andlib.data.AbstractModel; import com.todoroo.andlib.data.Property; +import com.todoroo.andlib.data.Property.BigIntegerProperty; import com.todoroo.andlib.data.Property.LongProperty; import com.todoroo.andlib.data.Property.StringProperty; import com.todoroo.andlib.data.Table; @@ -109,6 +110,10 @@ public class Update extends RemoteModel { public static final LongProperty PUSHED_AT = new LongProperty( TABLE, PUSHED_AT_PROPERTY_NAME); + /** UUID */ + public static final BigIntegerProperty UUID = new BigIntegerProperty( + TABLE, UUID_PROPERTY_NAME); + /** List of all properties for this model */ public static final Property[] PROPERTIES = generateProperties(Update.class); diff --git a/astrid/plugin-src/com/todoroo/astrid/tags/Astrid44SyncMigrator.java b/astrid/plugin-src/com/todoroo/astrid/tags/Astrid44SyncMigrator.java index b516c2f76..201bba580 100644 --- a/astrid/plugin-src/com/todoroo/astrid/tags/Astrid44SyncMigrator.java +++ b/astrid/plugin-src/com/todoroo/astrid/tags/Astrid44SyncMigrator.java @@ -1,5 +1,7 @@ package com.todoroo.astrid.tags; +import java.math.BigInteger; + import android.util.Log; import com.todoroo.andlib.data.DatabaseDao; @@ -74,13 +76,13 @@ public class Astrid44SyncMigrator { // -------------- // Then ensure that every remote model has a remote id, by generating one using the uuid generator for all those without one // -------------- - Query tagsWithoutUUIDQuery = Query.select(TagData.ID, TagData.REMOTE_ID).where(Criterion.or(TagData.REMOTE_ID.isNull(), TagData.REMOTE_ID.eq(0))); + Query tagsWithoutUUIDQuery = Query.select(TagData.ID, TagData.REMOTE_ID).where(Criterion.all); assertUUIDsExist(tagsWithoutUUIDQuery, new TagData(), tagDataDao); - Query tasksWithoutUUIDQuery = Query.select(Task.ID, Task.REMOTE_ID).where(Criterion.or(Task.REMOTE_ID.isNull(), Task.REMOTE_ID.eq(0))); + Query tasksWithoutUUIDQuery = Query.select(Task.ID, Task.REMOTE_ID).where(Criterion.all); assertUUIDsExist(tasksWithoutUUIDQuery, new Task(), taskDao); - Query updatesWithoutUUIDQuery = Query.select(Update.ID, Update.REMOTE_ID).where(Criterion.or(Update.REMOTE_ID.isNull(), Update.REMOTE_ID.eq(0))); + Query updatesWithoutUUIDQuery = Query.select(Update.ID, Update.REMOTE_ID).where(Criterion.all); assertUUIDsExist(updatesWithoutUUIDQuery, new Update(), updateDao); @@ -134,9 +136,13 @@ public class Astrid44SyncMigrator { try { for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { instance.readPropertiesFromCursor(cursor); - Pair uuidPair = UUIDHelper.newUUID(); - instance.setValue(RemoteModel.REMOTE_ID_PROPERTY, uuidPair.getLeft()); - instance.setValue(RemoteModel.PROOF_TEXT_PROPERTY, uuidPair.getRight()); + if (!instance.containsNonNullValue(RemoteModel.REMOTE_ID_PROPERTY)) { + Pair uuidPair = UUIDHelper.newUUID(); + instance.setValue(RemoteModel.REMOTE_ID_PROPERTY, uuidPair.getLeft()); + instance.setValue(RemoteModel.PROOF_TEXT_PROPERTY, uuidPair.getRight()); + } + // Migrate remote id to uuid field + instance.setValue(RemoteModel.UUID_PROPERTY, BigInteger.valueOf(instance.getValue(RemoteModel.REMOTE_ID_PROPERTY))); dao.saveExisting(instance); } } finally { diff --git a/astrid/src/com/todoroo/astrid/dao/Database.java b/astrid/src/com/todoroo/astrid/dao/Database.java index 8a01247de..e1bee13f0 100644 --- a/astrid/src/com/todoroo/astrid/dao/Database.java +++ b/astrid/src/com/todoroo/astrid/dao/Database.java @@ -340,13 +340,16 @@ public class Database extends AbstractDatabase { database.execSQL(createTableSql(visitor, TagOutstanding.TABLE.name, TagOutstanding.PROPERTIES)); database.execSQL(addColumnSql(Task.TABLE, Task.PROOF_TEXT, visitor, null)); + database.execSQL(addColumnSql(Task.TABLE, Task.PUSHED_AT, visitor, null)); + database.execSQL(addColumnSql(Task.TABLE, Task.UUID, visitor, null)); database.execSQL(addColumnSql(TagData.TABLE, TagData.PROOF_TEXT, visitor, null)); + database.execSQL(addColumnSql(TagData.TABLE, TagData.PUSHED_AT, visitor, null)); + database.execSQL(addColumnSql(TagData.TABLE, TagData.UUID, visitor, null)); database.execSQL(addColumnSql(Update.TABLE, Update.PROOF_TEXT, visitor, null)); + database.execSQL(addColumnSql(Update.TABLE, Update.PUSHED_AT, visitor, null)); + database.execSQL(addColumnSql(Update.TABLE, Update.UUID, visitor, null)); database.execSQL(addColumnSql(Metadata.TABLE, Metadata.DELETION_DATE, visitor, "0")); - database.execSQL(addColumnSql(Task.TABLE, Task.PUSHED_AT, visitor, null)); - database.execSQL(addColumnSql(TagData.TABLE, TagData.PUSHED_AT, visitor, null)); database.execSQL(addColumnSql(User.TABLE, User.PUSHED_AT, visitor, null)); - database.execSQL(addColumnSql(Update.TABLE, Update.PUSHED_AT, visitor, null)); } catch (SQLiteException e) { Log.e("astrid", "db-upgrade-" + oldVersion + "-" + newVersion, e); } diff --git a/tests-sync/src/com/todoroo/astrid/sync/Astrid44MigrationTest.java b/tests-sync/src/com/todoroo/astrid/sync/Astrid44MigrationTest.java index 2df6379fe..6251ed7d9 100644 --- a/tests-sync/src/com/todoroo/astrid/sync/Astrid44MigrationTest.java +++ b/tests-sync/src/com/todoroo/astrid/sync/Astrid44MigrationTest.java @@ -1,5 +1,7 @@ package com.todoroo.astrid.sync; +import java.math.BigInteger; + import android.text.TextUtils; import com.todoroo.andlib.data.Property; @@ -25,7 +27,7 @@ public class Astrid44MigrationTest extends NewSyncTestCase { public void testAstrid44Migration() { setupOldDatabase(); new Astrid44SyncMigrator().performMigration(); - assertAllModelsHaveRemoteId(); + assertAllModelsHaveUUID(); assertAllTagsHaveTagData(); assertAllMetadataHasAllFields(); } @@ -91,9 +93,9 @@ public class Astrid44MigrationTest extends NewSyncTestCase { // Task 5: Tag 5, New tag 2 } - private void assertAllModelsHaveRemoteId() { - assertRemoteIds(Task.TABLE, new Task(), taskDao, Task.ID, Task.REMOTE_ID); - assertRemoteIds(TagData.TABLE, new TagData(), tagDataDao, TagData.ID, TagData.REMOTE_ID); + private void assertAllModelsHaveUUID() { + assertRemoteIds(Task.TABLE, new Task(), taskDao, Task.ID, Task.UUID); + assertRemoteIds(TagData.TABLE, new TagData(), tagDataDao, TagData.ID, TagData.UUID); } private void assertRemoteIds(Table table, TYPE instance, RemoteModelDao dao, Property... properties) { @@ -102,9 +104,9 @@ public class Astrid44MigrationTest extends NewSyncTestCase { for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) { instance.clear(); instance.readPropertiesFromCursor(cursor); - Long remoteId = instance.getValue(RemoteModel.REMOTE_ID_PROPERTY); - if (remoteId == null || remoteId == 0) { - fail(instance.getClass().getName() + instance.getId() + " didn't have a remote id"); + BigInteger uuid = instance.getValue(RemoteModel.UUID_PROPERTY); + if (uuid == null || uuid.intValue() == 0) { + fail(instance.getClass().getName() + instance.getId() + " didn't have a uuid"); } } } finally {