summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Dmitry Dementyev <dementyev@google.com> 2019-03-19 16:17:16 -0700
committer Dmitry Dementyev <dementyev@google.com> 2019-03-22 16:17:28 -0700
commit08b5a41aaa259e70d7d79e7b754ab7846ee40341 (patch)
tree43afdd6cf1b1bc0b8f7d638aa072c10bbccb9d65
parenta39d8e9ee078dd2ccbc0379a04c5975422d91b91 (diff)
Handle Account Manager database downgrade.
Currenlty AM database downgrade causes crash loop in system service during boot. New behaivour is deleting old data and creating empty database. Downgrade shouldn't happen in production, but may affect developers who didn't wipe device data. Bug: 118399665 Test: manual Change-Id: I7882e9ba4e485c3874360aef9d21d849565879d2
-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);
+ }
+ }
+ }
}