Configure database connections like Room

This commit is contained in:
AntsyLich
2026-10-02 10:23:07 +06:00
parent 01d302febd
commit 38e93086c8
@@ -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<ActivityManager>()?.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),
),
)
}