package org.wikipedia.readinglist.page.database.disk; import android.support.annotation.NonNull; import org.wikipedia.database.DatabaseClient; import org.wikipedia.database.async.AsyncDao; import java.util.Collection; public class DiskRowDao<Dat, Row extends DiskRow<Dat>> extends AsyncDao<DiskStatus, Dat, Row> { public DiskRowDao(@NonNull DatabaseClient<Row> client) { super(client); } public synchronized void markOnline(@NonNull Row row) { Row query = queryPrimaryKey(row); switch (query == null ? DiskStatus.SAVED : query.status()) { case SAVED: case OUTDATED: case DELETED: resetTransaction(row, DiskStatus.UNSAVED); break; case ONLINE: case UNSAVED: break; default: throw new RuntimeException("status=" + row.status()); } } public synchronized void markOutdated(@NonNull Row row) { Row query = queryPrimaryKey(row); switch (query == null ? DiskStatus.ONLINE : query.status()) { case ONLINE: case SAVED: case UNSAVED: case DELETED: resetTransaction(row, DiskStatus.OUTDATED); break; case OUTDATED: break; default: throw new RuntimeException("status=" + row.status()); } } public synchronized void markDeleted(@NonNull Row row) { Row query = queryPrimaryKey(row); switch (query == null ? DiskStatus.DELETED : query.status()) { case ONLINE: case SAVED: case OUTDATED: case UNSAVED: resetTransaction(row, DiskStatus.DELETED); break; case DELETED: break; default: throw new RuntimeException("status=" + row.status()); } } @Override public synchronized boolean completeTransaction(@NonNull Row row, long timestamp) { if (super.completeTransaction(row, timestamp)) { if (row.status() == DiskStatus.DELETED) { delete(row); } else { upsert(row); } return true; } return false; } @Override public synchronized void clear() { final String selection = null; final String[] selectionArgs = null; Collection<Row> rows = query(selection, selectionArgs); for (Row row : rows) { delete(row); } } }