/**
*
*/
package org.commcare.android.database.user;
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.user.models.ACase;
import org.commcare.android.database.user.models.FormRecord;
import org.commcare.cases.ledger.Ledger;
import android.content.Context;
/**
* @author ctsims
*
*/
public class UserDatabaseUpgrader {
boolean inSenseMode = false;
Context c;
public UserDatabaseUpgrader(Context c, boolean inSenseMode) {
this.inSenseMode = inSenseMode;
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, newVersion)) {
oldVersion = 3;
}
}
if(oldVersion == 3) {
if(upgradeThreeFour(db, oldVersion, newVersion)) {
oldVersion = 4;
}
}
if(oldVersion == 4) {
if(upgradeFourFive(db, oldVersion, newVersion)) {
oldVersion = 5;
}
}
}
private boolean upgradeOneTwo(final SQLiteDatabase db, int oldVersion, int newVersion) {
db.beginTransaction();
try {
markSenseIncompleteUnsent(db);
db.setTransactionSuccessful();
return true;
} finally {
db.endTransaction();
}
}
private boolean upgradeTwoThree(final SQLiteDatabase db, int oldVersion, int newVersion) {
db.beginTransaction();
try {
markSenseIncompleteUnsent(db);
db.setTransactionSuccessful();
return true;
} finally {
db.endTransaction();
}
}
private boolean upgradeThreeFour(SQLiteDatabase db, int oldVersion, int newVersion) {
db.beginTransaction();
try {
addStockTable(db);
updateIndexes(db);
db.setTransactionSuccessful();
return true;
} finally {
db.endTransaction();
}
}
private boolean upgradeFourFive(SQLiteDatabase db, int oldVersion, int newVersion) {
db.beginTransaction();
try {
db.execSQL("CREATE INDEX ledger_entity_id ON ledger (entity_id)");
db.setTransactionSuccessful();
return true;
} finally {
db.endTransaction();
}
}
private void updateIndexes(SQLiteDatabase db) {
db.execSQL("CREATE INDEX case_id_index ON AndroidCase (case_id)");
db.execSQL("CREATE INDEX case_type_index ON AndroidCase (case_type)");
db.execSQL("CREATE INDEX case_status_index ON AndroidCase (case_status)");
}
private void addStockTable(SQLiteDatabase db) {
TableBuilder builder = new TableBuilder(Ledger.STORAGE_KEY);
builder.addData(new Ledger());
builder.setUnique(Ledger.INDEX_ENTITY_ID);
db.execSQL(builder.getTableCreateString());
}
private void markSenseIncompleteUnsent(final SQLiteDatabase db) {
//Fix for Bug in 2.7.0/1, forms in sense mode weren't being properly marked as complete after entry.
if(inSenseMode) {
//Get form record storage
SqlStorage<FormRecord> storage = new SqlStorage<FormRecord>(FormRecord.STORAGE_KEY, FormRecord.class,new ConcreteDbHelper(c,db));
//Iterate through all forms currently saved
for(FormRecord record : storage) {
//Update forms marked as incomplete with the appropriate status
if(FormRecord.STATUS_INCOMPLETE.equals(record.getStatus())) {
//update to complete to process/send.
storage.write(record.updateStatus(record.getInstanceURI().toString(), FormRecord.STATUS_COMPLETE));
}
}
}
}
}