Fix database bugs and make unit tests from previous commit pass

pull/14/head
Sam Bosley 12 years ago
parent 2917683bb8
commit 06f519f231

@ -226,6 +226,41 @@ public class DatabaseDao<TYPE extends AbstractModel> {
} }
} }
private interface DatabaseChangeOp {
public boolean makeChange();
}
private boolean insertOrUpdateAndRecordChanges(TYPE item, ContentValues values, DatabaseChangeOp op) {
boolean recordOutstanding = (outstandingTable != null);
final AtomicBoolean result = new AtomicBoolean(false);
if (recordOutstanding) { // begin transaction
database.getDatabase().beginTransactionWithListener(new SQLiteTransactionListener() {
@Override
public void onRollback() {
result.set(false);
}
@Override
public void onCommit() {/**/}
@Override
public void onBegin() {/**/}
});
}
try {
result.set(op.makeChange());
if(result.get()) {
if (recordOutstanding)
createOutstandingEntries(item.getId(), values); // Create entries for setValues in outstanding table
onModelUpdated(item);
item.markSaved();
}
} finally {
if (recordOutstanding) // commit transaction
database.getDatabase().endTransaction();
}
return result.get();
}
/** /**
* Creates the given item. * Creates the given item.
* *
@ -236,18 +271,22 @@ public class DatabaseDao<TYPE extends AbstractModel> {
* item model * item model
* @return returns true on success. * @return returns true on success.
*/ */
public boolean createNew(TYPE item) { public boolean createNew(final TYPE item) {
item.clearValue(AbstractModel.ID_PROPERTY); item.clearValue(AbstractModel.ID_PROPERTY);
DatabaseChangeOp insert = new DatabaseChangeOp() {
@Override
public boolean makeChange() {
long newRow = database.insert(table.name, long newRow = database.insert(table.name,
AbstractModel.ID_PROPERTY.name, item.getMergedValues()); AbstractModel.ID_PROPERTY.name, item.getMergedValues());
boolean result = newRow >= 0; boolean result = newRow >= 0;
if(result) { if (result)
item.setId(newRow); item.setId(newRow);
onModelUpdated(item);
item.markSaved();
}
return result; return result;
} }
};
return insertOrUpdateAndRecordChanges(item, item.getMergedValues(), insert);
}
/** /**
* Saves the given item. Will not create a new item! * Saves the given item. Will not create a new item!
@ -259,39 +298,18 @@ public class DatabaseDao<TYPE extends AbstractModel> {
* item model * item model
* @return returns true on success. * @return returns true on success.
*/ */
public boolean saveExisting(TYPE item) { public boolean saveExisting(final TYPE item) {
ContentValues values = item.getSetValues(); final ContentValues values = item.getSetValues();
if(values == null || values.size() == 0) // nothing changed if(values == null || values.size() == 0) // nothing changed
return true; return true;
boolean recordOutstanding = (outstandingTable != null); DatabaseChangeOp update = new DatabaseChangeOp() {
final AtomicBoolean result = new AtomicBoolean(false);
if (recordOutstanding) { // begin transaction
database.getDatabase().beginTransactionWithListener(new SQLiteTransactionListener() {
@Override @Override
public void onRollback() { public boolean makeChange() {
result.set(false); return database.update(table.name, values,
AbstractModel.ID_PROPERTY.eq(item.getId()).toString(), null) > 0;
} }
@Override };
public void onCommit() {/**/} return insertOrUpdateAndRecordChanges(item, values, update);
@Override
public void onBegin() {/**/}
});
}
try {
result.set(database.update(table.name, values,
AbstractModel.ID_PROPERTY.eq(item.getId()).toString(), null) > 0);
if(result.get()) {
if (recordOutstanding)
createOutstandingEntries(item.getId(), values); // Create entries for setValues in outstanding table
onModelUpdated(item);
item.markSaved();
}
} finally {
if (recordOutstanding) // commit transaction
database.getDatabase().endTransaction();
}
return result.get();
} }
private boolean createOutstandingEntries(long modelId, ContentValues modelSetValues) { private boolean createOutstandingEntries(long modelId, ContentValues modelSetValues) {

@ -1,12 +1,19 @@
package com.todoroo.astrid.dao; package com.todoroo.astrid.dao;
import com.todoroo.andlib.data.DatabaseDao; import com.todoroo.andlib.data.DatabaseDao;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.astrid.data.OutstandingEntry; import com.todoroo.astrid.data.OutstandingEntry;
public class OutstandingEntryDao<TYPE extends OutstandingEntry<?>> extends DatabaseDao<TYPE> { public class OutstandingEntryDao<TYPE extends OutstandingEntry<?>> extends DatabaseDao<TYPE> {
@Autowired
private Database database;
public OutstandingEntryDao(Class<TYPE> modelClass) { public OutstandingEntryDao(Class<TYPE> modelClass) {
super(modelClass); super(modelClass);
DependencyInjectionService.getInstance().inject(this);
setDatabase(database);
} }
} }

@ -31,7 +31,6 @@ public class TagDataDao extends RemoteModelDao<TagData> {
private static final String[] IGNORE_OUTSTANDING_COLUMNS = new String[] { private static final String[] IGNORE_OUTSTANDING_COLUMNS = new String[] {
TagData.MODIFICATION_DATE.name, TagData.MODIFICATION_DATE.name,
TagData.REMOTE_ID.name, TagData.REMOTE_ID.name,
TagData.PROOF_TEXT.name
}; };
@Override @Override

@ -321,7 +321,10 @@ public class TaskDao extends RemoteModelDao<Task> {
Task.DETAILS_DATE.name, Task.DETAILS_DATE.name,
Task.CALENDAR_URI.name, Task.CALENDAR_URI.name,
Task.REMOTE_ID.name, Task.REMOTE_ID.name,
Task.PROOF_TEXT.name Task.PUSHED_AT.name,
Task.LAST_SYNC.name,
Task.ESTIMATED_SECONDS.name,
Task.TIMER_START.name,
}; };
@Override @Override

@ -19,6 +19,7 @@ import com.todoroo.astrid.dao.Database;
import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.MetadataDao;
import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.dao.StoreObjectDao;
import com.todoroo.astrid.dao.TagDataDao; import com.todoroo.astrid.dao.TagDataDao;
import com.todoroo.astrid.dao.TagOutstandingDao;
import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskDao;
import com.todoroo.astrid.dao.TaskOutstandingDao; import com.todoroo.astrid.dao.TaskOutstandingDao;
import com.todoroo.astrid.dao.UpdateDao; import com.todoroo.astrid.dao.UpdateDao;
@ -74,7 +75,7 @@ public class AstridDependencyInjector extends AbstractDependencyInjector {
injectables.put("updateDao", UpdateDao.class); injectables.put("updateDao", UpdateDao.class);
injectables.put("userDao", UserDao.class); injectables.put("userDao", UserDao.class);
injectables.put("taskOutstandingDao", TaskOutstandingDao.class); injectables.put("taskOutstandingDao", TaskOutstandingDao.class);
injectables.put("tagOutstandingDao", TaskOutstandingDao.class); injectables.put("tagOutstandingDao", TagOutstandingDao.class);
// com.todoroo.astrid.service // com.todoroo.astrid.service
injectables.put("taskService", TaskService.class); injectables.put("taskService", TaskService.class);

Loading…
Cancel
Save