diff --git a/app/src/main/java/org/fdroid/fdroid/RepoUpdateManager.kt b/app/src/main/java/org/fdroid/fdroid/RepoUpdateManager.kt index 1ee1a7608..0b068617f 100644 --- a/app/src/main/java/org/fdroid/fdroid/RepoUpdateManager.kt +++ b/app/src/main/java/org/fdroid/fdroid/RepoUpdateManager.kt @@ -104,6 +104,7 @@ class RepoUpdateManager @JvmOverloads constructor( repoErrors.add(Pair(repo, result.e)) } } + db.getRepositoryDao().walCheckpoint() fdroidPrefs.lastUpdateCheck = System.currentTimeMillis() if (repoErrors.isNotEmpty()) showRepoErrors(repoErrors) if (reposUpdated) { @@ -136,6 +137,7 @@ class RepoUpdateManager @JvmOverloads constructor( } finally { notificationManager.cancelUpdateRepoNotification() _isUpdating.value = false + db.getRepositoryDao().walCheckpoint() } } diff --git a/libs/database/src/main/java/org/fdroid/database/AppPrefsDao.kt b/libs/database/src/main/java/org/fdroid/database/AppPrefsDao.kt index d6eb2e357..f878e1466 100644 --- a/libs/database/src/main/java/org/fdroid/database/AppPrefsDao.kt +++ b/libs/database/src/main/java/org/fdroid/database/AppPrefsDao.kt @@ -48,4 +48,5 @@ internal interface AppPrefsDaoInt : AppPrefsDao { @Insert(onConflict = REPLACE) override fun update(appPrefs: AppPrefs) + } diff --git a/libs/database/src/main/java/org/fdroid/database/RepositoryDao.kt b/libs/database/src/main/java/org/fdroid/database/RepositoryDao.kt index f467d398b..da14e125c 100644 --- a/libs/database/src/main/java/org/fdroid/database/RepositoryDao.kt +++ b/libs/database/src/main/java/org/fdroid/database/RepositoryDao.kt @@ -6,9 +6,12 @@ import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy.Companion.REPLACE import androidx.room.Query +import androidx.room.RawQuery import androidx.room.RewriteQueriesToDropUnusedColumns import androidx.room.Transaction import androidx.room.Update +import androidx.sqlite.db.SimpleSQLiteQuery +import androidx.sqlite.db.SupportSQLiteQuery import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.decodeFromJsonElement import org.fdroid.database.DbDiffUtils.diffAndUpdateListTable @@ -87,6 +90,14 @@ public interface RepositoryDao { * Removes all repos and their preferences. */ public fun clearAll() + + /** + * Force a checkpoint on the SQLite WAL such that the file size gets reduced. + * Blocks until concurrent reads have finished. + * Useful to call after large inserts (repo update) + * @see https://www.sqlite.org/wal.html#avoiding_excessively_large_wal_files + */ + public fun walCheckpoint() } @Dao @@ -527,4 +538,10 @@ internal interface RepositoryDaoInt : RepositoryDao { @Query("SELECT COUNT(*) FROM ${ReleaseChannel.TABLE}") fun countReleaseChannels(): Int + override fun walCheckpoint() { + rawCheckpoint(SimpleSQLiteQuery("pragma wal_checkpoint(truncate)")) + } + + @RawQuery + fun rawCheckpoint(supportSQLiteQuery: SupportSQLiteQuery): Int }