diff --git a/submodules/Postbox/Sources/StorageBox/StorageBox.swift b/submodules/Postbox/Sources/StorageBox/StorageBox.swift index aca2241b9a..b70f733cfa 100644 --- a/submodules/Postbox/Sources/StorageBox/StorageBox.swift +++ b/submodules/Postbox/Sources/StorageBox/StorageBox.swift @@ -766,17 +766,13 @@ public final class StorageBox { return allStats } - func remove(peerId: Int64?, contentTypes: [UInt8], excludeIds: [Data]) -> [Data] { + func remove(peerId: Int64?, contentTypes: [UInt8], includeIds: [Data], excludeIds: [Data]) -> [Data] { var resultIds: [Data] = [] self.valueBox.begin() var scannedIds: [Data: Data] = [:] - for contentType in contentTypes { - self.internalAddSize(contentType: contentType, delta: 0) - } - self.valueBox.scan(self.hashIdToInfoTable, values: { key, value in let info = ItemInfo(buffer: value) if !contentTypes.contains(info.contentType) { @@ -786,6 +782,10 @@ public final class StorageBox { return true }) + for id in includeIds { + scannedIds[md5Hash(id).data] = id + } + let excludeIds = Set(excludeIds) if let peerId = peerId { @@ -945,9 +945,9 @@ public final class StorageBox { } } - public func remove(peerId: PeerId?, contentTypes: [UInt8], excludeIds: [Data], completion: @escaping ([Data]) -> Void) { + public func remove(peerId: PeerId?, contentTypes: [UInt8], includeIds: [Data], excludeIds: [Data], completion: @escaping ([Data]) -> Void) { self.impl.with { impl in - let ids = impl.remove(peerId: peerId?.toInt64(), contentTypes: contentTypes, excludeIds: excludeIds) + let ids = impl.remove(peerId: peerId?.toInt64(), contentTypes: contentTypes, includeIds: includeIds, excludeIds: excludeIds) completion(ids) } } diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Resources/CollectCacheUsageStats.swift b/submodules/TelegramCore/Sources/TelegramEngine/Resources/CollectCacheUsageStats.swift index 8a8312fd0c..5f4b36260d 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Resources/CollectCacheUsageStats.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Resources/CollectCacheUsageStats.swift @@ -284,15 +284,26 @@ func _internal_renderStorageUsageStatsMessages(account: Account, stats: StorageU } } -func _internal_clearStorage(account: Account, peerId: EnginePeer.Id?, categories: [StorageUsageStats.CategoryKey], excludeMessages: [Message]) -> Signal { +func _internal_clearStorage(account: Account, peerId: EnginePeer.Id?, categories: [StorageUsageStats.CategoryKey], includeMessages: [Message], excludeMessages: [Message]) -> Signal { let mediaBox = account.postbox.mediaBox return Signal { subscriber in - var resourceIds = Set() + var includeResourceIds = Set() + for message in includeMessages { + extractMediaResourceIds(message: message, resourceIds: &includeResourceIds) + } + var includeIds: [Data] = [] + for resourceId in includeResourceIds { + if let data = resourceId.stringRepresentation.data(using: .utf8) { + includeIds.append(data) + } + } + + var excludeResourceIds = Set() for message in excludeMessages { - extractMediaResourceIds(message: message, resourceIds: &resourceIds) + extractMediaResourceIds(message: message, resourceIds: &excludeResourceIds) } var excludeIds: [Data] = [] - for resourceId in resourceIds { + for resourceId in excludeResourceIds { if let data = resourceId.stringRepresentation.data(using: .utf8) { excludeIds.append(data) } @@ -319,7 +330,7 @@ func _internal_clearStorage(account: Account, peerId: EnginePeer.Id?, categories } } - mediaBox.storageBox.remove(peerId: peerId, contentTypes: mappedContentTypes, excludeIds: excludeIds, completion: { ids in + mediaBox.storageBox.remove(peerId: peerId, contentTypes: mappedContentTypes, includeIds: includeIds, excludeIds: excludeIds, completion: { ids in var resourceIds: [MediaResourceId] = [] for id in ids { if let value = String(data: id, encoding: .utf8) { diff --git a/submodules/TelegramCore/Sources/TelegramEngine/Resources/TelegramEngineResources.swift b/submodules/TelegramCore/Sources/TelegramEngine/Resources/TelegramEngineResources.swift index 5da88dc13f..7f5d0bde23 100644 --- a/submodules/TelegramCore/Sources/TelegramEngine/Resources/TelegramEngineResources.swift +++ b/submodules/TelegramCore/Sources/TelegramEngine/Resources/TelegramEngineResources.swift @@ -233,8 +233,8 @@ public extension TelegramEngine { return _internal_renderStorageUsageStatsMessages(account: self.account, stats: stats, categories: categories, existingMessages: existingMessages) } - public func clearStorage(peerId: EnginePeer.Id?, categories: [StorageUsageStats.CategoryKey], excludeMessages: [Message]) -> Signal { - return _internal_clearStorage(account: self.account, peerId: peerId, categories: categories, excludeMessages: excludeMessages) + public func clearStorage(peerId: EnginePeer.Id?, categories: [StorageUsageStats.CategoryKey], includeMessages: [Message], excludeMessages: [Message]) -> Signal { + return _internal_clearStorage(account: self.account, peerId: peerId, categories: categories, includeMessages: includeMessages, excludeMessages: excludeMessages) } public func clearStorage(peerIds: Set, includeMessages: [Message], excludeMessages: [Message]) -> Signal { diff --git a/submodules/TelegramUI/Components/StorageUsageScreen/Sources/StorageUsageScreen.swift b/submodules/TelegramUI/Components/StorageUsageScreen/Sources/StorageUsageScreen.swift index 2f188c8162..c34773459a 100644 --- a/submodules/TelegramUI/Components/StorageUsageScreen/Sources/StorageUsageScreen.swift +++ b/submodules/TelegramUI/Components/StorageUsageScreen/Sources/StorageUsageScreen.swift @@ -2509,7 +2509,7 @@ final class StorageUsageScreenComponent: Component { self.isClearing = true self.state?.updated(transition: .immediate) - let _ = (component.context.engine.resources.clearStorage(peerId: peerId, categories: mappedCategories, excludeMessages: []) + let _ = (component.context.engine.resources.clearStorage(peerId: peerId, categories: mappedCategories, includeMessages: [], excludeMessages: []) |> deliverOnMainQueue).start(completed: { [weak self] in guard let self, let component = self.component, let currentStats = self.currentStats else { return