Forráskód Böngészése

Fix database corruption (#7042)

When using SQLDelight and Storio at the same time
Andreas 2 éve
szülő
commit
891406cc7f

+ 1 - 0
app/build.gradle.kts

@@ -152,6 +152,7 @@ dependencies {
     implementation(androidx.paging.runtime)
     implementation(androidx.paging.compose)
 
+    implementation(libs.sqldelight.sqlite)
     implementation(libs.sqldelight.android.driver)
     implementation(libs.sqldelight.coroutines)
     implementation(libs.sqldelight.android.paging)

+ 13 - 7
app/src/main/java/eu/kanade/tachiyomi/AppModule.kt

@@ -2,6 +2,8 @@ package eu.kanade.tachiyomi
 
 import android.app.Application
 import androidx.core.content.ContextCompat
+import androidx.sqlite.db.SupportSQLiteOpenHelper
+import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory
 import com.squareup.sqldelight.android.AndroidSqliteDriver
 import com.squareup.sqldelight.db.SqlDriver
 import data.History
@@ -34,15 +36,19 @@ class AppModule(val app: Application) : InjektModule {
     override fun InjektRegistrar.registerInjectables() {
         addSingleton(app)
 
-        addSingletonFactory { DbOpenCallback() }
+        // This is used to allow incremental migration from Storio
+        addSingletonFactory<SupportSQLiteOpenHelper> {
+            FrameworkSQLiteOpenHelperFactory().create(
+                SupportSQLiteOpenHelper.Configuration.builder(app)
+                    .callback(DbOpenCallback())
+                    .name(DbOpenCallback.DATABASE_NAME)
+                    .noBackupDirectory(false)
+                    .build()
+            )
+        }
 
         addSingletonFactory<SqlDriver> {
-            AndroidSqliteDriver(
-                schema = Database.Schema,
-                context = app,
-                name = DbOpenCallback.DATABASE_NAME,
-                callback = get<DbOpenCallback>()
-            )
+            AndroidSqliteDriver(openHelper = get())
         }
 
         addSingletonFactory {

+ 2 - 8
app/src/main/java/eu/kanade/tachiyomi/data/database/DatabaseHelper.kt

@@ -21,24 +21,18 @@ import eu.kanade.tachiyomi.data.database.queries.HistoryQueries
 import eu.kanade.tachiyomi.data.database.queries.MangaCategoryQueries
 import eu.kanade.tachiyomi.data.database.queries.MangaQueries
 import eu.kanade.tachiyomi.data.database.queries.TrackQueries
-import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory
 
 /**
  * This class provides operations to manage the database through its interfaces.
  */
 open class DatabaseHelper(
     context: Context,
-    callback: DbOpenCallback
+    openHelper: SupportSQLiteOpenHelper,
 ) :
     MangaQueries, ChapterQueries, TrackQueries, CategoryQueries, MangaCategoryQueries, HistoryQueries {
 
-    private val configuration = SupportSQLiteOpenHelper.Configuration.builder(context)
-        .name(DbOpenCallback.DATABASE_NAME)
-        .callback(callback)
-        .build()
-
     override val db = DefaultStorIOSQLite.builder()
-        .sqliteOpenHelper(RequerySQLiteOpenHelperFactory().create(configuration))
+        .sqliteOpenHelper(openHelper)
         .addTypeMapping(Manga::class.java, MangaTypeMapping())
         .addTypeMapping(Chapter::class.java, ChapterTypeMapping())
         .addTypeMapping(Track::class.java, TrackTypeMapping())

+ 10 - 5
app/src/main/java/eu/kanade/tachiyomi/data/database/DbOpenCallback.kt

@@ -4,6 +4,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase
 import androidx.sqlite.db.SupportSQLiteOpenHelper
 import com.squareup.sqldelight.android.AndroidSqliteDriver
 import eu.kanade.tachiyomi.Database
+import logcat.logcat
 
 class DbOpenCallback : SupportSQLiteOpenHelper.Callback(Database.Schema.version) {
 
@@ -15,15 +16,19 @@ class DbOpenCallback : SupportSQLiteOpenHelper.Callback(Database.Schema.version)
     }
 
     override fun onCreate(db: SupportSQLiteDatabase) {
+        logcat { "Creating new database" }
         Database.Schema.create(AndroidSqliteDriver(database = db, cacheSize = 1))
     }
 
     override fun onUpgrade(db: SupportSQLiteDatabase, oldVersion: Int, newVersion: Int) {
-        Database.Schema.migrate(
-            driver = AndroidSqliteDriver(database = db, cacheSize = 1),
-            oldVersion = oldVersion,
-            newVersion = newVersion
-        )
+        if (oldVersion < newVersion) {
+            logcat { "Upgrading database from $oldVersion to $newVersion" }
+            Database.Schema.migrate(
+                driver = AndroidSqliteDriver(database = db, cacheSize = 1),
+                oldVersion = oldVersion,
+                newVersion = newVersion
+            )
+        }
     }
 
     override fun onConfigure(db: SupportSQLiteDatabase) {

+ 1 - 0
gradle/libs.versions.toml

@@ -92,6 +92,7 @@ shizuku-provider = { module = "dev.rikka.shizuku:provider", version.ref = "shizu
 leakcanary-android = { module = "com.squareup.leakcanary:leakcanary-android", version.ref ="leakcanary" }
 leakcanary-plumber = { module = "com.squareup.leakcanary:plumber-android", version.ref ="leakcanary" }
 
+sqldelight-sqlite = { module = "androidx.sqlite:sqlite-framework", version.ref ="sqldelight" }
 sqldelight-android-driver = { module = "com.squareup.sqldelight:android-driver", version.ref ="sqldelight" }
 sqldelight-coroutines = { module = "com.squareup.sqldelight:coroutines-extensions-jvm", version.ref ="sqldelight" }
 sqldelight-android-paging = { module = "com.squareup.sqldelight:android-paging3-extensions", version.ref ="sqldelight" }