Remove sync and export cursors

pull/189/head
Alex Baker 10 years ago
parent 328877a2d6
commit 8299b1aa0e

@ -95,6 +95,10 @@ public class DatabaseDao<TYPE extends AbstractModel> {
return result;
}
public void query(Query query, Callback<TYPE> callback) {
query(callback, query);
}
public void query(Callback<TYPE> callback, Query query) {
TodorooCursor<TYPE> cursor = query(query);
try {

@ -22,7 +22,6 @@ import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.data.Metadata;
import com.todoroo.astrid.data.TagData;
@ -214,19 +213,18 @@ public class TasksXmlExporter {
}
private synchronized void serializeMetadata(Task task) throws IOException {
TodorooCursor<Metadata> cursor = metadataDao.query(Query.select(
Metadata.PROPERTIES).where(MetadataCriteria.byTask(task.getId())));
try {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
Metadata metadata = new Metadata(cursor);
xml.startTag(null, BackupConstants.METADATA_TAG);
serializeModel(metadata, Metadata.PROPERTIES, Metadata.ID, Metadata.TASK);
xml.endTag(null, BackupConstants.METADATA_TAG);
metadataDao.byTask(task.getId(), new Callback<Metadata>() {
@Override
public void apply(Metadata metadata) {
try {
xml.startTag(null, BackupConstants.METADATA_TAG);
serializeModel(metadata, Metadata.PROPERTIES, Metadata.ID, Metadata.TASK);
xml.endTag(null, BackupConstants.METADATA_TAG);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
} finally {
cursor.close();
}
});
}
/**

@ -75,6 +75,10 @@ public class MetadataDao extends DatabaseDao<Metadata> {
Metadata.TASK.eq(Task.ID))).where(Task.TITLE.isNull())));
}
public void byTask(long taskId, Callback<Metadata> callback) {
query(callback, Query.select(Metadata.PROPERTIES).where(Metadata.TASK.eq(taskId)));
}
public void byTaskAndKey(long taskId, String key, Callback<Metadata> callback) {
query(callback, Query.select(Metadata.PROPERTIES).where(
Criterion.and(Metadata.TASK.eq(taskId), Metadata.KEY.eq(key))));

@ -8,7 +8,7 @@ package com.todoroo.astrid.gtasks;
import android.text.TextUtils;
import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Callback;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Field;
import com.todoroo.andlib.sql.Functions;
@ -45,10 +45,6 @@ public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskC
super(taskDao, metadataDao);
}
public Criterion getLocalMatchCriteria(GtasksTaskContainer remoteTask) {
return GtasksMetadata.ID.eq(remoteTask.gtaskMetadata.getValue(GtasksMetadata.ID));
}
@Override
public String getMetadataKey() {
return GtasksMetadata.METADATA_KEY;
@ -58,35 +54,23 @@ public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskC
if(remoteTask.task.getId() != Task.NO_ID) {
return;
}
TodorooCursor<Metadata> cursor = metadataDao.query(Query.select(Metadata.PROPERTIES).
where(Criterion.and(MetadataCriteria.withKey(getMetadataKey()),
getLocalMatchCriteria(remoteTask))));
try {
if(cursor.getCount() == 0) {
return;
}
cursor.moveToFirst();
remoteTask.task.setId(cursor.get(Metadata.TASK));
Metadata metadata = getMetadataByGtaskId(remoteTask.gtaskMetadata.getValue(GtasksMetadata.ID));
if (metadata != null) {
remoteTask.task.setId(metadata.getValue(Metadata.TASK));
remoteTask.task.setUuid(taskDao.uuidFromLocalId(remoteTask.task.getId()));
remoteTask.gtaskMetadata = new Metadata(cursor);
} finally {
cursor.close();
remoteTask.gtaskMetadata = metadata;
}
}
public long localIdForGtasksId(String gtasksId) {
TodorooCursor<Metadata> metadata = metadataDao.query(Query.select(Metadata.TASK).where(
Criterion.and(Metadata.KEY.eq(GtasksMetadata.METADATA_KEY), GtasksMetadata.ID.eq(gtasksId))));
try {
if (metadata.getCount() > 0) {
metadata.moveToFirst();
return (new Metadata(metadata).getTask());
} else {
return AbstractModel.NO_ID;
}
} finally {
metadata.close();
}
Metadata metadata = getMetadataByGtaskId(gtasksId);
return metadata == null ? AbstractModel.NO_ID : metadata.getTask();
}
private Metadata getMetadataByGtaskId(String gtaskId) {
return metadataDao.getFirst(Query.select(Metadata.PROPERTIES).where(Criterion.and(
Metadata.KEY.eq(getMetadataKey()),
GtasksMetadata.ID.eq(gtaskId))));
}
// --- list iterating helpers
@ -96,7 +80,7 @@ public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskC
iterateThroughList(listId, iterator, 0, false);
}
public void iterateThroughList(String listId, OrderedListIterator iterator, long startAtOrder, boolean reverse) {
private void iterateThroughList(String listId, final OrderedListIterator iterator, long startAtOrder, boolean reverse) {
Field orderField = Functions.cast(GtasksMetadata.ORDER, "LONG");
Order order = reverse ? Order.desc(orderField) : Order.asc(orderField);
Criterion startAtCriterion = reverse ? Functions.cast(GtasksMetadata.ORDER, "LONG").lt(startAtOrder) :
@ -107,20 +91,17 @@ public final class GtasksMetadataService extends SyncMetadataService<GtasksTaskC
GtasksMetadata.LIST_ID.eq(listId),
startAtCriterion)).
orderBy(order);
TodorooCursor<Metadata> cursor = metadataDao.query(query);
try {
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
long taskId = cursor.get(Metadata.TASK);
metadataDao.query(query, new Callback<Metadata>() {
@Override
public void apply(Metadata entry) {
long taskId = entry.getValue(Metadata.TASK);
Metadata metadata = getTaskMetadata(taskId);
if(metadata == null) {
continue;
if(metadata != null) {
iterator.processTask(taskId, metadata);
}
iterator.processTask(taskId, metadata);
}
} finally {
cursor.close();
}
});
}
/**

@ -7,7 +7,7 @@ package com.todoroo.astrid.utility;
import android.content.ContentValues;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.data.Callback;
import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria;
@ -17,6 +17,7 @@ import com.todoroo.astrid.sync.SyncContainer;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
abstract public class SyncMetadataService<TYPE extends SyncContainer> {
@ -56,17 +57,8 @@ abstract public class SyncMetadataService<TYPE extends SyncContainer> {
* @return null if no metadata found
*/
public Metadata getTaskMetadata(long taskId) {
TodorooCursor<Metadata> cursor = metadataDao.query(Query.select(Metadata.PROPERTIES).where(
return metadataDao.getFirst(Query.select(Metadata.PROPERTIES).where(
MetadataCriteria.byTaskAndwithKey(taskId, getMetadataKey())));
try {
if(cursor.getCount() == 0) {
return null;
}
cursor.moveToFirst();
return new Metadata(cursor);
} finally {
cursor.close();
}
}
/**
@ -79,19 +71,16 @@ abstract public class SyncMetadataService<TYPE extends SyncContainer> {
* @param metadataKey metadata key
*/
private void synchronizeMetadata(long taskId, ArrayList<Metadata> metadata, String metadataKey) {
HashSet<ContentValues> newMetadataValues = new HashSet<>();
final Set<ContentValues> newMetadataValues = new HashSet<>();
for(Metadata metadatum : metadata) {
metadatum.setTask(taskId);
metadatum.clearValue(Metadata.ID);
newMetadataValues.add(metadatum.getMergedValues());
}
TodorooCursor<Metadata> cursor = metadataDao.query(Query.select(Metadata.PROPERTIES).where(
MetadataCriteria.byTaskAndwithKey(taskId, metadataKey)));
try {
// try to find matches within our metadata list
for(cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
Metadata item = new Metadata(cursor);
metadataDao.byTaskAndKey(taskId, metadataKey, new Callback<Metadata>() {
@Override
public void apply(Metadata item) {
long id = item.getId();
// clear item id when matching with incoming values
@ -99,15 +88,12 @@ abstract public class SyncMetadataService<TYPE extends SyncContainer> {
ContentValues itemMergedValues = item.getMergedValues();
if(newMetadataValues.contains(itemMergedValues)) {
newMetadataValues.remove(itemMergedValues);
continue;
} else {
// not matched. cut it
metadataDao.delete(id);
}
// not matched. cut it
metadataDao.delete(id);
}
} finally {
cursor.close();
}
});
// everything that remains shall be written
for(ContentValues values : newMetadataValues) {

Loading…
Cancel
Save