package org.commcare.models.legacy; import org.commcare.modern.database.DatabaseHelper; import org.commcare.modern.models.EncryptedModel; import org.javarosa.core.services.storage.IMetaData; import org.javarosa.core.services.storage.Persistable; import java.util.HashSet; import java.util.Vector; /** * @author ctsims */ public class LegacyTableBuilder { private final String name; private final Vector<String> cols; private final Vector<String> rawCols; public LegacyTableBuilder(String name) { this.name = name; cols = new Vector<>(); rawCols = new Vector<>(); } public void addData(Persistable p) { cols.add(DatabaseHelper.ID_COL + " INTEGER PRIMARY KEY"); rawCols.add(DatabaseHelper.ID_COL); if (p instanceof IMetaData) { String[] keys = ((IMetaData)p).getMetaDataFields(); for (String key : keys) { String columnName = scrubName(key); rawCols.add(columnName); String columnDef; if (p instanceof EncryptedModel && ((EncryptedModel)p).isEncrypted(key)) { columnDef = columnName + " BLOB"; } else { columnDef = columnName; } //Modifiers if (unique.contains(columnName)) { columnDef += " UNIQUE"; } cols.add(columnDef); } } cols.add(DatabaseHelper.DATA_COL + " BLOB"); rawCols.add(DatabaseHelper.DATA_COL); } private final HashSet<String> unique = new HashSet<>(); public void setUnique(String columnName) { unique.add(scrubName(columnName)); } public String getTableCreateString() { String built = "CREATE TABLE " + scrubName(name) + " ("; for (int i = 0; i < cols.size(); ++i) { built += cols.elementAt(i); if (i < cols.size() - 1) { built += ","; } } built += ");"; return built; } public static String scrubName(String input) { //Scrub return input.replace("-", "_"); } public String getColumns() { String columns = ""; for (int i = 0; i < rawCols.size(); ++i) { columns += rawCols.elementAt(i); if (i < rawCols.size() - 1) { columns += ","; } } return columns; } }