Correct handling of journal mode changes

Bug: 287126569

The SQLite database configuration is updated in a three-step process:
 1. Identify the aspects that have changed by comparing the input
    configuration to the stored configuration.
 2. Update the stored configuration.
 3. Apply the stored configuration for every aspect that changed.

The journal mode and sync mode did not follow this process.  Both
tried to identify a change to the aspect after step 2, which means
that it always detected a "no change" case (after step 2, the stored
configuration is identical to the input configuration).

This change computes the "journal mode changed" flag and the "sync
mode changed" before step 2.

Test: atest
 * CtsDatabaseTestCases
 * FrameworksCoreTests:android.database.sqlite

Change-Id: I64fb7867c2572ba9dc527335f56b93497f047c09
This commit is contained in:
Lee Shombert
2023-06-15 16:28:52 -07:00
parent 3bd2ba44f3
commit 0431ae7689

View File

@@ -580,6 +580,10 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen
final int oldSize = mConfiguration.perConnectionSql.size();
final int newSize = configuration.perConnectionSql.size();
boolean perConnectionSqlChanged = newSize > oldSize;
boolean journalModeChanged = !configuration.resolveJournalMode().equalsIgnoreCase(
mConfiguration.resolveJournalMode());
boolean syncModeChanged =
!configuration.resolveSyncMode().equalsIgnoreCase(mConfiguration.resolveSyncMode());
// Update configuration parameters.
mConfiguration.updateParametersFrom(configuration);
@@ -591,14 +595,10 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen
setForeignKeyModeFromConfiguration();
}
boolean journalModeChanged = !configuration.resolveJournalMode().equalsIgnoreCase(
mConfiguration.resolveJournalMode());
if (journalModeChanged) {
setJournalFromConfiguration();
}
boolean syncModeChanged =
!configuration.resolveSyncMode().equalsIgnoreCase(mConfiguration.resolveSyncMode());
if (syncModeChanged) {
setSyncModeFromConfiguration();
}