/**
*
*/
package org.commcare.android.database.app;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.Vector;
import net.sqlcipher.database.SQLiteDatabase;
import org.commcare.android.database.ConcreteDbHelper;
import org.commcare.android.database.DbHelper;
import org.commcare.android.database.SqlStorage;
import org.commcare.android.database.TableBuilder;
import org.commcare.android.database.app.models.ResourceModelUpdater;
import org.commcare.android.database.user.models.FormRecord;
import org.commcare.resources.model.Resource;
import org.commcare.resources.model.ResourceInstaller;
import org.commcare.resources.model.ResourceLocation;
import org.javarosa.core.services.storage.Persistable;
import org.javarosa.core.util.externalizable.DeserializationException;
import org.javarosa.core.util.externalizable.ExtUtil;
import org.javarosa.core.util.externalizable.ExtWrapList;
import org.javarosa.core.util.externalizable.ExtWrapTagged;
import org.javarosa.core.util.externalizable.PrototypeFactory;
import android.content.Context;
/**
* @author ctsims
*
*/
public class AppDatabaseUpgrader {
private Context c;
public AppDatabaseUpgrader(Context c) {
this.c = c;
}
public void upgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if(oldVersion == 1) {
if(upgradeOneTwo(db, oldVersion, newVersion)) {
oldVersion = 2;
}
}
if(oldVersion == 2) {
if(upgradeTwoThree(db)) {
oldVersion = 3;
}
}
if(oldVersion == 3) {
if(upgradeThreeFour(db)) {
oldVersion = 4;
}
}
//NOTE: If metadata changes are made to the Resource model, they need to be
//managed by changing the TwoThree updater to maintain that metadata.
}
private boolean upgradeTwoThree(SQLiteDatabase db) {
db.beginTransaction();
try {
TableBuilder builder = new TableBuilder("RECOVERY_RESOURCE_TABLE");
builder.addData(new Resource());
db.execSQL(builder.getTableCreateString());
db.setTransactionSuccessful();
return true;
} finally {
db.endTransaction();
}
}
private boolean upgradeOneTwo(SQLiteDatabase db, int oldVersion, int newVersion) {
db.beginTransaction();
try {
TableBuilder builder = new TableBuilder("RECOVERY_RESOURCE_TABLE");
builder.addData(new Resource());
db.execSQL(builder.getTableCreateString());
db.setTransactionSuccessful();
return true;
} finally {
db.endTransaction();
}
}
private boolean upgradeThreeFour(SQLiteDatabase db) {
DbHelper helper = new ConcreteDbHelper(c,db);
db.beginTransaction();
try {
db.execSQL("CREATE INDEX global_index_id ON GLOBAL_RESOURCE_TABLE ( " + Resource.META_INDEX_PARENT_GUID + " )");
db.execSQL("CREATE INDEX upgrade_index_id ON UPGRADE_RESOURCE_TABLE ( " + Resource.META_INDEX_PARENT_GUID + " )");
db.execSQL("CREATE INDEX recovery_index_id ON RECOVERY_RESOURCE_TABLE ( " + Resource.META_INDEX_PARENT_GUID + " )");
db.setTransactionSuccessful();
return true;
} finally {
db.endTransaction();
}
}
/**
* Reads and rewrites all of the records in a table, generally to adapt an old serialization format to a new
* format
*
* @param db
* @param storage
* @return
*/
private <T extends Persistable> void updateModels(SqlStorage<T> storage) {
for(T t : storage) {
storage.write(t);
}
}
}