From 6a1cde5797065cd059738614c4c103b920b6fc16 Mon Sep 17 00:00:00 2001 From: Vitor Hugo Schwaab Date: Wed, 25 Jan 2023 16:41:45 +0100 Subject: [PATCH 1/6] fix: don't recreate db on every migration when using SupportHelper --- .../java/net/zetetic/database/sqlcipher/SupportHelper.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java b/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java index 9d4d7f7..68a0f3d 100644 --- a/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java +++ b/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java @@ -11,8 +11,7 @@ public class SupportHelper implements SupportSQLiteOpenHelper { public SupportHelper(final Configuration configuration, byte[] password, SQLiteDatabaseHook hook, boolean enableWriteAheadLogging) { openHelper = new SQLiteOpenHelper(configuration.context, configuration.name, password, - null, configuration.callback.version, configuration.callback.version, - null, hook, enableWriteAheadLogging) { + null, configuration.callback.version, 0, null, hook, enableWriteAheadLogging) { @Override public void onCreate(SQLiteDatabase db) { configuration.callback.onCreate(db); From 47d46dd25f9e338ce8634e75535a5e64599975fd Mon Sep 17 00:00:00 2001 From: Vitor Hugo Schwaab Date: Wed, 25 Jan 2023 17:19:11 +0100 Subject: [PATCH 2/6] chore: keep compatibility with current published version --- .../database/sqlcipher/SupportHelper.java | 9 +++++++-- .../sqlcipher/SupportOpenHelperFactory.java | 17 ++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java b/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java index 68a0f3d..b1c0521 100644 --- a/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java +++ b/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java @@ -8,10 +8,15 @@ public class SupportHelper implements SupportSQLiteOpenHelper { private SQLiteOpenHelper openHelper; - public SupportHelper(final Configuration configuration, byte[] password, SQLiteDatabaseHook hook, + public Supporthelper(final Configuration configuration, byte[] password, SQLiteDatabaseHook hook, boolean enableWriteAheadLogging) { + this(configuration, password, hook, enableWriteAheadLogging, configuration.callback.version) + } + + public SupportHelper(final Configuration configuration, byte[] password, SQLiteDatabaseHook hook, + boolean enableWriteAheadLogging, int minimumSupportedVersion) { openHelper = new SQLiteOpenHelper(configuration.context, configuration.name, password, - null, configuration.callback.version, 0, null, hook, enableWriteAheadLogging) { + null, configuration.callback.version, minimumSupportedVersion, null, hook, enableWriteAheadLogging) { @Override public void onCreate(SQLiteDatabase db) { configuration.callback.onCreate(db); diff --git a/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportOpenHelperFactory.java b/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportOpenHelperFactory.java index b12bd93..3108293 100644 --- a/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportOpenHelperFactory.java +++ b/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportOpenHelperFactory.java @@ -5,23 +5,38 @@ public class SupportOpenHelperFactory implements SupportSQLiteOpenHelper.Factory { + private static final int UNCHANGED = -1; + private final byte[] password; private final SQLiteDatabaseHook hook; private final boolean enableWriteAheadLogging; + private final int minimumSupportedVersion = UNCHANGED; + public SupportOpenHelperFactory(byte[] password){ this(password, null, false); } public SupportOpenHelperFactory(byte[] password, SQLiteDatabaseHook hook, boolean enableWriteAheadLogging) { + this(password, hook, enableWriteAheadLogging, UNCHANGED) + } + + public SupportOpenHelperFactory(byte[] password, SQLiteDatabaseHook hook, + boolean enableWriteAheadLogging, int minimumSupportedVersion) { this.password = password; this.hook = hook; this.enableWriteAheadLogging = enableWriteAheadLogging; + this.minimumSupportedVersion = minimumSupportedVersion; } @NonNull @Override public SupportSQLiteOpenHelper create(@NonNull SupportSQLiteOpenHelper.Configuration configuration) { - return new SupportHelper(configuration, this.password, this.hook, enableWriteAheadLogging); + if (minimumSupportedVersion == UNCHANGED) { + return new SupportHelper(configuration, this.password, this.hook, enableWriteAheadLogging); + } else { + return new SupportHelper(configuration, this.password, this.hook, + enableWriteAheadLogging, minimumSupportedVersion); + } } } From a1f57803f20fbf834e36a38635486aab388ed86e Mon Sep 17 00:00:00 2001 From: Vitor Hugo Schwaab Date: Wed, 25 Jan 2023 17:33:09 +0100 Subject: [PATCH 3/6] fix: typo on `SupportHelper` --- .../main/java/net/zetetic/database/sqlcipher/SupportHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java b/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java index b1c0521..6f66dbd 100644 --- a/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java +++ b/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java @@ -8,7 +8,7 @@ public class SupportHelper implements SupportSQLiteOpenHelper { private SQLiteOpenHelper openHelper; - public Supporthelper(final Configuration configuration, byte[] password, SQLiteDatabaseHook hook, + public SupportHelper(final Configuration configuration, byte[] password, SQLiteDatabaseHook hook, boolean enableWriteAheadLogging) { this(configuration, password, hook, enableWriteAheadLogging, configuration.callback.version) } From f38c14512bc91bf9676d946ff3dc6cb7d9aecdf3 Mon Sep 17 00:00:00 2001 From: vitorhugods Date: Tue, 7 Feb 2023 19:31:35 -0300 Subject: [PATCH 4/6] fix: syntax errors --- .../java/net/zetetic/database/sqlcipher/SupportHelper.java | 2 +- .../zetetic/database/sqlcipher/SupportOpenHelperFactory.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java b/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java index 6f66dbd..d1156bd 100644 --- a/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java +++ b/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportHelper.java @@ -10,7 +10,7 @@ public class SupportHelper implements SupportSQLiteOpenHelper { public SupportHelper(final Configuration configuration, byte[] password, SQLiteDatabaseHook hook, boolean enableWriteAheadLogging) { - this(configuration, password, hook, enableWriteAheadLogging, configuration.callback.version) + this(configuration, password, hook, enableWriteAheadLogging, configuration.callback.version); } public SupportHelper(final Configuration configuration, byte[] password, SQLiteDatabaseHook hook, diff --git a/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportOpenHelperFactory.java b/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportOpenHelperFactory.java index 3108293..94e143e 100644 --- a/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportOpenHelperFactory.java +++ b/sqlcipher/src/main/java/net/zetetic/database/sqlcipher/SupportOpenHelperFactory.java @@ -11,14 +11,14 @@ public class SupportOpenHelperFactory implements SupportSQLiteOpenHelper.Factory private final SQLiteDatabaseHook hook; private final boolean enableWriteAheadLogging; - private final int minimumSupportedVersion = UNCHANGED; + private final int minimumSupportedVersion; public SupportOpenHelperFactory(byte[] password){ this(password, null, false); } public SupportOpenHelperFactory(byte[] password, SQLiteDatabaseHook hook, boolean enableWriteAheadLogging) { - this(password, hook, enableWriteAheadLogging, UNCHANGED) + this(password, hook, enableWriteAheadLogging, UNCHANGED); } public SupportOpenHelperFactory(byte[] password, SQLiteDatabaseHook hook, From 1b2b3ce2d10e97ff7ca37ee912af63da9b322428 Mon Sep 17 00:00:00 2001 From: vitorhugods Date: Tue, 7 Feb 2023 21:00:52 -0300 Subject: [PATCH 5/6] test: add tests covering SupportHelperTest --- .../sqlcipher_cts/SupportHelperTest.java | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 sqlcipher/src/androidTest/java/net/zetetic/database/sqlcipher_cts/SupportHelperTest.java diff --git a/sqlcipher/src/androidTest/java/net/zetetic/database/sqlcipher_cts/SupportHelperTest.java b/sqlcipher/src/androidTest/java/net/zetetic/database/sqlcipher_cts/SupportHelperTest.java new file mode 100644 index 0000000..75c5c70 --- /dev/null +++ b/sqlcipher/src/androidTest/java/net/zetetic/database/sqlcipher_cts/SupportHelperTest.java @@ -0,0 +1,105 @@ +package net.zetetic.database.sqlcipher_cts; + +import android.content.Context; +import androidx.annotation.CallSuper; +import androidx.annotation.NonNull; +import androidx.sqlite.db.SupportSQLiteDatabase; +import androidx.sqlite.db.SupportSQLiteOpenHelper; +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.platform.app.InstrumentationRegistry; +import net.zetetic.database.sqlcipher.SupportHelper; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.assertEquals; + +@RunWith(AndroidJUnit4.class) +public class SupportHelperTest { + + private static final String DATABASE_NAME = "DB-Test.db"; + private static final int CREATION_INDEX = 0; + private static final int UPGRADE_INDEX = 0; + + @Before + public void setup() { + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); + for (String databaseName : context.databaseList()) { + context.deleteDatabase(databaseName); + } + } + + @Test + public void shouldCreateDatabaseNormallyWithInitialVersion() { + FakeCallback callbackWrapper = new FakeCallback(1); + + SupportSQLiteOpenHelper.Configuration configuration = createConfiguration(callbackWrapper); + SupportHelper helper = new SupportHelper(configuration, null, null, true); + + helper.getWritableDatabase(); + helper.close(); + + assertEquals(1, callbackWrapper.callbackCount[CREATION_INDEX]); + assertEquals(1, callbackWrapper.callbackCount[UPGRADE_INDEX]); + } + + @Test + public void shouldRunUpgradeFromVersion1ToVersion2() { + FakeCallback initialCallback = new FakeCallback(1); + + SupportHelper initialHelper = new SupportHelper(createConfiguration(initialCallback), null, null, true); + + initialHelper.getWritableDatabase(); + initialHelper.close(); + + FakeCallback callbackWrapper = new FakeCallback(2); + + SupportHelper helper = new SupportHelper(createConfiguration(callbackWrapper), null, null, true); + + helper.getWritableDatabase(); + helper.close(); + + assertEquals(0, callbackWrapper.callbackCount[CREATION_INDEX]); + assertEquals(1, callbackWrapper.callbackCount[UPGRADE_INDEX]); + } + + private SupportSQLiteOpenHelper.Configuration createConfiguration(SupportSQLiteOpenHelper.Callback callback) { + Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); + return SupportSQLiteOpenHelper.Configuration.builder(context) + .name(DATABASE_NAME) + .callback(callback) + .build(); + } + + private static class FakeCallback extends SupportSQLiteOpenHelper.Callback { + public final int[] callbackCount = {0, 0}; + + public FakeCallback(int version) { + super(version); + } + + SupportSQLiteOpenHelper.Callback callback = new SupportSQLiteOpenHelper.Callback(version) { + @Override + public void onCreate(@NonNull SupportSQLiteDatabase db) { + callbackCount[CREATION_INDEX] += 1; + } + + @Override + public void onUpgrade(@NonNull SupportSQLiteDatabase db, int oldVersion, int newVersion) { + callbackCount[UPGRADE_INDEX] += 1; + } + }; + + @Override + @CallSuper + public void onCreate(@NonNull SupportSQLiteDatabase db) { + callback.onCreate(db); + } + + @Override + @CallSuper + public void onUpgrade(@NonNull SupportSQLiteDatabase db, int oldVersion, int newVersion) { + callback.onUpgrade(db, oldVersion, newVersion); + } + } +} From 314c15fd86f62d2e163646cfe8ce7d60e022cbb5 Mon Sep 17 00:00:00 2001 From: vitorhugods Date: Tue, 7 Feb 2023 21:12:15 -0300 Subject: [PATCH 6/6] test: use the new SupportHelper constructor --- .../net/zetetic/database/sqlcipher_cts/SupportHelperTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sqlcipher/src/androidTest/java/net/zetetic/database/sqlcipher_cts/SupportHelperTest.java b/sqlcipher/src/androidTest/java/net/zetetic/database/sqlcipher_cts/SupportHelperTest.java index 75c5c70..df136ca 100644 --- a/sqlcipher/src/androidTest/java/net/zetetic/database/sqlcipher_cts/SupportHelperTest.java +++ b/sqlcipher/src/androidTest/java/net/zetetic/database/sqlcipher_cts/SupportHelperTest.java @@ -54,7 +54,8 @@ public void shouldRunUpgradeFromVersion1ToVersion2() { FakeCallback callbackWrapper = new FakeCallback(2); - SupportHelper helper = new SupportHelper(createConfiguration(callbackWrapper), null, null, true); + // minSupportedVersion = 1 + SupportHelper helper = new SupportHelper(createConfiguration(callbackWrapper), null, null, true, 1); helper.getWritableDatabase(); helper.close();