diff --git a/normalized-cache-sqlite/src/commonMain/kotlin/com/apollographql/cache/normalized/sql/SqlNormalizedCache.kt b/normalized-cache-sqlite/src/commonMain/kotlin/com/apollographql/cache/normalized/sql/SqlNormalizedCache.kt index 131f7b72..f08166c0 100644 --- a/normalized-cache-sqlite/src/commonMain/kotlin/com/apollographql/cache/normalized/sql/SqlNormalizedCache.kt +++ b/normalized-cache-sqlite/src/commonMain/kotlin/com/apollographql/cache/normalized/sql/SqlNormalizedCache.kt @@ -35,7 +35,12 @@ class SqlNormalizedCache internal constructor( } override fun clearAll() { - recordDatabase.deleteAllRecords() + try { + recordDatabase.deleteAllRecords() + } catch (e: Exception) { + // Unable to clear the records from the database, it is possibly corrupted + apolloExceptionHandler(Exception("Unable to clear records from the database", e)) + } } override fun remove(cacheKey: CacheKey, cascade: Boolean): Boolean { @@ -43,8 +48,14 @@ class SqlNormalizedCache internal constructor( } override fun remove(cacheKeys: Collection, cascade: Boolean): Int { - return recordDatabase.transaction { - internalDeleteRecords(cacheKeys.map { it.key }, cascade) + return try { + recordDatabase.transaction { + internalDeleteRecords(cacheKeys.map { it.key }, cascade) + } + } catch (e: Exception) { + // Unable to delete the records from the database, it is possibly corrupted + apolloExceptionHandler(Exception("Unable to delete records from the database", e)) + 0 } } @@ -133,14 +144,20 @@ class SqlNormalizedCache internal constructor( } override fun trim(maxSizeBytes: Long, trimFactor: Float): Long { - val size = recordDatabase.databaseSize() - return if (size >= maxSizeBytes) { - val count = recordDatabase.count().executeAsOne() - recordDatabase.trimByUpdatedDate((count * trimFactor).toLong()) - recordDatabase.vacuum() - recordDatabase.databaseSize() - } else { - size + try { + val size = recordDatabase.databaseSize() + return if (size >= maxSizeBytes) { + val count = recordDatabase.count().executeAsOne() + recordDatabase.trimByUpdatedDate((count * trimFactor).toLong()) + recordDatabase.vacuum() + recordDatabase.databaseSize() + } else { + size + } + } catch (e: Exception) { + // Unable to trim the records from the database, it is possibly corrupted + apolloExceptionHandler(Exception("Unable to trim records from the database", e)) + return -1 } } } diff --git a/normalized-cache/api/normalized-cache.api b/normalized-cache/api/normalized-cache.api index 96a57074..eb488c13 100644 --- a/normalized-cache/api/normalized-cache.api +++ b/normalized-cache/api/normalized-cache.api @@ -500,14 +500,15 @@ public abstract interface class com/apollographql/cache/normalized/api/Normalize public abstract fun clearAll ()V public abstract fun merge (Lcom/apollographql/cache/normalized/api/Record;Lcom/apollographql/cache/normalized/api/CacheHeaders;Lcom/apollographql/cache/normalized/api/RecordMerger;)Ljava/util/Set; public abstract fun merge (Ljava/util/Collection;Lcom/apollographql/cache/normalized/api/CacheHeaders;Lcom/apollographql/cache/normalized/api/RecordMerger;)Ljava/util/Set; - public static fun prettifyDump (Ljava/util/Map;)Ljava/lang/String; + public static fun prettifyDump (Ljava/util/Map;Z)Ljava/lang/String; public abstract fun remove (Ljava/util/Collection;Z)I public abstract fun remove-eNSUWrY (Ljava/lang/String;Z)Z public abstract fun trim (JF)J } public final class com/apollographql/cache/normalized/api/NormalizedCache$Companion { - public final fun prettifyDump (Ljava/util/Map;)Ljava/lang/String; + public final fun prettifyDump (Ljava/util/Map;Z)Ljava/lang/String; + public static synthetic fun prettifyDump$default (Lcom/apollographql/cache/normalized/api/NormalizedCache$Companion;Ljava/util/Map;ZILjava/lang/Object;)Ljava/lang/String; } public final class com/apollographql/cache/normalized/api/NormalizedCache$DefaultImpls { diff --git a/normalized-cache/api/normalized-cache.klib.api b/normalized-cache/api/normalized-cache.klib.api index 7e6f5709..d403ff21 100644 --- a/normalized-cache/api/normalized-cache.klib.api +++ b/normalized-cache/api/normalized-cache.klib.api @@ -62,7 +62,7 @@ abstract interface com.apollographql.cache.normalized.api/NormalizedCache : com. open fun trim(kotlin/Long, kotlin/Float = ...): kotlin/Long // com.apollographql.cache.normalized.api/NormalizedCache.trim|trim(kotlin.Long;kotlin.Float){}[0] final object Companion { // com.apollographql.cache.normalized.api/NormalizedCache.Companion|null[0] - final fun prettifyDump(kotlin.collections/Map, kotlin.collections/Map>): kotlin/String // com.apollographql.cache.normalized.api/NormalizedCache.Companion.prettifyDump|prettifyDump(kotlin.collections.Map,kotlin.collections.Map>){}[0] + final fun prettifyDump(kotlin.collections/Map, kotlin.collections/Map>, kotlin/Boolean = ...): kotlin/String // com.apollographql.cache.normalized.api/NormalizedCache.Companion.prettifyDump|prettifyDump(kotlin.collections.Map,kotlin.collections.Map>;kotlin.Boolean){}[0] } } diff --git a/normalized-cache/src/commonMain/kotlin/com/apollographql/cache/normalized/api/NormalizedCache.kt b/normalized-cache/src/commonMain/kotlin/com/apollographql/cache/normalized/api/NormalizedCache.kt index cfcf1387..e97721cc 100644 --- a/normalized-cache/src/commonMain/kotlin/com/apollographql/cache/normalized/api/NormalizedCache.kt +++ b/normalized-cache/src/commonMain/kotlin/com/apollographql/cache/normalized/api/NormalizedCache.kt @@ -86,23 +86,28 @@ interface NormalizedCache : ReadOnlyNormalizedCache { companion object { @JvmStatic - fun prettifyDump(dump: Map<@JvmSuppressWildcards KClass<*>, Map>): String = dump.prettifyDump() + fun prettifyDump(dump: Map<@JvmSuppressWildcards KClass<*>, Map>, showMetadata: Boolean = false): String = + dump.prettifyDump(showMetadata = showMetadata) - private fun Any?.prettifyDump(level: Int = 0): String { + private fun Any?.prettifyDump(level: Int = 0, showMetadata: Boolean): String { return buildString { when (this@prettifyDump) { is Record -> { - append("{\n") - indent(level + 1) - append("fields: ") - append(fields.prettifyDump(level + 1)) - append("\n") - indent(level + 1) - append("metadata: ") - append(metadata.prettifyDump(level + 1)) - append("\n") - indent(level) - append("}") + if (showMetadata) { + append("{\n") + indent(level + 1) + append("fields: ") + append(fields.prettifyDump(level + 1, showMetadata)) + append("\n") + indent(level + 1) + append("metadata: ") + append(metadata.prettifyDump(level + 1, showMetadata)) + append("\n") + indent(level) + append("}") + } else { + append(fields.prettifyDump(level, showMetadata)) + } } is List<*> -> { @@ -111,7 +116,7 @@ interface NormalizedCache : ReadOnlyNormalizedCache { append("\n") for (value in this@prettifyDump) { indent(level + 1) - append(value.prettifyDump(level + 1)) + append(value.prettifyDump(level + 1, showMetadata)) append("\n") } indent(level) @@ -132,7 +137,7 @@ interface NormalizedCache : ReadOnlyNormalizedCache { } ) append(": ") - append(value.prettifyDump(level + 1)) + append(value.prettifyDump(level + 1, showMetadata)) append("\n") } indent(level)