diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java index f3b140fe1..c53183901 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/provider/KeychainDatabase.java @@ -412,10 +412,38 @@ public class KeychainDatabase extends SQLiteOpenHelper { + ")"); case 24: - db.execSQL("DROP TABLE api_autocrypt_peers"); - db.execSQL(CREATE_API_AUTOCRYPT_PEERS); - db.execSQL("CREATE INDEX uids_by_email ON user_packets (email);"); + db.beginTransaction(); + db.execSQL("ALTER TABLE api_autocrypt_peers RENAME TO tmp"); + db.execSQL("CREATE TABLE api_autocrypt_peers (" + + "package_name TEXT NOT NULL, " + + "identifier TEXT NOT NULL, " + + "last_seen INTEGER, " + + "last_seen_key INTEGER NULL, " + + "is_mutual INTEGER NULL, " + + "master_key_id INTEGER NULL, " + + "gossip_master_key_id INTEGER NULL, " + + "gossip_last_seen_key INTEGER NULL, " + + "PRIMARY KEY(package_name, identifier), " + + "FOREIGN KEY(package_name) REFERENCES api_apps (package_name) ON DELETE CASCADE" + + ")"); + db.execSQL("INSERT INTO api_autocrypt_peers " + + "(package_name, identifier, last_seen, gossip_last_seen_key, gossip_master_key_id, is_mutual) " + + "SELECT package_name, identifier, last_updated, last_seen_key, master_key_id, 0 " + + "FROM tmp WHERE state IN (1,2)"); + db.execSQL("INSERT INTO api_autocrypt_peers " + + "(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"); + db.execSQL("INSERT INTO api_autocrypt_peers " + + "(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 " + + "FROM tmp WHERE state = 4"); + db.execSQL("DROP TABLE tmp"); + db.setTransactionSuccessful(); + db.endTransaction(); + 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);"); } }