package org.commcare.models.database;
import android.database.Cursor;
import org.commcare.modern.database.DatabaseHelper;
import org.javarosa.core.services.storage.Persistable;
import java.io.FileNotFoundException;
import java.io.InputStream;
/**
* Iterator for storage layer that uses filesystem to store payload.
*
* @author Phillip Mates (pmates@gmail.com)
*/
public class HybridFileBackedStorageIterator<T extends Persistable>
extends SqlStorageIterator<T> {
/**
* Creates an iterator into either a full or partial sql storage.
*
* @param c The uninitialized cursor for a query.
* @param storage The storage being queried
*/
public HybridFileBackedStorageIterator(Cursor c,
HybridFileBackedSqlStorage<T> storage) {
super(c, storage, null);
}
@Override
public T nextRecord() {
byte[] blob =
c.getBlob(c.getColumnIndexOrThrow(DatabaseHelper.DATA_COL));
if (blob != null) {
return storage.newObject(blob, nextID());
} else {
String filename =
c.getString(c.getColumnIndexOrThrow(DatabaseHelper.FILE_COL));
byte[] aesKeyBlob =
c.getBlob(c.getColumnIndexOrThrow(DatabaseHelper.AES_COL));
try {
InputStream fileInputStream =
((HybridFileBackedSqlStorage<T>)storage).getInputStreamFromFile(filename, aesKeyBlob);
return storage.newObject(fileInputStream, nextID());
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
}
}