diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/LogDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/LogDatabase.kt index 2b192abf7..620777c1f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/LogDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/LogDatabase.kt @@ -8,6 +8,7 @@ import net.zetetic.database.sqlcipher.SQLiteDatabase import net.zetetic.database.sqlcipher.SQLiteOpenHelper import org.signal.core.util.CursorUtil import org.signal.core.util.SqlUtil +import org.signal.core.util.getTableRowCount import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.crypto.DatabaseSecret import org.thoughtcrime.securesms.crypto.DatabaseSecretProvider @@ -16,6 +17,7 @@ import org.thoughtcrime.securesms.util.ByteUnit import org.thoughtcrime.securesms.util.Stopwatch import java.io.Closeable import java.util.concurrent.TimeUnit +import kotlin.math.abs /** * Stores logs. @@ -164,7 +166,13 @@ class LogDatabase private constructor( stopwatch.split("keepers-size") if (remainingSize <= 0) { - writableDatabase.delete(TABLE_NAME, "$KEEP_LONGER = ?", arrayOf("0")) + if (abs(remainingSize) > MAX_FILE_SIZE / 2) { + // Not only are KEEP_LONGER logs putting us over the storage limit, it's doing it by a lot! Delete half. + val logCount = readableDatabase.getTableRowCount(TABLE_NAME) + writableDatabase.execSQL("DELETE FROM $TABLE_NAME WHERE $ID < (SELECT MAX($ID) FROM (SELECT $ID FROM $TABLE_NAME LIMIT ${logCount / 2}))") + } else { + writableDatabase.delete(TABLE_NAME, "$KEEP_LONGER = ?", arrayOf("0")) + } return } diff --git a/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt b/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt new file mode 100644 index 000000000..c7176cf58 --- /dev/null +++ b/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt @@ -0,0 +1,13 @@ +package org.signal.core.util + +import androidx.sqlite.db.SupportSQLiteDatabase + +fun SupportSQLiteDatabase.getTableRowCount(table: String): Int { + return this.query("SELECT COUNT(*) FROM $table").use { + if (it.moveToFirst()) { + it.getInt(0) + } else { + 0 + } + } +} \ No newline at end of file