diff options
| author | 2019-03-25 19:50:38 +0000 | |
|---|---|---|
| committer | 2019-03-25 19:50:38 +0000 | |
| commit | b8a61803ecdb11b9fcdeecc2f0d0b956f0d44cbd (patch) | |
| tree | 435afe67f53be8d17dcc159e8e59e7ffd820b4ac | |
| parent | d807ddf6a27a617b9fb3780dc958a6ed9362412a (diff) | |
| parent | 08b5a41aaa259e70d7d79e7b754ab7846ee40341 (diff) | |
Merge "Handle Account Manager database downgrade."
| -rw-r--r-- | services/core/java/com/android/server/accounts/AccountsDb.java | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/accounts/AccountsDb.java b/services/core/java/com/android/server/accounts/AccountsDb.java index 712edcced5da..da665906a70d 100644 --- a/services/core/java/com/android/server/accounts/AccountsDb.java +++ b/services/core/java/com/android/server/accounts/AccountsDb.java @@ -58,7 +58,6 @@ class AccountsDb implements AutoCloseable { private static final int CE_DATABASE_VERSION = 10; private static final int DE_DATABASE_VERSION = 3; // Added visibility support in O - static final String TABLE_ACCOUNTS = "accounts"; private static final String ACCOUNTS_ID = "_id"; private static final String ACCOUNTS_NAME = "name"; @@ -267,6 +266,13 @@ class AccountsDb implements AutoCloseable { } @Override + public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { + Log.e(TAG, "onDowngrade: recreate accounts CE table"); + resetDatabase(db); + onCreate(db); + } + + @Override public void onOpen(SQLiteDatabase db) { if (Log.isLoggable(TAG, Log.VERBOSE)) Log.v(TAG, "opened database " + CE_DATABASE_NAME); } @@ -616,6 +622,13 @@ class AccountsDb implements AutoCloseable { } } + @Override + public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { + Log.e(TAG, "onDowngrade: recreate accounts DE table"); + resetDatabase(db); + onCreate(db); + } + public SQLiteDatabase getReadableDatabaseUserIsUnlocked() { if(!mCeAttached) { Log.wtf(TAG, "getReadableDatabaseUserIsUnlocked called while user " + mUserId @@ -1399,4 +1412,26 @@ class AccountsDb implements AutoCloseable { return new AccountsDb(deDatabaseHelper, context, preNDatabaseFile); } + /** + * Removes all tables and triggers created by AccountManager. + */ + private static void resetDatabase(SQLiteDatabase db) { + try (Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type ='table'", null)) { + while (c.moveToNext()) { + String name = c.getString(0); + // Skip tables managed by SQLiteDatabase + if ("android_metadata".equals(name) || "sqlite_sequence".equals(name)) { + continue; + } + db.execSQL("DROP TABLE IF EXISTS " + name); + } + } + + try (Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type ='trigger'", null)) { + while (c.moveToNext()) { + String name = c.getString(0); + db.execSQL("DROP TRIGGER IF EXISTS " + name); + } + } + } } |