From 38e93086c8d62f98ed676b1c3e47d2a78c9376a4 Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Thu, 1 Oct 2026 05:35:00 +0600 Subject: [PATCH] Configure database connections like Room --- .../java/tachiyomi/data/DatabaseBindings.kt | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/data/src/main/java/tachiyomi/data/DatabaseBindings.kt b/data/src/main/java/tachiyomi/data/DatabaseBindings.kt index e84037e6a..667442866 100644 --- a/data/src/main/java/tachiyomi/data/DatabaseBindings.kt +++ b/data/src/main/java/tachiyomi/data/DatabaseBindings.kt @@ -1,12 +1,20 @@ package tachiyomi.data +import android.app.ActivityManager import android.content.Context +import androidx.core.content.getSystemService +import androidx.sqlite.SQLiteConnection +import androidx.sqlite.SQLiteDriver import androidx.sqlite.driver.bundled.BundledSQLiteDriver +import androidx.sqlite.execSQL import app.cash.sqldelight.db.SqlDriver +import com.eygraber.sqldelight.androidx.driver.AndroidxSqliteConcurrencyModel.MultipleReadersSingleWriter import com.eygraber.sqldelight.androidx.driver.AndroidxSqliteConfiguration +import com.eygraber.sqldelight.androidx.driver.AndroidxSqliteConnectionFactory import com.eygraber.sqldelight.androidx.driver.AndroidxSqliteDatabaseType import com.eygraber.sqldelight.androidx.driver.AndroidxSqliteDriver import com.eygraber.sqldelight.androidx.driver.FileProvider +import com.eygraber.sqldelight.androidx.driver.SqliteJournalMode import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.BindingContainer import dev.zacsweers.metro.ContributesTo @@ -17,15 +25,30 @@ import dev.zacsweers.metro.SingleIn @BindingContainer object DatabaseBindings { + /** + * Configured like Room's connection manager: WAL unless the device is low on RAM, one writer with four + * readers (one in TRUNCATE mode), and a busy timeout on every connection. + */ @Provides @SingleIn(AppScope::class) fun providesSqlDriver(context: Context): SqlDriver { + val isWal = context.getSystemService()?.isLowRamDevice ?: true return AndroidxSqliteDriver( - driver = BundledSQLiteDriver(), + connectionFactory = object : AndroidxSqliteConnectionFactory { + override val driver: SQLiteDriver = BundledSQLiteDriver() + + override fun createConnection(name: String): SQLiteConnection { + return driver.open(name).apply { + execSQL("PRAGMA busy_timeout = 3000") + } + } + }, databaseType = AndroidxSqliteDatabaseType.FileProvider(context, "tachiyomi.db"), schema = Database.Schema, configuration = AndroidxSqliteConfiguration( isForeignKeyConstraintsEnabled = true, + journalMode = if (isWal) SqliteJournalMode.WAL else SqliteJournalMode.Truncate, + concurrencyModel = MultipleReadersSingleWriter(isWal = isWal, nonWalCount = 1, walCount = 4), ), ) }