Improve migration mechanism

This commit is contained in:
Vincent Breitmoser
2018-01-30 11:20:23 +01:00
parent ca8835420d
commit eb241a30d7

View File

@@ -24,6 +24,7 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import android.content.Context; import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteOpenHelper;
@@ -413,44 +414,47 @@ public class KeychainDatabase extends SQLiteOpenHelper {
+ ")"); + ")");
case 24: case 24:
db.beginTransaction(); try {
db.execSQL("ALTER TABLE api_autocrypt_peers RENAME TO tmp"); db.beginTransaction();
db.execSQL("CREATE TABLE api_autocrypt_peers (" db.execSQL("ALTER TABLE api_autocrypt_peers RENAME TO tmp");
+ "package_name TEXT NOT NULL, " db.execSQL("CREATE TABLE api_autocrypt_peers ("
+ "identifier TEXT NOT NULL, " + "package_name TEXT NOT NULL, "
+ "last_seen INTEGER, " + "identifier TEXT NOT NULL, "
+ "last_seen_key INTEGER, " + "last_seen INTEGER, "
+ "is_mutual INTEGER, " + "last_seen_key INTEGER, "
+ "master_key_id INTEGER, " + "is_mutual INTEGER, "
+ "gossip_master_key_id INTEGER, " + "master_key_id INTEGER, "
+ "gossip_last_seen_key INTEGER, " + "gossip_master_key_id INTEGER, "
+ "gossip_origin INTEGER, " + "gossip_last_seen_key INTEGER, "
+ "PRIMARY KEY(package_name, identifier), " + "gossip_origin INTEGER, "
+ "FOREIGN KEY(package_name) REFERENCES api_apps (package_name) ON DELETE CASCADE" + "PRIMARY KEY(package_name, identifier), "
+ ")"); + "FOREIGN KEY(package_name) REFERENCES api_apps (package_name) ON DELETE CASCADE"
// Note: Keys from Autocrypt 0.X with state == "reset" (0) are dropped + ")");
db.execSQL("INSERT INTO api_autocrypt_peers " + // Note: Keys from Autocrypt 0.X with state == "reset" (0) are dropped
"(package_name, identifier, last_seen, gossip_last_seen_key, gossip_master_key_id, gossip_origin) " + db.execSQL("INSERT INTO api_autocrypt_peers " +
"SELECT package_name, identifier, last_updated, last_seen_key, master_key_id, 0 " + "(package_name, identifier, last_seen, gossip_last_seen_key, gossip_master_key_id, gossip_origin) " +
"FROM tmp WHERE state = 1"); // Autocrypt 0.X, "gossip" -> now origin=autocrypt "SELECT package_name, identifier, last_updated, last_seen_key, master_key_id, 0 " +
db.execSQL("INSERT INTO api_autocrypt_peers " + "FROM tmp WHERE state = 1"); // Autocrypt 0.X, "gossip" -> now origin=autocrypt
"(package_name, identifier, last_seen, gossip_last_seen_key, gossip_master_key_id, gossip_origin) " + db.execSQL("INSERT INTO api_autocrypt_peers " +
"SELECT package_name, identifier, last_updated, last_seen_key, master_key_id, 20 " + "(package_name, identifier, last_seen, gossip_last_seen_key, gossip_master_key_id, gossip_origin) " +
"FROM tmp WHERE state = 2"); // "selected" keys -> now origin=dedup "SELECT package_name, identifier, last_updated, last_seen_key, master_key_id, 20 " +
db.execSQL("INSERT INTO api_autocrypt_peers " + "FROM tmp WHERE state = 2"); // "selected" keys -> now origin=dedup
"(package_name, identifier, last_seen, last_seen_key, master_key_id, is_mutual) " + db.execSQL("INSERT INTO api_autocrypt_peers " +
"SELECT package_name, identifier, last_updated, last_seen_key, master_key_id, 0 " + "(package_name, identifier, last_seen, last_seen_key, master_key_id, is_mutual) " +
"SELECT package_name, identifier, last_updated, last_seen_key, master_key_id, 0 " +
"FROM tmp WHERE state = 3"); // Autocrypt 0.X, state = "available" "FROM tmp WHERE state = 3"); // Autocrypt 0.X, state = "available"
db.execSQL("INSERT INTO api_autocrypt_peers " + db.execSQL("INSERT INTO api_autocrypt_peers " +
"(package_name, identifier, last_seen, last_seen_key, master_key_id, is_mutual) " + "(package_name, identifier, last_seen, last_seen_key, master_key_id, is_mutual) " +
"SELECT package_name, identifier, last_updated, last_seen_key, master_key_id, 1 " + "SELECT package_name, identifier, last_updated, last_seen_key, master_key_id, 1 " +
"FROM tmp WHERE state = 4"); // from Autocrypt 0.X, state = "mutual" "FROM tmp WHERE state = 4"); // from Autocrypt 0.X, state = "mutual"
db.execSQL("DROP TABLE tmp"); db.execSQL("DROP TABLE tmp");
db.setTransactionSuccessful(); db.setTransactionSuccessful();
db.endTransaction(); } finally {
db.endTransaction();
}
db.execSQL("CREATE INDEX IF NOT EXISTS uids_by_email ON user_packets (email);");
db.execSQL("DROP INDEX keys_by_rank"); db.execSQL("DROP INDEX keys_by_rank");
db.execSQL("CREATE INDEX uids_by_email ON user_packets (email);");
db.execSQL("CREATE INDEX keys_by_rank ON keys(rank, master_key_id);"); db.execSQL("CREATE INDEX keys_by_rank ON keys(rank, master_key_id);");
} }
} }