summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/accounts/AccountsDb.java37
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);
+ }
+ }
+ }
}