Cherry pick some code for migration to using uuids

pull/14/head
Sam Bosley 12 years ago
parent ce7aba15cf
commit 978fe02718

@ -164,7 +164,7 @@ public abstract class AbstractModel implements Parcelable, Cloneable {
/**
* Reads all properties from the supplied cursor and store
*/
protected synchronized void readPropertiesFromCursor(TodorooCursor<? extends AbstractModel> cursor) {
public synchronized void readPropertiesFromCursor(TodorooCursor<? extends AbstractModel> cursor) {
if (values == null)
values = new ContentValues();

@ -0,0 +1,100 @@
package com.todoroo.astrid.tags;
import android.util.Log;
import com.todoroo.andlib.data.DatabaseDao;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.Pair;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.dao.UpdateDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.data.Task;
import com.todoroo.astrid.data.Update;
import com.todoroo.astrid.helper.UUIDHelper;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.utility.Constants;
public class Astrid44SyncMigrator {
@Autowired private MetadataService metadataService;
@Autowired private TagDataService tagDataService;
@Autowired private TagDataDao tagDataDao;
@Autowired private TaskDao taskDao;
@Autowired private UpdateDao updateDao;
private static final String PREF_MIGRATED_TASKS_TO_TAGS = "tasks_to_tags_migration"; //$NON-NLS-1$
public Astrid44SyncMigrator() {
DependencyInjectionService.getInstance().inject(this);
}
@SuppressWarnings("nls")
public void migrateTagMetadataToTable() {
if (Preferences.getBoolean(PREF_MIGRATED_TASKS_TO_TAGS, false))
return;
// --------------
// First assert that a TagData object exists for each tag metadata
// --------------
Query noTagDataQuery = Query.select(Metadata.PROPERTIES).where(Criterion.and(
MetadataCriteria.withKey(TagService.KEY),
Criterion.not(TagService.TAG.in(Query.select(TagData.NAME).from(TagData.TABLE))))).groupBy(TagService.TAG);
TodorooCursor<Metadata> noTagData = metadataService.query(noTagDataQuery);
try {
Metadata tag = new Metadata();
for (noTagData.moveToFirst(); !noTagData.isAfterLast(); noTagData.moveToNext()) {
tag.readFromCursor(noTagData);
if (Constants.DEBUG)
Log.w("tag-link-migrate", "CREATING TAG DATA " + tag.getValue(TagService.TAG));
TagData newTagData = new TagData();
newTagData.setValue(TagData.NAME, tag.getValue(TagService.TAG));
tagDataService.save(newTagData);
}
} finally {
noTagData.close();
}
// --------------
// Then assert 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)));
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)));
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)));
assertUUIDsExist(updatesWithoutUUIDQuery, new Update(), updateDao);
Preferences.setBoolean(PREF_MIGRATED_TASKS_TO_TAGS, true);
}
private <TYPE extends RemoteModel> void assertUUIDsExist(Query query, TYPE instance, DatabaseDao<TYPE> dao) {
TodorooCursor<TYPE> cursor = dao.query(query);
try {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
instance.readPropertiesFromCursor(cursor);
Pair<Long, String> uuidPair = UUIDHelper.newUUID();
instance.setValue(RemoteModel.REMOTE_ID_PROPERTY, uuidPair.getLeft());
instance.setValue(RemoteModel.PROOF_TEXT_PROPERTY, uuidPair.getRight());
dao.saveExisting(instance);
}
} finally {
cursor.close();
}
}
}

@ -448,6 +448,7 @@ public final class TagService {
return renameHelper(oldTag, newTag, true);
}
@Deprecated
private int renameHelper(String oldTag, String newTag, boolean caseSensitive) {
// First remove newTag from all tasks that have both oldTag and newTag.
MetadataService metadataService = PluginServices.getMetadataService();

@ -1,59 +0,0 @@
package com.todoroo.astrid.tags;
import android.util.Log;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.Preferences;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.TagData;
import com.todoroo.astrid.service.MetadataService;
import com.todoroo.astrid.service.TagDataService;
import com.todoroo.astrid.utility.Constants;
public class TagsTableMigrator {
@Autowired private MetadataService metadataService;
@Autowired private TagDataService tagDataService;
private static final String PREF_MIGRATED_TASKS_TO_TAGS = "tasks_to_tags_migration"; //$NON-NLS-1$
public TagsTableMigrator() {
DependencyInjectionService.getInstance().inject(this);
}
@SuppressWarnings("nls")
public void migrateTagMetadataToTable() {
if (Preferences.getBoolean(PREF_MIGRATED_TASKS_TO_TAGS, false))
return;
// First assert that a TagData object exists for each tag metadata
Query noTagDataQuery = Query.select(Metadata.PROPERTIES).where(Criterion.and(
MetadataCriteria.withKey(TagService.KEY),
Criterion.not(TagService.TAG.in(Query.select(TagData.NAME).from(TagData.TABLE))))).groupBy(TagService.TAG);
TodorooCursor<Metadata> noTagData = metadataService.query(noTagDataQuery);
try {
Metadata tag = new Metadata();
for (noTagData.moveToFirst(); !noTagData.isAfterLast(); noTagData.moveToNext()) {
tag.readFromCursor(noTagData);
if (Constants.DEBUG)
Log.w("tag-link-migrate", "CREATING TAG DATA " + tag.getValue(TagService.TAG));
TagData newTagData = new TagData();
newTagData.setValue(TagData.NAME, tag.getValue(TagService.TAG));
tagDataService.save(newTagData);
}
} finally {
noTagData.close();
}
Preferences.setBoolean(PREF_MIGRATED_TASKS_TO_TAGS, true);
}
}

@ -42,7 +42,7 @@ import com.todoroo.astrid.notes.NoteMetadata;
import com.todoroo.astrid.producteev.sync.ProducteevDataService;
import com.todoroo.astrid.service.abtesting.ABChooser;
import com.todoroo.astrid.tags.TagCaseMigrator;
import com.todoroo.astrid.tags.TagsTableMigrator;
import com.todoroo.astrid.tags.Astrid44SyncMigrator;
import com.todoroo.astrid.utility.AstridPreferences;
@ -198,7 +198,7 @@ public final class UpgradeService {
new DueDateTimeMigrator().migrateDueTimes();
if (from < V4_4_0)
new TagsTableMigrator().migrateTagMetadataToTable();
new Astrid44SyncMigrator().migrateTagMetadataToTable();
} finally {
DialogUtilities.dismissDialog((Activity)context, dialog);

Loading…
Cancel
Save